From 25f8283edda8fcbbf0784d6860d901036cf06b46 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 12 Oct 2023 20:48:03 +0500 Subject: [PATCH 001/144] added getting the config from the cloud service --- client/CMakeLists.txt | 4 +- client/amnezia_application.cpp | 15 +- client/amnezia_application.h | 2 + client/configurators/cloak_configurator.cpp | 2 +- client/configurators/ikev2_configurator.cpp | 2 +- client/configurators/openvpn_configurator.cpp | 2 +- client/configurators/openvpn_configurator.h | 4 +- .../shadowsocks_configurator.cpp | 2 +- .../configurators/wireguard_configurator.cpp | 2 +- client/containers/containers_defs.cpp | 2 +- .../serverController.cpp} | 4 +- .../serverController.h} | 4 +- client/core/errorstrings.cpp | 2 +- client/protocols/openvpnprotocol.cpp | 2 +- client/protocols/protocols_defs.h | 8 +- client/translations/amneziavpn_ru.ts | 142 ++++++++++------- client/translations/amneziavpn_zh_CN.ts | 146 +++++++++++------- client/ui/controllers/cloudController.cpp | 109 +++++++++++++ client/ui/controllers/cloudController.h | 43 ++++++ .../ui/controllers/connectionController.cpp | 1 + client/ui/controllers/importController.cpp | 10 +- client/ui/controllers/installController.cpp | 2 +- client/ui/models/containers_model.cpp | 2 +- client/ui/models/servers_model.cpp | 13 ++ client/ui/models/servers_model.h | 3 + client/ui/qml/Components/ConnectButton.qml | 4 + client/vpnconnection.cpp | 6 +- 27 files changed, 399 insertions(+), 139 deletions(-) rename client/core/{servercontroller.cpp => controllers/serverController.cpp} (99%) rename client/core/{servercontroller.h => controllers/serverController.h} (98%) create mode 100644 client/ui/controllers/cloudController.cpp create mode 100644 client/ui/controllers/cloudController.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index cc1922683..004b64f90 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -108,7 +108,7 @@ set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/core/errorstrings.h ${CMAKE_CURRENT_LIST_DIR}/core/scripts_registry.h ${CMAKE_CURRENT_LIST_DIR}/core/server_defs.h - ${CMAKE_CURRENT_LIST_DIR}/core/servercontroller.h + ${CMAKE_CURRENT_LIST_DIR}/core/controllers/serverController.h ${CMAKE_CURRENT_LIST_DIR}/protocols/protocols_defs.h ${CMAKE_CURRENT_LIST_DIR}/protocols/qml_register_protocols.h ${CMAKE_CURRENT_LIST_DIR}/ui/notificationhandler.h @@ -147,7 +147,7 @@ set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/core/errorstrings.cpp ${CMAKE_CURRENT_LIST_DIR}/core/scripts_registry.cpp ${CMAKE_CURRENT_LIST_DIR}/core/server_defs.cpp - ${CMAKE_CURRENT_LIST_DIR}/core/servercontroller.cpp + ${CMAKE_CURRENT_LIST_DIR}/core/controllers/serverController.cpp ${CMAKE_CURRENT_LIST_DIR}/protocols/protocols_defs.cpp ${CMAKE_CURRENT_LIST_DIR}/ui/notificationhandler.cpp ${CMAKE_CURRENT_LIST_DIR}/ui/qautostart.cpp diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index d8039d9b2..cb1512cc5 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -139,7 +139,8 @@ void AmneziaApplication::init() &ConnectionController::openConnection); connect(m_notificationHandler.get(), &NotificationHandler::disconnectRequested, m_connectionController.get(), &ConnectionController::closeConnection); - connect(this, &AmneziaApplication::translationsUpdated, m_notificationHandler.get(), &NotificationHandler::onTranslationsUpdated); + connect(this, &AmneziaApplication::translationsUpdated, m_notificationHandler.get(), + &NotificationHandler::onTranslationsUpdated); m_engine->load(url); m_systemController->setQmlRoot(m_engine->rootObjects().value(0)); @@ -226,14 +227,13 @@ void AmneziaApplication::loadTranslator() updateTranslator(locale); } - void AmneziaApplication::updateTranslator(const QLocale &locale) { if (!m_translator->isEmpty()) { QCoreApplication::removeTranslator(m_translator.get()); } - QString strFileName = QString(":/translations/amneziavpn")+QLatin1String("_")+locale.name()+".qm"; + QString strFileName = QString(":/translations/amneziavpn") + QLatin1String("_") + locale.name() + ".qm"; if (m_translator->load(strFileName)) { if (QCoreApplication::installTranslator(m_translator.get())) { m_settings->setAppLanguage(locale); @@ -330,7 +330,8 @@ void AmneziaApplication::initControllers() m_connectionController.reset(new ConnectionController(m_serversModel, m_containersModel, m_vpnConnection)); m_engine->rootContext()->setContextProperty("ConnectionController", m_connectionController.get()); - connect(this, &AmneziaApplication::translationsUpdated, m_connectionController.get(), &ConnectionController::onTranslationsUpdated); + connect(this, &AmneziaApplication::translationsUpdated, m_connectionController.get(), + &ConnectionController::onTranslationsUpdated); m_pageController.reset(new PageController(m_serversModel, m_settings)); m_engine->rootContext()->setContextProperty("PageController", m_pageController.get()); @@ -361,4 +362,10 @@ void AmneziaApplication::initControllers() m_systemController.reset(new SystemController(m_settings)); m_engine->rootContext()->setContextProperty("SystemController", m_systemController.get()); + + m_cloudController.reset(new CloudController(m_serversModel, m_containersModel)); + m_engine->rootContext()->setContextProperty("CloudController", m_cloudController.get()); + + connect(m_cloudController.get(), &CloudController::serverConfigUpdated, this, + [this]() { m_containersModel->setCurrentlyProcessedServerIndex(m_serversModel->getDefaultServerIndex()); }); } diff --git a/client/amnezia_application.h b/client/amnezia_application.h index 2dd74fcbc..394ff9433 100644 --- a/client/amnezia_application.h +++ b/client/amnezia_application.h @@ -24,6 +24,7 @@ #include "ui/controllers/settingsController.h" #include "ui/controllers/sitesController.h" #include "ui/controllers/systemController.h" +#include "ui/controllers/cloudController.h" #include "ui/models/containers_model.h" #include "ui/models/languageModel.h" #include "ui/models/protocols/cloakConfigModel.h" @@ -116,6 +117,7 @@ class AmneziaApplication : public AMNEZIA_BASE_CLASS QScopedPointer m_settingsController; QScopedPointer m_sitesController; QScopedPointer m_systemController; + QScopedPointer m_cloudController; }; #endif // AMNEZIA_APPLICATION_H diff --git a/client/configurators/cloak_configurator.cpp b/client/configurators/cloak_configurator.cpp index fab378e29..9c5409670 100644 --- a/client/configurators/cloak_configurator.cpp +++ b/client/configurators/cloak_configurator.cpp @@ -4,7 +4,7 @@ #include #include -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" #include "containers/containers_defs.h" CloakConfigurator::CloakConfigurator(std::shared_ptr settings, QObject *parent): diff --git a/client/configurators/ikev2_configurator.cpp b/client/configurators/ikev2_configurator.cpp index 4ca0e5dac..752d17502 100644 --- a/client/configurators/ikev2_configurator.cpp +++ b/client/configurators/ikev2_configurator.cpp @@ -11,7 +11,7 @@ #include "containers/containers_defs.h" #include "core/scripts_registry.h" #include "core/server_defs.h" -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" #include "utilities.h" Ikev2Configurator::Ikev2Configurator(std::shared_ptr settings, QObject *parent) diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index a62bdd9cd..e45c85067 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -16,7 +16,7 @@ #include "containers/containers_defs.h" #include "core/scripts_registry.h" #include "core/server_defs.h" -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" #include "settings.h" #include "utilities.h" diff --git a/client/configurators/openvpn_configurator.h b/client/configurators/openvpn_configurator.h index 3b84e0a0e..342bf7536 100644 --- a/client/configurators/openvpn_configurator.h +++ b/client/configurators/openvpn_configurator.h @@ -32,9 +32,9 @@ class OpenVpnConfigurator : ConfiguratorBase ErrorCode signCert(DockerContainer container, const ServerCredentials &credentials, QString clientId); -private: - ConnectionData createCertRequest(); + static ConnectionData createCertRequest(); +private: ConnectionData prepareOpenVpnConfig(const ServerCredentials &credentials, DockerContainer container, ErrorCode *errorCode = nullptr); diff --git a/client/configurators/shadowsocks_configurator.cpp b/client/configurators/shadowsocks_configurator.cpp index a71064c8f..99e4158c3 100644 --- a/client/configurators/shadowsocks_configurator.cpp +++ b/client/configurators/shadowsocks_configurator.cpp @@ -5,7 +5,7 @@ #include #include "containers/containers_defs.h" -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" ShadowSocksConfigurator::ShadowSocksConfigurator(std::shared_ptr settings, QObject *parent): ConfiguratorBase(settings, parent) diff --git a/client/configurators/wireguard_configurator.cpp b/client/configurators/wireguard_configurator.cpp index 14059977b..7b7d94d2b 100644 --- a/client/configurators/wireguard_configurator.cpp +++ b/client/configurators/wireguard_configurator.cpp @@ -15,7 +15,7 @@ #include "containers/containers_defs.h" #include "core/scripts_registry.h" #include "core/server_defs.h" -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" #include "settings.h" #include "utilities.h" diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index 20fc59f48..d22314150 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -54,7 +54,7 @@ QVector ContainerProps::protocolsForContainer(amnezia::DockerCon case DockerContainer::ShadowSocks: return { Proto::OpenVpn, Proto::ShadowSocks }; - case DockerContainer::Cloak: return { Proto::OpenVpn, Proto::ShadowSocks, Proto::Cloak }; + case DockerContainer::Cloak: return { Proto::OpenVpn, /*Proto::ShadowSocks,*/ Proto::Cloak }; case DockerContainer::Ipsec: return { Proto::Ikev2 /*, Protocol::L2tp */ }; diff --git a/client/core/servercontroller.cpp b/client/core/controllers/serverController.cpp similarity index 99% rename from client/core/servercontroller.cpp rename to client/core/controllers/serverController.cpp index b0f8146fb..96306a58b 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/controllers/serverController.cpp @@ -24,8 +24,8 @@ #include "containers/containers_defs.h" #include "logger.h" -#include "scripts_registry.h" -#include "server_defs.h" +#include "core/scripts_registry.h" +#include "core/server_defs.h" #include "settings.h" #include "utilities.h" diff --git a/client/core/servercontroller.h b/client/core/controllers/serverController.h similarity index 98% rename from client/core/servercontroller.h rename to client/core/controllers/serverController.h index 3191386ca..ea6fd0016 100644 --- a/client/core/servercontroller.h +++ b/client/core/controllers/serverController.h @@ -5,8 +5,8 @@ #include #include "containers/containers_defs.h" -#include "defs.h" -#include "sshclient.h" +#include "core/defs.h" +#include "core/sshclient.h" class Settings; class VpnConfigurator; diff --git a/client/core/errorstrings.cpp b/client/core/errorstrings.cpp index cd66186d1..44135bae3 100644 --- a/client/core/errorstrings.cpp +++ b/client/core/errorstrings.cpp @@ -58,7 +58,7 @@ QString errorString(ErrorCode code){ case (OpenVpnTapAdapterError): return QObject::tr("Can't setup OpenVPN TAP network adapter"); case (AddressPoolError): return QObject::tr("VPN pool error: no available addresses"); - case (ImportInvalidConfigError): return QObject::tr("The config does not contain any containers and credentiaks for connecting to the server"); + case (ImportInvalidConfigError): return QObject::tr("The config does not contain any containers and credentials for connecting to the server"); case(InternalError): default: diff --git a/client/protocols/openvpnprotocol.cpp b/client/protocols/openvpnprotocol.cpp index c38c6eea5..f91cfe090 100644 --- a/client/protocols/openvpnprotocol.cpp +++ b/client/protocols/openvpnprotocol.cpp @@ -214,7 +214,7 @@ ErrorCode OpenVpnProtocol::start() m_openVpnProcess->setProgram(PermittedProcess::OpenVPN); QStringList arguments({ "--config", configPath(), "--management", m_managementHost, QString::number(mgmtPort), - "--management-client" /*, "--log", vpnLogFileNamePath */ + "--management-client" , "--log", "/Users/nethius/Documents/git/log" }); m_openVpnProcess->setArguments(arguments); diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index 9472164b5..fa326b2a0 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -67,7 +67,13 @@ namespace amnezia constexpr char cloak[] = "cloak"; constexpr char sftp[] = "sftp"; - } + constexpr char configVersion[] = "config_version"; + constexpr char apiEdnpoint[] = "api_endpoint"; + constexpr char serviceTypeId[] = "service_type_id"; + constexpr char accessToken[] = "access_token"; + constexpr char certificate[] = "certificate"; + constexpr char publicKey[] = "public_key"; + } namespace protocols { diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index e0bab0185..20a7f0227 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -23,44 +23,52 @@ + + CloudController + + + Error when retrieving configuration from cloud server + + + ConnectionController - + VPN Protocols is not installed. Please install VPN container at first - + Connection... - + Connected - + Settings updated successfully, Reconnnection... - + Reconnection... - - - + + + Connect - + Disconnection... @@ -130,7 +138,7 @@ ImportController - + Scanned %1 of %2. @@ -139,50 +147,55 @@ InstallController - + %1 installed successfully. - + %1 is already installed on the server. - + +Added containers that were already installed on the server + + + + Already installed containers were found on the server. All installed containers have been added to the application - + Settings updated successfully - + Server '%1' was removed - + All containers from server '%1' have been removed - + %1 has been removed from the server '%2' - + Please login as the user - + Server added successfully @@ -250,12 +263,12 @@ Already installed containers were found on the server. All installed containers PageHome - + VPN protocol - + Servers @@ -865,71 +878,76 @@ And if you don't like the app, all the more support it - the donation will + Allow application screenshots + + + + Auto start - + Launch the application every time - + starts - + Start minimized - + Launch application minimized - + Language - + Logging - + Enabled - + Disabled - + Reset settings and remove all data from the application - + Reset settings and remove all data from the application? - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - + Continue Продолжить - + Cancel @@ -1525,17 +1543,17 @@ It's okay as long as it's from someone you trust. PageSetupWizardEasy - + What is the level of internet control in your region? - + Set up a VPN yourself - + I want to choose a VPN protocol @@ -1545,7 +1563,7 @@ It's okay as long as it's from someone you trust. Продолжить - + Set up later @@ -1765,13 +1783,17 @@ It's okay as long as it's from someone you trust. - + + File with accessing settings to + + + + Connection to - - + File with connection settings to @@ -1801,23 +1823,19 @@ It's okay as long as it's from someone you trust. - - Protocols - - - - + + Protocol - - + + Connection format - + Share @@ -2264,7 +2282,7 @@ It's okay as long as it's from someone you trust. - The config does not contain any containers and credentiaks for connecting to the server + The config does not contain any containers and credentials for connecting to the server @@ -2433,6 +2451,16 @@ It's okay as long as it's from someone you trust. error 0x%1: %2 + + + WireGuard Configuration Highlighter + + + + + &Randomize colors + + SelectLanguageDrawer @@ -2459,22 +2487,22 @@ It's okay as long as it's from someone you trust. SettingsController - + Software version - + All settings have been reset to default values - + Cached profiles cleared - + Backup file is corrupted @@ -2504,7 +2532,7 @@ It's okay as long as it's from someone you trust. - Show content + Show connection settings @@ -2592,7 +2620,7 @@ It's okay as long as it's from someone you trust. VpnConnection - + Mbps diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 37e277862..109ad9c89 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -23,44 +23,52 @@ VPN已连接 + + CloudController + + + Error when retrieving configuration from cloud server + + + ConnectionController - - - + + + Connect 连接 - + VPN Protocols is not installed. Please install VPN container at first 不存在VPN协议,请先安装 - + Connection... 连接中 - + Connected 已连接 - + Reconnection... 重连中 - + Disconnection... 断开中 - + Settings updated successfully, Reconnnection... 配置已更新,重连中 @@ -130,7 +138,7 @@ ImportController - + Scanned %1 of %2. 扫描 %1 of %2. @@ -147,41 +155,46 @@ - + %1 installed successfully. %1 安装成功。 - + %1 is already installed on the server. 服务器上已经安装 %1。 - + +Added containers that were already installed on the server + + + + Already installed containers were found on the server. All installed containers have been added to the application 在服务上发现已经安装协议并添加到应用程序 - + Settings updated successfully 配置更新成功 - + Server '%1' was removed 已移除服务器 '%1' - + All containers from server '%1' have been removed 服务器 '%1' 的所有容器已移除 - + %1 has been removed from the server '%2' %1 已从服务器 '%2' 上移除 @@ -202,12 +215,12 @@ Already installed containers were found on the server. All installed containers 协议已从 - + Please login as the user 请以用户身份登录 - + Server added successfully 服务器添加成功 @@ -275,12 +288,12 @@ Already installed containers were found on the server. All installed containers PageHome - + VPN protocol VPN协议 - + Servers 服务器 @@ -892,71 +905,76 @@ And if you don't like the app, all the more support it - the donation will + Allow application screenshots + + + + Auto start 自动运行 - + Launch the application every time 总是在系统 - + starts 启动时自动运行运用程序 - + Start minimized 最小化 - + Launch application minimized 开启应用程序时窗口最小化 - + Language 语言 - + Logging 日志 - + Enabled 开启 - + Disabled 禁用 - + Reset settings and remove all data from the application 重置并清理应用的所有数据 - + Reset settings and remove all data from the application? 重置并清理应用的所有数据? - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. 所有配置恢复为默认值。在服务器上保留所有已安装的AmneziaVPN服务。 - + Continue 继续 - + Cancel 取消 @@ -1561,17 +1579,17 @@ It's okay as long as it's from someone you trust. PageSetupWizardEasy - + What is the level of internet control in your region? 您所在地区的互联网控制力度如何? - + Set up a VPN yourself 自己架设VPN - + I want to choose a VPN protocol 我想选择VPN协议 @@ -1581,7 +1599,7 @@ It's okay as long as it's from someone you trust. 继续 - + Set up later 稍后设置 @@ -1827,33 +1845,37 @@ It's okay as long as it's from someone you trust. - + File with accessing settings to + + + + File with connection settings to 连接配置文件的内容为: - Protocols - 协议 + 协议 - + + Protocol 协议 - + Connection to 连接到 - - + + Connection format 连接方式 - + Share 共享 @@ -2305,8 +2327,12 @@ It's okay as long as it's from someone you trust. + The config does not contain any containers and credentials for connecting to the server + + + The config does not contain any containers and credentiaks for connecting to the server - 该配置不包含任何用于连接到服务器的容器和凭据。 + 该配置不包含任何用于连接到服务器的容器和凭据。 @@ -2469,6 +2495,16 @@ It's okay as long as it's from someone you trust. error 0x%1: %2 错误 0x%1: %2 + + + WireGuard Configuration Highlighter + + + + + &Randomize colors + + SelectLanguageDrawer @@ -2495,22 +2531,22 @@ It's okay as long as it's from someone you trust. SettingsController - + Software version 软件版本 - + Backup file is corrupted 备份文件已损坏 - + All settings have been reset to default values 所配置恢复为默认值 - + Cached profiles cleared 缓存的配置文件已清除 @@ -2540,8 +2576,12 @@ It's okay as long as it's from someone you trust. + Show connection settings + + + Show content - 展示内容 + 展示内容 @@ -2628,7 +2668,7 @@ It's okay as long as it's from someone you trust. VpnConnection - + Mbps diff --git a/client/ui/controllers/cloudController.cpp b/client/ui/controllers/cloudController.cpp new file mode 100644 index 000000000..99309d90e --- /dev/null +++ b/client/ui/controllers/cloudController.cpp @@ -0,0 +1,109 @@ +#include "cloudController.h" + +#include +#include +#include + +#include "configurators/openvpn_configurator.h" + +CloudController::CloudController(const QSharedPointer &serversModel, + const QSharedPointer &containersModel, QObject *parent) + : QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel) +{ +} + +QString CloudController::genPublicKey(ServiceTypeId serviceTypeId) +{ + switch (serviceTypeId) + { + case ServiceTypeId::AmneziaFreeRuWG: return "."; + case ServiceTypeId::AmneziaFreeRuCloak: return "."; + case ServiceTypeId::AmneziaFreeRuAWG: return "."; + case ServiceTypeId::AmneziaFreeRuReverseWG: return "."; + case ServiceTypeId::AmneziaFreeRuReverseCloak: return "."; + case ServiceTypeId::AmneziaFreeRuReverseAWG: return "."; + } +} + +QString CloudController::genCertificateRequest(ServiceTypeId serviceTypeId) +{ + switch (serviceTypeId) + { + case ServiceTypeId::AmneziaFreeRuWG: return ""; + case ServiceTypeId::AmneziaFreeRuCloak: { + auto data = OpenVpnConfigurator::createCertRequest(); + return data.request; + } + case ServiceTypeId::AmneziaFreeRuAWG: return ""; + case ServiceTypeId::AmneziaFreeRuReverseWG: return ""; + case ServiceTypeId::AmneziaFreeRuReverseCloak: return ""; + case ServiceTypeId::AmneziaFreeRuReverseAWG: return ""; + } +} + +bool CloudController::updateServerConfigFromCloud() +{ + auto serverConfig = m_serversModel->getDefaultServerConfig(); + + auto containerConfig = serverConfig.value(config_key::containers).toArray(); + + if (serverConfig.value(config_key::configVersion).toInt() && containerConfig.isEmpty()) { + QNetworkAccessManager manager; + + QNetworkRequest request; + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + QString endpoint = serverConfig.value(config_key::apiEdnpoint).toString(); + request.setUrl(endpoint.replace("https", "http")); // + + ServiceTypeId serviceTypeId = static_cast(serverConfig.value(config_key::serviceTypeId).toInt()); + + QJsonObject obj; + obj[config_key::serviceTypeId] = serviceTypeId; + obj[config_key::accessToken] = serverConfig.value(config_key::accessToken); + + obj[config_key::publicKey] = genPublicKey(serviceTypeId); + obj[config_key::certificate] = genCertificateRequest(serviceTypeId); + + QByteArray requestBody = QJsonDocument(obj).toJson(); + + QScopedPointer reply; + reply.reset(manager.post(request, requestBody)); + + QEventLoop wait; + QObject::connect(reply.get(), &QNetworkReply::finished, &wait, &QEventLoop::quit); + wait.exec(); + + if(reply->error() == QNetworkReply::NoError){ + QString contents = QString::fromUtf8(reply->readAll()); + auto data = QJsonDocument::fromJson(contents.toUtf8()).object().value(config_key::config).toString(); + + data.replace("vpn://", ""); + QByteArray ba = QByteArray::fromBase64(data.toUtf8(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); + + QByteArray ba_uncompressed = qUncompress(ba); + if (!ba_uncompressed.isEmpty()) { + ba = ba_uncompressed; + } + + QJsonObject cloudConfig = QJsonDocument::fromJson(ba).object(); + serverConfig.insert("cloudConfig", cloudConfig); + serverConfig.insert(config_key::dns1, cloudConfig.value(config_key::dns1)); + serverConfig.insert(config_key::dns2, cloudConfig.value(config_key::dns2)); + serverConfig.insert(config_key::containers, cloudConfig.value(config_key::containers)); + serverConfig.insert(config_key::hostName, cloudConfig.value(config_key::hostName)); + serverConfig.insert(config_key::defaultContainer, cloudConfig.value(config_key::defaultContainer)); + m_serversModel->editServer(serverConfig); + emit serverConfigUpdated(); + } else{ + QString err = reply->errorString(); + qDebug() << reply->error(); + qDebug() << err; + qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + emit errorOccurred(tr("Error when retrieving configuration from cloud server")); + return false; + } + + } + + return true; +} diff --git a/client/ui/controllers/cloudController.h b/client/ui/controllers/cloudController.h new file mode 100644 index 000000000..409e0981c --- /dev/null +++ b/client/ui/controllers/cloudController.h @@ -0,0 +1,43 @@ +#ifndef CLOUDCONTROLLER_H +#define CLOUDCONTROLLER_H + +#include + +#include "ui/models/containers_model.h" +#include "ui/models/servers_model.h" + +class CloudController : public QObject +{ + Q_OBJECT + + enum ServiceTypeId + { + AmneziaFreeRuWG = 0, + AmneziaFreeRuCloak, + AmneziaFreeRuAWG, + AmneziaFreeRuReverseWG, + AmneziaFreeRuReverseCloak, + AmneziaFreeRuReverseAWG + + }; + +public: + explicit CloudController(const QSharedPointer &serversModel, + const QSharedPointer &containersModel, QObject *parent = nullptr); + +public slots: + bool updateServerConfigFromCloud(); + +signals: + void errorOccurred(const QString &errorMessage); + void serverConfigUpdated(); + +private: + QString genPublicKey(ServiceTypeId serviceTypeId); + QString genCertificateRequest(ServiceTypeId serviceTypeId); + + QSharedPointer m_serversModel; + QSharedPointer m_containersModel; +}; + +#endif // CLOUDCONTROLLER_H diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 74438dcce..de05d6241 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -40,6 +40,7 @@ void ConnectionController::openConnection() } qApp->processEvents(); + emit connectToVpn(serverIndex, credentials, container, containerConfig); } diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index aaea8db33..8198a5a17 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -141,7 +141,9 @@ void ImportController::importConfig() credentials.userName = m_config.value(config_key::userName).toString(); credentials.secretData = m_config.value(config_key::password).toString(); - if (credentials.isValid() || m_config.contains(config_key::containers)) { + if (credentials.isValid() + || m_config.contains(config_key::containers) + || m_config.contains(config_key::configVersion)) { // todo m_serversModel->addServer(m_config); m_serversModel->setDefaultServerIndex(m_serversModel->getServersCount() - 1); @@ -167,7 +169,11 @@ QJsonObject ImportController::extractAmneziaConfig(QString &data) ba = ba_uncompressed; } - return QJsonDocument::fromJson(ba).object(); + QJsonObject config = QJsonDocument::fromJson(ba).object(); + + qDebug() << config; + + return config; } QJsonObject ImportController::extractOpenVpnConfig(const QString &data) diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 72cc34b60..4885aa809 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -7,7 +7,7 @@ #include #include "core/errorstrings.h" -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" #include "utilities.h" namespace diff --git a/client/ui/models/containers_model.cpp b/client/ui/models/containers_model.cpp index 6cf855a65..0ffdc00be 100644 --- a/client/ui/models/containers_model.cpp +++ b/client/ui/models/containers_model.cpp @@ -1,6 +1,6 @@ #include "containers_model.h" -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" ContainersModel::ContainersModel(std::shared_ptr settings, QObject *parent) : m_settings(settings), QAbstractListModel(parent) diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 7eea94e56..e0fe07876 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -168,6 +168,14 @@ void ServersModel::addServer(const QJsonObject &server) endResetModel(); } +void ServersModel::editServer(const QJsonObject &server) +{ + beginResetModel(); + m_settings->editServer(m_currentlyProcessedServerIndex, server); + m_servers = m_settings->serversArray(); + endResetModel(); +} + void ServersModel::removeServer() { beginResetModel(); @@ -219,3 +227,8 @@ ServerCredentials ServersModel::serverCredentials(int index) const return credentials; } + +QJsonObject ServersModel::getDefaultServerConfig() +{ + return m_servers.at(m_defaultServerIndex).toObject(); +} diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index d7b158445..feff3ec89 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -55,10 +55,13 @@ public slots: QString getCurrentlyProcessedServerHostName(); void addServer(const QJsonObject &server); + void editServer(const QJsonObject &server); void removeServer(); bool isDefaultServerConfigContainsAmneziaDns(); + QJsonObject getDefaultServerConfig(); + protected: QHash roleNames() const override; diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index 76e83da5a..2fdcb9b25 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -138,6 +138,10 @@ Button { } onClicked: { + if (!CloudController.updateServerConfigFromCloud()) { + return + } + if (!ContainersModel.isAnyContainerInstalled()) { PageController.setTriggeredBtConnectButton(true) diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 1cff01e6b..5cc6a6a0d 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include "core/controllers/serverController.h" #ifdef AMNEZIA_DESKTOP #include "core/ipcclient.h" @@ -258,9 +258,7 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex, const ServerC for (ProtocolEnumNS::Proto proto : ContainerProps::protocolsForContainer(container)) { QJsonObject vpnConfigData = QJsonDocument::fromJson(createVpnConfigurationForProto(serverIndex, credentials, container, - containerConfig, proto, errorCode) - .toUtf8()) - .object(); + containerConfig, proto, errorCode).toUtf8()).object(); if (errorCode && *errorCode) { return {}; From b78bf39767a975f897729cdacdca30076864c4a2 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Fri, 13 Oct 2023 15:45:06 +0500 Subject: [PATCH 002/144] added split tunneling to the config --- client/protocols/protocols_defs.h | 4 ++++ client/translations/amneziavpn_ru.ts | 20 +++++++++++++++++--- client/translations/amneziavpn_zh_CN.ts | 20 +++++++++++++++++--- client/ui/controllers/importController.cpp | 7 +++++++ client/vpnconnection.cpp | 16 ++++++++++++++++ client/vpnconnection.h | 2 ++ 6 files changed, 63 insertions(+), 6 deletions(-) diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index d6af132b2..a6840e8cb 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -43,6 +43,7 @@ namespace amnezia constexpr char server_priv_key[] = "server_priv_key"; constexpr char server_pub_key[] = "server_pub_key"; constexpr char psk_key[] = "psk_key"; + constexpr char allowed_ips[] = "allowed_ips"; constexpr char client_ip[] = "client_ip"; // internal ip address @@ -78,6 +79,9 @@ namespace amnezia constexpr char sftp[] = "sftp"; constexpr char awg[] = "awg"; + constexpr char splitTunnelSites[] = "splitTunnelSites"; + constexpr char splitTunnelType[] = "splitTunnelType"; + } namespace protocols diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index ac0995520..d3c2657e6 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -130,7 +130,7 @@ ImportController - + Scanned %1 of %2. @@ -2413,10 +2413,14 @@ It's okay as long as it's from someone you trust. - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + + IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS. @@ -2537,6 +2541,16 @@ It's okay as long as it's from someone you trust. error 0x%1: %2 + + + WireGuard Configuration Highlighter + + + + + &Randomize colors + + SelectLanguageDrawer @@ -2704,7 +2718,7 @@ It's okay as long as it's from someone you trust. VpnConnection - + Mbps diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 7a08682c2..88e13f043 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -130,7 +130,7 @@ ImportController - + Scanned %1 of %2. 扫描 %1 of %2. @@ -2520,10 +2520,14 @@ It's okay as long as it's from someone you trust. - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. WireGuard - 新型流行的VPN协议,具有高性能、高速度和低功耗。建议用于审查力度较低的地区 + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + + IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS. @@ -2644,6 +2648,16 @@ It's okay as long as it's from someone you trust. error 0x%1: %2 错误 0x%1: %2 + + + WireGuard Configuration Highlighter + + + + + &Randomize colors + + SelectLanguageDrawer @@ -2815,7 +2829,7 @@ It's okay as long as it's from someone you trust. VpnConnection - + Mbps diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index 08b662ec8..044ddb37f 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -263,6 +263,13 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data) // return QJsonObject(); // } + auto allowedIps = configMap.value("AllowedIPs").split(","); + QJsonArray allowedIpsJsonArray; + for (const auto &allowedIp : allowedIps) { + allowedIpsJsonArray.append(allowedIp); + } + lastConfig[config_key::allowed_ips] = allowedIpsJsonArray; + QString protocolName = "wireguard"; if (!configMap.value(config_key::junkPacketCount).isEmpty() && !configMap.value(config_key::junkPacketMinSize).isEmpty() diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 46e8be601..c73df4447 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -329,6 +329,8 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede return; } + appendSplitTunnelingConfig(); + #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) m_vpnProtocol.reset(VpnProtocol::factory(container, m_vpnConfiguration)); if (!m_vpnProtocol) { @@ -363,6 +365,20 @@ void VpnConnection::createProtocolConnections() connect(m_vpnProtocol.data(), SIGNAL(bytesChanged(quint64, quint64)), this, SLOT(onBytesChanged(quint64, quint64))); } +void VpnConnection::appendSplitTunnelingConfig() +{ + auto routeMode = m_settings->routeMode(); + auto sites = m_settings->getVpnIps(routeMode); + + QJsonArray sitesJsonArray; + for (const auto &site : sites) { + sitesJsonArray.append(site); + } + + m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode); + m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray); +} + #ifdef Q_OS_ANDROID void VpnConnection::restoreConnection() { diff --git a/client/vpnconnection.h b/client/vpnconnection.h index f6b2343c0..45582de51 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -112,6 +112,8 @@ protected slots: #endif void createProtocolConnections(); + + void appendSplitTunnelingConfig(); }; #endif // VPNCONNECTION_H From 2df612ec1f760066e61c2f00a1a8d7989fe6659b Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Mon, 16 Oct 2023 12:05:35 -0400 Subject: [PATCH 003/144] Android SplitTunnel --- client/amnezia_application.cpp | 2 +- .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 51 ++++++++++++++++++- .../android/src/org/amnezia/vpn/VPNService.kt | 42 ++++++++++++--- client/configurators/openvpn_configurator.cpp | 10 +++- .../ui/qml/Pages2/PageSettingsConnection.qml | 2 +- 5 files changed, 94 insertions(+), 13 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 904ffaa6c..05ced2f09 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -297,7 +297,7 @@ void AmneziaApplication::initModels() connect(m_containersModel.get(), &ContainersModel::defaultContainerChanged, this, [this]() { if (m_containersModel->getDefaultContainer() == DockerContainer::WireGuard && m_sitesModel->isSplitTunnelingEnabled()) { - m_sitesModel->toggleSplitTunneling(false); + m_sitesModel->toggleSplitTunneling(true); emit m_pageController->showNotificationMessage( tr("Split tunneling for WireGuard is not implemented, the option was disabled")); } diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index 2a6e6bf5d..20869e486 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -72,6 +72,13 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna val jsonVpnConfig = mService.getVpnConfig() val ovpnConfig = jsonVpnConfig.getJSONObject("openvpn_config_data").getString("config") + Log.e(tag, "jsonVpnConfig $jsonVpnConfig") + val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType") + val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites") + + Log.e(tag, "splitTunnelType $splitTunnelType") + Log.e(tag, "splitTunnelSites $splitTunnelSites") + val resultingConfig = StringBuilder() resultingConfig.append(ovpnConfig) @@ -115,6 +122,7 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna eval_config(config) val status = connect() + if (status.getError()) { Log.i(tag, "connect() error: " + status.getError() + ": " + status.getMessage()) } @@ -139,7 +147,46 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna override fun tun_builder_establish(): Int { Log.v(tag, "tun_builder_establish") - return mService.establish()!!.detachFd() + val Fd = mService.establish()!!.detachFd() + + val jsonVpnConfig = mService.getVpnConfig() + + val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType") + val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites") + + Log.e(tag, "splitTunnelSites $splitTunnelSites") + for (i in 0 until splitTunnelSites.length()) { + val site = splitTunnelSites.getString(i) + if (site.contains("\\/")) { + Log.e(tag, "site $site rawMask 32") + mService.addRoute(site, 32) + } else { + var slash = site.lastIndexOf('/'); + var maskString: String = "" + var rawMask = 32 + var rawAddress: String = "" + if (slash >= 0) { + maskString = site.substring(slash + 1) + try { + rawMask = Integer.parseInt(maskString, 10) + } catch (e: Exception) { + + } + rawAddress = site.substring(0, slash) + } else { + maskString = "" + rawMask = 32 + rawAddress = site + } + Log.e(tag, "rawAddress $rawAddress rawMask $rawMask") + mService.addRoute(rawAddress, rawMask) + //val internet = InetNetwork.parse(site) + //peerBuilder.addAllowedIp(internet) + } + Log.e(tag, "splitTunnelSites $site") + } + + return Fd } override fun tun_builder_add_address(address: String , prefix_length: Int , gateway: String , ipv6:Boolean , net30: Boolean ): Boolean { @@ -159,7 +206,7 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna override fun tun_builder_reroute_gw(ipv4: Boolean, ipv6: Boolean , flags: Long): Boolean { Log.v(tag, "tun_builder_reroute_gw") - mService.addRoute("0.0.0.0", 0) + // mService.addRoute("0.0.0.0", 0) return true } diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/VPNService.kt index 06f58980a..047192a67 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/VPNService.kt @@ -571,6 +571,9 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { private fun buildWireguardConfig(obj: JSONObject, type: String): Config { val confBuilder = Config.Builder() val wireguardConfigData = obj.getJSONObject(type) + val splitTunnelType = obj.getInt("splitTunnelType") + val splitTunnelSites = obj.getJSONArray("splitTunnelSites") + val config = parseConfigData(wireguardConfigData.getString("config")) val peerBuilder = Peer.Builder() val peerConfig = config["Peer"]!! @@ -579,15 +582,37 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { peerBuilder.setPreSharedKey(Key.fromBase64(it)) } val allowedIPList = peerConfig["AllowedIPs"]?.split(",") ?: emptyList() - if (allowedIPList.isEmpty()) { - val internet = InetNetwork.parse("0.0.0.0/0") // aka The whole internet. - peerBuilder.addAllowedIp(internet) - } else { - allowedIPList.forEach { - val network = InetNetwork.parse(it.trim()) - peerBuilder.addAllowedIp(network) + + Log.e(tag, "splitTunnelSites $splitTunnelSites") + for (i in 0 until splitTunnelSites.length()) { + val site = splitTunnelSites.getString(i) + if (site.contains("\\/")) { + val internet = InetNetwork.parse(site + "\\32") + peerBuilder.addAllowedIp(internet) + } else { + val internet = InetNetwork.parse(site) + peerBuilder.addAllowedIp(internet) } + Log.e(tag, "splitTunnelSites $site") } + + // if (allowedIPList.isEmpty() /*&& splitTunnelType.equals("0", true) */) { + // Log.e(tag, "splitTunnelSites $splitTunnelSites") + // for (i in 0 until splitTunnelSites.length()) { + // val site = splitTunnelSites.getString(i) + // Log.e(tag, "splitTunnelSites $site") + // } + + // val internet = InetNetwork.parse("0.0.0.0/0") // aka The whole internet. + // peerBuilder.addAllowedIp(internet) + // } else { + + + // allowedIPList.forEach { + // val network = InetNetwork.parse(it.trim()) + // peerBuilder.addAllowedIp(network) + // } + // } val endpointConfig = peerConfig["Endpoint"] val endpoint = InetEndpoint.parse(endpointConfig) peerBuilder.setEndpoint(endpoint) @@ -753,6 +778,9 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { GoBackend.wgTurnOff(currentTunnelHandle) } val wgConfig: String = wireguard_conf.toWgUserspaceString() + + Log.e(tag, "wgConfig : $wgConfig") + val builder = Builder() setupBuilder(wireguard_conf, builder) builder.setSession("Amnezia") diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index a62bdd9cd..5c4004ad6 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -125,16 +125,22 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) config.replace(regex, ""); if (m_settings->routeMode() == Settings::VpnAllSites) { - config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); + qDebug() << "Settings::VpnAllSites"; + + //config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); config.append("block-ipv6\n"); } if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { + qDebug() << "Settings::VpnOnlyForwardSites"; + // no redirect-gateway } if (m_settings->routeMode() == Settings::VpnAllExceptSites) { - config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); + qDebug() << "Settings::VpnAllExceptSites"; + + //config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); config.append("block-ipv6\n"); diff --git a/client/ui/qml/Pages2/PageSettingsConnection.qml b/client/ui/qml/Pages2/PageSettingsConnection.qml index b5b1bd97c..510960570 100644 --- a/client/ui/qml/Pages2/PageSettingsConnection.qml +++ b/client/ui/qml/Pages2/PageSettingsConnection.qml @@ -94,7 +94,7 @@ PageType { DividerType {} LabelWithButtonType { - visible: !GC.isMobile() + visible: GC.isDesktop() || Qt.platform.os === "android" Layout.fillWidth: true From 546d4c1d3dad14f33128f4ec5ce0a33424401ce0 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 17 Oct 2023 14:35:13 -0400 Subject: [PATCH 004/144] WG/AWG Android splitTunnel --- .../src/com/wireguard/config/IPRange.java | 509 ++++++++++++++++++ .../src/com/wireguard/config/IPRangeSet.java | 223 ++++++++ .../src/com/wireguard/config/Utils.java | 77 +++ .../android/src/org/amnezia/vpn/VPNService.kt | 101 ++-- client/configurators/openvpn_configurator.cpp | 4 +- client/settings.cpp | 2 +- 6 files changed, 871 insertions(+), 45 deletions(-) create mode 100644 client/android/src/com/wireguard/config/IPRange.java create mode 100644 client/android/src/com/wireguard/config/IPRangeSet.java create mode 100644 client/android/src/com/wireguard/config/Utils.java diff --git a/client/android/src/com/wireguard/config/IPRange.java b/client/android/src/com/wireguard/config/IPRange.java new file mode 100644 index 000000000..11dd66e13 --- /dev/null +++ b/client/android/src/com/wireguard/config/IPRange.java @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2012-2017 Tobias Brunner + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +package com.wireguard.config; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import androidx.annotation.NonNull; + +/** + * Class that represents a range of IP addresses. This range could be a proper subnet, but that's + * not necessarily the case (see {@code getPrefix} and {@code toSubnets}). + */ +public class IPRange implements Comparable +{ + private final byte[] mBitmask = { (byte)0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + private byte[] mFrom; + private byte[] mTo; + private Integer mPrefix; + + /** + * Determine if the range is a proper subnet and, if so, what the network prefix is. + */ + private void determinePrefix() + { + boolean matching = true; + + mPrefix = mFrom.length * 8; + for (int i = 0; i < mFrom.length; i++) + { + for (int bit = 0; bit < 8; bit++) + { + if (matching) + { + if ((mFrom[i] & mBitmask[bit]) != (mTo[i] & mBitmask[bit])) + { + mPrefix = (i * 8) + bit; + matching = false; + } + } + else + { + if ((mFrom[i] & mBitmask[bit]) != 0 || (mTo[i] & mBitmask[bit]) == 0) + { + mPrefix = null; + return; + } + } + } + } + } + + private IPRange(byte[] from, byte[] to) + { + mFrom = from; + mTo = to; + determinePrefix(); + } + + public IPRange(String from, String to) throws UnknownHostException + { + this(Utils.parseInetAddress(from), Utils.parseInetAddress(to)); + } + + public IPRange(InetAddress from, InetAddress to) + { + initializeFromRange(from, to); + } + + private void initializeFromRange(InetAddress from, InetAddress to) + { + byte[] fa = from.getAddress(), ta = to.getAddress(); + if (fa.length != ta.length) + { + throw new IllegalArgumentException("Invalid range"); + } + if (compareAddr(fa, ta) < 0) + { + mFrom = fa; + mTo = ta; + } + else + { + mTo = fa; + mFrom = ta; + } + determinePrefix(); + } + + public IPRange(String base, int prefix) throws UnknownHostException + { + this(Utils.parseInetAddress(base), prefix); + } + + public IPRange(InetAddress base, int prefix) + { + this(base.getAddress(), prefix); + } + + private IPRange(byte[] from, int prefix) + { + initializeFromCIDR(from, prefix); + } + + private void initializeFromCIDR(byte[] from, int prefix) + { + if (from.length != 4 && from.length != 16) + { + throw new IllegalArgumentException("Invalid address"); + } + if (prefix < 0 || prefix > from.length * 8) + { + throw new IllegalArgumentException("Invalid prefix"); + } + byte[] to = from.clone(); + byte mask = (byte)(0xff << (8 - prefix % 8)); + int i = prefix / 8; + + if (i < from.length) + { + from[i] = (byte)(from[i] & mask); + to[i] = (byte)(to[i] | ~mask); + Arrays.fill(from, i+1, from.length, (byte)0); + Arrays.fill(to, i+1, to.length, (byte)0xff); + } + mFrom = from; + mTo = to; + mPrefix = prefix; + } + + public IPRange(String cidr) throws UnknownHostException + { + /* only verify the basic structure */ + if (!cidr.matches("(?i)^(([0-9.]+)|([0-9a-f:]+))(-(([0-9.]+)|([0-9a-f:]+))|(/\\d+))?$")) + { + throw new IllegalArgumentException("Invalid CIDR or range notation"); + } + if (cidr.contains("-")) + { + String[] parts = cidr.split("-"); + InetAddress from = InetAddress.getByName(parts[0]); + InetAddress to = InetAddress.getByName(parts[1]); + initializeFromRange(from, to); + } + else + { + String[] parts = cidr.split("/"); + InetAddress addr = InetAddress.getByName(parts[0]); + byte[] base = addr.getAddress(); + int prefix = base.length * 8; + if (parts.length > 1) + { + prefix = Integer.parseInt(parts[1]); + } + initializeFromCIDR(base, prefix); + } + } + + /** + * Returns the first address of the range. The network ID in case this is a proper subnet. + */ + public InetAddress getFrom() + { + try + { + return InetAddress.getByAddress(mFrom); + } + catch (UnknownHostException ignored) + { + return null; + } + } + + /** + * Returns the last address of the range. + */ + public InetAddress getTo() + { + try + { + return InetAddress.getByAddress(mTo); + } + catch (UnknownHostException ignored) + { + return null; + } + } + + /** + * If this range is a proper subnet returns its prefix, otherwise returns null. + */ + public Integer getPrefix() + { + return mPrefix; + } + + @Override + public int compareTo(@NonNull IPRange other) + { + int cmp = compareAddr(mFrom, other.mFrom); + if (cmp == 0) + { /* smaller ranges first */ + cmp = compareAddr(mTo, other.mTo); + } + return cmp; + } + + @Override + public boolean equals(Object o) + { + if (o == null || !(o instanceof IPRange)) + { + return false; + } + return this == o || compareTo((IPRange)o) == 0; + } + + @Override + public String toString() + { + try + { + if (mPrefix != null) + { + return InetAddress.getByAddress(mFrom).getHostAddress() + "/" + mPrefix; + } + return InetAddress.getByAddress(mFrom).getHostAddress() + "-" + + InetAddress.getByAddress(mTo).getHostAddress(); + } + catch (UnknownHostException ignored) + { + return super.toString(); + } + } + + private int compareAddr(byte a[], byte b[]) + { + if (a.length != b.length) + { + return (a.length < b.length) ? -1 : 1; + } + for (int i = 0; i < a.length; i++) + { + if (a[i] != b[i]) + { + if (((int)a[i] & 0xff) < ((int)b[i] & 0xff)) + { + return -1; + } + else + { + return 1; + } + } + } + return 0; + } + + /** + * Check if this range fully contains the given range. + */ + public boolean contains(IPRange range) + { + return compareAddr(mFrom, range.mFrom) <= 0 && compareAddr(range.mTo, mTo) <= 0; + } + + /** + * Check if this and the given range overlap. + */ + public boolean overlaps(IPRange range) + { + return !(compareAddr(mTo, range.mFrom) < 0 || compareAddr(range.mTo, mFrom) < 0); + } + + private byte[] dec(byte[] addr) + { + for (int i = addr.length - 1; i >= 0; i--) + { + if (--addr[i] != (byte)0xff) + { + break; + } + } + return addr; + } + + private byte[] inc(byte[] addr) + { + for (int i = addr.length - 1; i >= 0; i--) + { + if (++addr[i] != 0) + { + break; + } + } + return addr; + } + + /** + * Remove the given range from the current range. Returns a list of resulting ranges (these are + * not proper subnets). At most two ranges are returned, in case the given range is contained in + * this but does not equal it, which would result in an empty list (which is also the case if + * this range is fully contained in the given range). + */ + public List remove(IPRange range) + { + ArrayList list = new ArrayList<>(); + if (!overlaps(range)) + { /* | this | or | this | + * | range | | range | */ + list.add(this); + } + else if (!range.contains(this)) + { /* we are not completely removed, so none of these cases applies: + * | this | or | this | or | this | + * | range | | range | | range | */ + if (compareAddr(mFrom, range.mFrom) < 0 && compareAddr(range.mTo, mTo) < 0) + { /* the removed range is completely within our boundaries: + * | this | + * | range | */ + list.add(new IPRange(mFrom, dec(range.mFrom.clone()))); + list.add(new IPRange(inc(range.mTo.clone()), mTo)); + } + else + { /* one end is within our boundaries the other at or outside it: + * | this | or | this | or | this | or | this | + * | range | | range | | range | | range | */ + byte[] from = compareAddr(mFrom, range.mFrom) < 0 ? mFrom : inc(range.mTo.clone()); + byte[] to = compareAddr(mTo, range.mTo) > 0 ? mTo : dec(range.mFrom.clone()); + list.add(new IPRange(from, to)); + } + } + return list; + } + + private boolean adjacent(IPRange range) + { + if (compareAddr(mTo, range.mFrom) < 0) + { + byte[] to = inc(mTo.clone()); + return compareAddr(to, range.mFrom) == 0; + } + byte[] from = dec(mFrom.clone()); + return compareAddr(from, range.mTo) == 0; + } + + /** + * Merge two adjacent or overlapping ranges, returns null if it's not possible to merge them. + */ + public IPRange merge(IPRange range) + { + if (overlaps(range)) + { + if (contains(range)) + { + return this; + } + else if (range.contains(this)) + { + return range; + } + } + else if (!adjacent(range)) + { + return null; + } + byte[] from = compareAddr(mFrom, range.mFrom) < 0 ? mFrom : range.mFrom; + byte[] to = compareAddr(mTo, range.mTo) > 0 ? mTo : range.mTo; + return new IPRange(from, to); + } + + /** + * Split the given range into a sorted list of proper subnets. + */ + public List toSubnets() + { + ArrayList list = new ArrayList<>(); + if (mPrefix != null) + { + list.add(this); + } + else + { + int i = 0, bit = 0, prefix, netmask, common_byte, common_bit; + int from_cur, from_prev = 0, to_cur, to_prev = 1; + boolean from_full = true, to_full = true; + + byte[] from = mFrom.clone(); + byte[] to = mTo.clone(); + + /* find a common prefix */ + while (i < from.length && (from[i] & mBitmask[bit]) == (to[i] & mBitmask[bit])) + { + if (++bit == 8) + { + bit = 0; + i++; + } + } + prefix = i * 8 + bit; + + /* at this point we know that the addresses are either equal, or that the + * current bits in the 'from' and 'to' addresses are 0 and 1, respectively. + * we now look at the rest of the bits as two binary trees (0=left, 1=right) + * where 'from' and 'to' are both leaf nodes. all leaf nodes between these + * nodes are addresses contained in the range. to collect them as subnets + * we follow the trees from both leaf nodes to their root node and record + * all complete subtrees (right for from, left for to) we come across as + * subnets. in that process host bits are zeroed out. if both addresses + * are equal we won't enter the loop below. + * 0_____|_____1 for the 'from' address we assume we start on a + * 0__|__ 1 0__|__1 left subtree (0) and follow the left edges until + * _|_ _|_ _|_ _|_ we reach the root of this subtree, which is + * | | | | | | | | either the root of this whole 'from'-subtree + * 0 1 0 1 0 1 0 1 (causing us to leave the loop) or the root node + * of the right subtree (1) of another node (which actually could be the + * leaf node we start from). that whole subtree gets recorded as subnet. + * next we follow the right edges to the root of that subtree which again is + * either the 'from'-root or the root node in the left subtree (0) of + * another node. the complete right subtree of that node is the next subnet + * we record. from there we assume that we are in that right subtree and + * recursively follow right edges to its root. for the 'to' address the + * procedure is exactly the same but with left and right reversed. + */ + if (++bit == 8) + { + bit = 0; + i++; + } + common_byte = i; + common_bit = bit; + netmask = from.length * 8; + for (i = from.length - 1; i >= common_byte; i--) + { + int bit_min = (i == common_byte) ? common_bit : 0; + for (bit = 7; bit >= bit_min; bit--) + { + byte mask = mBitmask[bit]; + + from_cur = from[i] & mask; + if (from_prev == 0 && from_cur != 0) + { /* 0 -> 1: subnet is the whole current (right) subtree */ + list.add(new IPRange(from.clone(), netmask)); + from_full = false; + } + else if (from_prev != 0 && from_cur == 0) + { /* 1 -> 0: invert bit to switch to right subtree and add it */ + from[i] ^= mask; + list.add(new IPRange(from.clone(), netmask)); + from_cur = 1; + } + /* clear the current bit */ + from[i] &= ~mask; + from_prev = from_cur; + + to_cur = to[i] & mask; + if (to_prev != 0 && to_cur == 0) + { /* 1 -> 0: subnet is the whole current (left) subtree */ + list.add(new IPRange(to.clone(), netmask)); + to_full = false; + } + else if (to_prev == 0 && to_cur != 0) + { /* 0 -> 1: invert bit to switch to left subtree and add it */ + to[i] ^= mask; + list.add(new IPRange(to.clone(), netmask)); + to_cur = 0; + } + /* clear the current bit */ + to[i] &= ~mask; + to_prev = to_cur; + netmask--; + } + } + + if (from_full && to_full) + { /* full subnet (from=to or from=0.. and to=1.. after common prefix) - not reachable + * due to the shortcut at the top */ + list.add(new IPRange(from.clone(), prefix)); + } + else if (from_full) + { /* full from subnet (from=0.. after prefix) */ + list.add(new IPRange(from.clone(), prefix + 1)); + } + else if (to_full) + { /* full to subnet (to=1.. after prefix) */ + list.add(new IPRange(to.clone(), prefix + 1)); + } + } + Collections.sort(list); + return list; + } +} diff --git a/client/android/src/com/wireguard/config/IPRangeSet.java b/client/android/src/com/wireguard/config/IPRangeSet.java new file mode 100644 index 000000000..b77d4f737 --- /dev/null +++ b/client/android/src/com/wireguard/config/IPRangeSet.java @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2012-2017 Tobias Brunner + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +package com.wireguard.config; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.TreeSet; + +/** + * Class that represents a set of IP address ranges (not necessarily proper subnets) and allows + * modifying the set and enumerating the resulting subnets. + */ +public class IPRangeSet implements Iterable +{ + private TreeSet mRanges = new TreeSet<>(); + + /** + * Parse the given string (space separated ranges in CIDR or range notation) and return the + * resulting set or {@code null} if the string was invalid. An empty set is returned if the given string + * is {@code null}. + */ + public static IPRangeSet fromString(String ranges) + { + IPRangeSet set = new IPRangeSet(); + if (ranges != null) + { + for (String range : ranges.split("\\s+")) + { + try + { + set.add(new IPRange(range)); + } + catch (Exception unused) + { /* besides due to invalid strings exceptions might get thrown if the string + * contains a hostname (NetworkOnMainThreadException) */ + return null; + } + } + } + return set; + } + + /** + * Add a range to this set. Automatically gets merged with existing ranges. + */ + public void add(IPRange range) + { + if (mRanges.contains(range)) + { + return; + } + reinsert: + while (true) + { + Iterator iterator = mRanges.iterator(); + while (iterator.hasNext()) + { + IPRange existing = iterator.next(); + IPRange replacement = existing.merge(range); + if (replacement != null) + { + iterator.remove(); + range = replacement; + continue reinsert; + } + } + mRanges.add(range); + break; + } + } + + /** + * Add all ranges from the given set. + */ + public void add(IPRangeSet ranges) + { + if (ranges == this) + { + return; + } + for (IPRange range : ranges.mRanges) + { + add(range); + } + } + + /** + * Add all ranges from the given collection to this set. + */ + public void addAll(Collection coll) + { + for (IPRange range : coll) + { + add(range); + } + } + + /** + * Remove the given range from this set. Existing ranges are automatically adjusted. + */ + public void remove(IPRange range) + { + ArrayList additions = new ArrayList<>(); + Iterator iterator = mRanges.iterator(); + while (iterator.hasNext()) + { + IPRange existing = iterator.next(); + List result = existing.remove(range); + if (result.size() == 0) + { + iterator.remove(); + } + else if (!result.get(0).equals(existing)) + { + iterator.remove(); + additions.addAll(result); + } + } + mRanges.addAll(additions); + } + + /** + * Remove the given ranges from ranges in this set. + */ + public void remove(IPRangeSet ranges) + { + if (ranges == this) + { + mRanges.clear(); + return; + } + for (IPRange range : ranges.mRanges) + { + remove(range); + } + } + + /** + * Get all the subnets derived from all the ranges in this set. + */ + public Iterable subnets() + { + return new Iterable() + { + @Override + public Iterator iterator() + { + return new Iterator() + { + private Iterator mIterator = mRanges.iterator(); + private List mSubnets; + + @Override + public boolean hasNext() + { + return (mSubnets != null && mSubnets.size() > 0) || mIterator.hasNext(); + } + + @Override + public IPRange next() + { + if (mSubnets == null || mSubnets.size() == 0) + { + IPRange range = mIterator.next(); + mSubnets = range.toSubnets(); + } + return mSubnets.remove(0); + } + + @Override + public void remove() + { + throw new UnsupportedOperationException(); + } + }; + } + }; + } + + @Override + public Iterator iterator() + { + return mRanges.iterator(); + } + + /** + * Returns the number of ranges, not subnets. + */ + public int size() + { + return mRanges.size(); + } + + @Override + public String toString() + { /* we could use TextUtils, but that causes the unit tests to fail */ + StringBuilder sb = new StringBuilder(); + for (IPRange range : mRanges) + { + if (sb.length() > 0) + { + sb.append(" "); + } + sb.append(range.toString()); + } + return sb.toString(); + } +} diff --git a/client/android/src/com/wireguard/config/Utils.java b/client/android/src/com/wireguard/config/Utils.java new file mode 100644 index 000000000..58b2eb5f3 --- /dev/null +++ b/client/android/src/com/wireguard/config/Utils.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2014-2019 Tobias Brunner + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +package com.wireguard.config; + + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class Utils +{ + static final char[] HEXDIGITS = "0123456789abcdef".toCharArray(); + + /** + * Converts the given byte array to a hexadecimal string encoding. + * + * @param bytes byte array to convert + * @return hex string + */ + public static String bytesToHex(byte[] bytes) + { + char[] hex = new char[bytes.length * 2]; + for (int i = 0; i < bytes.length; i++) + { + int value = bytes[i]; + hex[i*2] = HEXDIGITS[(value & 0xf0) >> 4]; + hex[i*2+1] = HEXDIGITS[ value & 0x0f]; + } + return new String(hex); + } + + /** + * Validate the given proposal string + * + * @param ike true for IKE, false for ESP + * @param proposal proposal string + * @return true if valid + */ + public native static boolean isProposalValid(boolean ike, String proposal); + + /** + * Parse an IP address without doing a name lookup + * + * @param address IP address string + * @return address bytes if valid + */ + private native static byte[] parseInetAddressBytes(String address); + + /** + * Parse an IP address without doing a name lookup (as compared to InetAddress.fromName()) + * + * @param address IP address string + * @return address if valid + * @throws UnknownHostException if address is invalid + */ + public static InetAddress parseInetAddress(String address) throws UnknownHostException + { + byte[] bytes = parseInetAddressBytes(address); + if (bytes == null) + { + throw new UnknownHostException(); + } + return InetAddress.getByAddress(bytes); + } +} diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/VPNService.kt index 047192a67..da7391b2d 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/VPNService.kt @@ -564,6 +564,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { return parseData } + /** * Create a Wireguard [Config] from a [json] string - * The [json] will be created in AndroidVpnProtocol.cpp @@ -578,47 +579,67 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { val peerBuilder = Peer.Builder() val peerConfig = config["Peer"]!! peerBuilder.setPublicKey(Key.fromBase64(peerConfig["PublicKey"])) - peerConfig["PresharedKey"]?.let { - peerBuilder.setPreSharedKey(Key.fromBase64(it)) + peerConfig["PresharedKey"]?.let { peerBuilder.setPreSharedKey(Key.fromBase64(it)) } + + val allIpString = peerConfig["AllowedIPs"] + + var allowedIPList = peerConfig["AllowedIPs"]?.split(",") ?: emptyList() + + /* default value in template */ + if (allIpString == "0.0.0.0/0, ::/0") { + allowedIPList = emptyList() } - val allowedIPList = peerConfig["AllowedIPs"]?.split(",") ?: emptyList() - - Log.e(tag, "splitTunnelSites $splitTunnelSites") - for (i in 0 until splitTunnelSites.length()) { - val site = splitTunnelSites.getString(i) - if (site.contains("\\/")) { - val internet = InetNetwork.parse(site + "\\32") - peerBuilder.addAllowedIp(internet) + + if (allowedIPList.isEmpty() && (splitTunnelType == 0)) { + /* AllowedIP is empty and splitTunnel is turnoff */ + /* use VPN for whole Internet */ + val internetV4 = InetNetwork.parse("0.0.0.0/0") // aka The whole internet. + peerBuilder.addAllowedIp(internetV4) + val internetV6 = InetNetwork.parse("::/0") // aka The whole internet. + peerBuilder.addAllowedIp(internetV6) + } else { + if (!allowedIPList.isEmpty()) { + /* We have predefined AllowedIP in WG config */ + /* It's have higher priority than system SplitTunnel */ + allowedIPList.forEach { + val network = InetNetwork.parse(it.trim()) + peerBuilder.addAllowedIp(network) + } } else { - val internet = InetNetwork.parse(site) - peerBuilder.addAllowedIp(internet) + if (splitTunnelType == 1) { + /* Use system SplitTunnel */ + /* VPN connection used only for defined IPs */ + for (i in 0 until splitTunnelSites.length()) { + val site = splitTunnelSites.getString(i) + Log.e(tag, "splitTunnelSites $site") + if (site.contains("\\/")) { + val internet = InetNetwork.parse(site + "\\32") + peerBuilder.addAllowedIp(internet) + } else { + val internet = InetNetwork.parse(site) + peerBuilder.addAllowedIp(internet) + } + } + } + if (splitTunnelType == 2) { + /* Use system SplitTunnel */ + /* VPN connection used for all Internet exclude defined IPs */ + val ipRangeSet = IPRangeSet.fromString("0.0.0.0/0") + ipRangeSet.remove(IPRange("127.0.0.0/8")) + for (i in 0 until splitTunnelSites.length()) { + val site = splitTunnelSites.getString(i) + ipRangeSet.remove(IPRange(site)) + } + val allowedIps = ipRangeSet.subnets().joinToString(", ") + ", 2000::/3" + Log.e(tag, "allowedIps $allowedIps") + peerBuilder.parseAllowedIPs(allowedIps) + } } - Log.e(tag, "splitTunnelSites $site") } - - // if (allowedIPList.isEmpty() /*&& splitTunnelType.equals("0", true) */) { - // Log.e(tag, "splitTunnelSites $splitTunnelSites") - // for (i in 0 until splitTunnelSites.length()) { - // val site = splitTunnelSites.getString(i) - // Log.e(tag, "splitTunnelSites $site") - // } - - // val internet = InetNetwork.parse("0.0.0.0/0") // aka The whole internet. - // peerBuilder.addAllowedIp(internet) - // } else { - - - // allowedIPList.forEach { - // val network = InetNetwork.parse(it.trim()) - // peerBuilder.addAllowedIp(network) - // } - // } val endpointConfig = peerConfig["Endpoint"] val endpoint = InetEndpoint.parse(endpointConfig) peerBuilder.setEndpoint(endpoint) - peerConfig["PersistentKeepalive"]?.let { - peerBuilder.setPersistentKeepalive(it.toInt()) - } + peerConfig["PersistentKeepalive"]?.let { peerBuilder.setPersistentKeepalive(it.toInt()) } confBuilder.addPeer(peerBuilder.build()) val ifaceBuilder = Interface.Builder() @@ -628,7 +649,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { ifaceConfig["DNS"]!!.split(",").forEach { ifaceBuilder.addDnsServer(InetNetwork.parse(it.trim()).address) } - + ifaceBuilder.parsePrivateKey(ifaceConfig["PrivateKey"]) if (type == "awg_config_data") { ifaceBuilder.parseJc(ifaceConfig["Jc"]) @@ -649,14 +670,13 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { ifaceBuilder.parseH1("0") ifaceBuilder.parseH2("0") ifaceBuilder.parseH3("0") - ifaceBuilder.parseH4("0") - + ifaceBuilder.parseH4("0") } /*val jExcludedApplication = obj.getJSONArray("excludedApps") - (0 until jExcludedApplication.length()).toList().forEach { + (0 until jExcludedApplication.length()).toList().forEach { val appName = jExcludedApplication.get(it).toString() ifaceBuilder.excludeApplication(appName) - }*/ + }*/ confBuilder.setInterface(ifaceBuilder.build()) return confBuilder.build() @@ -771,7 +791,6 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { private fun startWireGuard(type: String) { val wireguard_conf = buildWireguardConfig(mConfig!!, type + "_config_data") - Log.i(tag, "startWireGuard: wireguard_conf : $wireguard_conf") if (currentTunnelHandle != -1) { Log.e(tag, "Tunnel already up") // Turn the tunnel down because this might be a switch @@ -779,8 +798,6 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { } val wgConfig: String = wireguard_conf.toWgUserspaceString() - Log.e(tag, "wgConfig : $wgConfig") - val builder = Builder() setupBuilder(wireguard_conf, builder) builder.setSession("Amnezia") diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index 5c4004ad6..8b2792cb6 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -127,7 +127,7 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) if (m_settings->routeMode() == Settings::VpnAllSites) { qDebug() << "Settings::VpnAllSites"; - //config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); + config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); config.append("block-ipv6\n"); @@ -140,7 +140,7 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) if (m_settings->routeMode() == Settings::VpnAllExceptSites) { qDebug() << "Settings::VpnAllExceptSites"; - //config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); + config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); config.append("block-ipv6\n"); diff --git a/client/settings.cpp b/client/settings.cpp index 93871834f..c6db0b639 100644 --- a/client/settings.cpp +++ b/client/settings.cpp @@ -234,7 +234,7 @@ QString Settings::routeModeString(RouteMode mode) const Settings::RouteMode Settings::routeMode() const { // TODO implement for mobiles -#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) +#if defined(Q_OS_IOS) return RouteMode::VpnAllSites; #endif return static_cast(m_settings.value("Conf/routeMode", 0).toInt()); From c14f1b5000476f05e031e6da93f46f27286b2721 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 17 Oct 2023 16:39:56 -0400 Subject: [PATCH 005/144] Android OpenVPN/Cloak Split tunnel --- .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 59 ++++++++----------- .../android/src/org/amnezia/vpn/VPNService.kt | 9 +-- client/configurators/openvpn_configurator.cpp | 6 +- 3 files changed, 29 insertions(+), 45 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index 20869e486..a59dff6a3 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -16,6 +16,8 @@ import com.wireguard.crypto.Key import org.json.JSONObject import java.util.Base64 +import com.wireguard.config.* + import net.openvpn.ovpn3.ClientAPI_Config import net.openvpn.ovpn3.ClientAPI_EvalConfig import net.openvpn.ovpn3.ClientAPI_Event @@ -147,45 +149,34 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna override fun tun_builder_establish(): Int { Log.v(tag, "tun_builder_establish") - val Fd = mService.establish()!!.detachFd() - val jsonVpnConfig = mService.getVpnConfig() - + val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType") val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites") - - Log.e(tag, "splitTunnelSites $splitTunnelSites") - for (i in 0 until splitTunnelSites.length()) { - val site = splitTunnelSites.getString(i) - if (site.contains("\\/")) { - Log.e(tag, "site $site rawMask 32") - mService.addRoute(site, 32) - } else { - var slash = site.lastIndexOf('/'); - var maskString: String = "" - var rawMask = 32 - var rawAddress: String = "" - if (slash >= 0) { - maskString = site.substring(slash + 1) - try { - rawMask = Integer.parseInt(maskString, 10) - } catch (e: Exception) { - - } - rawAddress = site.substring(0, slash) - } else { - maskString = "" - rawMask = 32 - rawAddress = site - } - Log.e(tag, "rawAddress $rawAddress rawMask $rawMask") - mService.addRoute(rawAddress, rawMask) - //val internet = InetNetwork.parse(site) - //peerBuilder.addAllowedIp(internet) + if (splitTunnelType == 1) { + for (i in 0 until splitTunnelSites.length()) { + val site = splitTunnelSites.getString(i) + val ipRange = IPRange(site) + mService.addRoute(ipRange.getFrom().getHostAddress(), ipRange.getPrefix()) + Log.e(tag, "splitTunnelSites $ipRange") } - Log.e(tag, "splitTunnelSites $site") } - + if (splitTunnelType == 2) { + val ipRangeSet = IPRangeSet.fromString("0.0.0.0/0") + ipRangeSet.remove(IPRange("127.0.0.0/8")) + for (i in 0 until splitTunnelSites.length()) { + val site = splitTunnelSites.getString(i) + ipRangeSet.remove(IPRange(site)) + } + ipRangeSet.subnets().forEach { + mService.addRoute(it.getFrom().getHostAddress(), it.getPrefix()) + Thread.sleep(100) + Log.e(tag, "splitTunnelSites $it") + } + mService.addRoute("2000::", 3) + } + val Fd = mService.establish()!!.detachFd() + return Fd } diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/VPNService.kt index da7391b2d..ca4681089 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/VPNService.kt @@ -612,13 +612,8 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { for (i in 0 until splitTunnelSites.length()) { val site = splitTunnelSites.getString(i) Log.e(tag, "splitTunnelSites $site") - if (site.contains("\\/")) { - val internet = InetNetwork.parse(site + "\\32") - peerBuilder.addAllowedIp(internet) - } else { - val internet = InetNetwork.parse(site) - peerBuilder.addAllowedIp(internet) - } + val internet = InetNetwork.parse(site) + peerBuilder.addAllowedIp(internet) } } if (splitTunnelType == 2) { diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index 8b2792cb6..cc5c30e57 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -125,8 +125,6 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) config.replace(regex, ""); if (m_settings->routeMode() == Settings::VpnAllSites) { - qDebug() << "Settings::VpnAllSites"; - config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); @@ -138,9 +136,9 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) // no redirect-gateway } if (m_settings->routeMode() == Settings::VpnAllExceptSites) { - qDebug() << "Settings::VpnAllExceptSites"; - +#ifndef Q_OS_ANDROID config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); +#endif // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); config.append("block-ipv6\n"); From 4ea1a195723ce9657adff7e7828e1702c642c9f3 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Wed, 18 Oct 2023 13:41:58 -0400 Subject: [PATCH 006/144] Cleanup WG implementation --- .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 3 +- client/protocols/wireguardprotocol.cpp | 193 +----------------- client/protocols/wireguardprotocol.h | 13 -- 3 files changed, 4 insertions(+), 205 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index a59dff6a3..d96131af2 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -175,9 +175,8 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna } mService.addRoute("2000::", 3) } - val Fd = mService.establish()!!.detachFd() - return Fd + return mService.establish()!!.detachFd() } override fun tun_builder_add_address(address: String , prefix_length: Int , gateway: String , ipv6:Boolean , net30: Boolean ): Boolean { diff --git a/client/protocols/wireguardprotocol.cpp b/client/protocols/wireguardprotocol.cpp index d675cd02e..3b95a41a9 100644 --- a/client/protocols/wireguardprotocol.cpp +++ b/client/protocols/wireguardprotocol.cpp @@ -16,8 +16,6 @@ WireguardProtocol::WireguardProtocol(const QJsonObject &configuration, QObject * m_configFile.setFileName(QDir::tempPath() + QDir::separator() + serviceName() + ".conf"); writeWireguardConfiguration(configuration); - // MZ -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) || defined(Q_OS_LINUX) m_impl.reset(new LocalSocketController()); connect(m_impl.get(), &ControllerImpl::connected, this, [this](const QString &pubkey, const QDateTime &connectionTimestamp) { @@ -26,7 +24,6 @@ WireguardProtocol::WireguardProtocol(const QJsonObject &configuration, QObject * connect(m_impl.get(), &ControllerImpl::disconnected, this, [this]() { emit connectionStateChanged(Vpn::ConnectionState::Disconnected); }); m_impl->initialize(nullptr, nullptr); -#endif } WireguardProtocol::~WireguardProtocol() @@ -37,68 +34,10 @@ WireguardProtocol::~WireguardProtocol() void WireguardProtocol::stop() { -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) || defined(Q_OS_LINUX) stopMzImpl(); return; -#endif - - if (!QFileInfo::exists(Utils::wireguardExecPath())) { - qCritical() << "Wireguard executable missing!"; - setLastError(ErrorCode::ExecutableMissing); - return; - } - - m_wireguardStopProcess = IpcClient::CreatePrivilegedProcess(); - - if (!m_wireguardStopProcess) { - qCritical() << "IpcProcess replica is not created!"; - setLastError(ErrorCode::AmneziaServiceConnectionFailed); - return; - } - - m_wireguardStopProcess->waitForSource(1000); - if (!m_wireguardStopProcess->isInitialized()) { - qWarning() << "IpcProcess replica is not connected!"; - setLastError(ErrorCode::AmneziaServiceConnectionFailed); - return; - } - - m_wireguardStopProcess->setProgram(PermittedProcess::Wireguard); - - m_wireguardStopProcess->setArguments(stopArgs()); - qDebug() << stopArgs().join(" "); - - connect(m_wireguardStopProcess.data(), &PrivilegedProcess::errorOccurred, this, [this](QProcess::ProcessError error) { - qDebug() << "WireguardProtocol::WireguardProtocol Stop errorOccurred" << error; - setConnectionState(Vpn::ConnectionState::Disconnected); - }); - - connect(m_wireguardStopProcess.data(), &PrivilegedProcess::stateChanged, this, - [this](QProcess::ProcessState newState) { - qDebug() << "WireguardProtocol::WireguardProtocol Stop stateChanged" << newState; - }); - -#ifdef Q_OS_LINUX - if (IpcClient::Interface()) { - QRemoteObjectPendingReply result = IpcClient::Interface()->isWireguardRunning(); - if (result.returnValue()) { - setConnectionState(Vpn::ConnectionState::Disconnected); - return; - } - } else { - qCritical() << "IPC client not initialized"; - setConnectionState(Vpn::ConnectionState::Disconnected); - return; - } -#endif - - m_wireguardStopProcess->start(); - m_wireguardStopProcess->waitForFinished(10000); - - setConnectionState(Vpn::ConnectionState::Disconnected); } -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) || defined(Q_OS_LINUX) ErrorCode WireguardProtocol::startMzImpl() { m_impl->activate(m_rawConfig); @@ -110,7 +49,6 @@ ErrorCode WireguardProtocol::stopMzImpl() m_impl->deactivate(); return ErrorCode::NoError; } -#endif void WireguardProtocol::writeWireguardConfiguration(const QJsonObject &configuration) { @@ -124,21 +62,8 @@ void WireguardProtocol::writeWireguardConfiguration(const QJsonObject &configura m_configFile.write(jConfig.value(config_key::config).toString().toUtf8()); m_configFile.close(); -#if 0 - if (IpcClient::Interface()) { - QRemoteObjectPendingReply result = IpcClient::Interface()->copyWireguardConfig(m_configFile.fileName()); - if (result.returnValue()) { - qCritical() << "Failed to copy wireguard config"; - return; - } - } else { - qCritical() << "IPC client not initialized"; - return; - } - m_configFileName = "/etc/wireguard/wg99.conf"; -#else + m_configFileName = m_configFile.fileName(); -#endif m_isConfigLoaded = true; @@ -152,15 +77,9 @@ QString WireguardProtocol::configPath() const return m_configFileName; } -void WireguardProtocol::updateRouteGateway(QString line) +QString WireguardProtocol::serviceName() const { - // TODO: fix for macos - line = line.split("ROUTE_GATEWAY", Qt::SkipEmptyParts).at(1); - if (!line.contains("/")) - return; - m_routeGateway = line.split("/", Qt::SkipEmptyParts).first(); - m_routeGateway.replace(" ", ""); - qDebug() << "Set VPN route gateway" << m_routeGateway; + return "AmneziaVPN.WireGuard0"; } ErrorCode WireguardProtocol::start() @@ -170,112 +89,6 @@ ErrorCode WireguardProtocol::start() return lastError(); } -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) || defined(Q_OS_LINUX) return startMzImpl(); -#endif - - if (!QFileInfo::exists(Utils::wireguardExecPath())) { - setLastError(ErrorCode::ExecutableMissing); - return lastError(); - } - - if (IpcClient::Interface()) { - QRemoteObjectPendingReply result = IpcClient::Interface()->isWireguardConfigExists(configPath()); - if (result.returnValue()) { - setLastError(ErrorCode::ConfigMissing); - return lastError(); - } - } else { - qCritical() << "IPC client not initialized"; - setLastError(ErrorCode::InternalError); - return lastError(); - } - - setConnectionState(Vpn::ConnectionState::Connecting); - - m_wireguardStartProcess = IpcClient::CreatePrivilegedProcess(); - - if (!m_wireguardStartProcess) { - setLastError(ErrorCode::AmneziaServiceConnectionFailed); - return ErrorCode::AmneziaServiceConnectionFailed; - } - - m_wireguardStartProcess->waitForSource(1000); - if (!m_wireguardStartProcess->isInitialized()) { - qWarning() << "IpcProcess replica is not connected!"; - setLastError(ErrorCode::AmneziaServiceConnectionFailed); - return ErrorCode::AmneziaServiceConnectionFailed; - } - - m_wireguardStartProcess->setProgram(PermittedProcess::Wireguard); - - m_wireguardStartProcess->setArguments(startArgs()); - qDebug() << startArgs().join(" "); - - connect(m_wireguardStartProcess.data(), &PrivilegedProcess::errorOccurred, this, [this](QProcess::ProcessError error) { - qDebug() << "WireguardProtocol::WireguardProtocol errorOccurred" << error; - setConnectionState(Vpn::ConnectionState::Disconnected); - }); - - connect(m_wireguardStartProcess.data(), &PrivilegedProcess::stateChanged, this, - [this](QProcess::ProcessState newState) { - qDebug() << "WireguardProtocol::WireguardProtocol stateChanged" << newState; - }); - - connect(m_wireguardStartProcess.data(), &PrivilegedProcess::finished, this, - [this]() { setConnectionState(Vpn::ConnectionState::Connected); }); - - connect(m_wireguardStartProcess.data(), &PrivilegedProcess::readyRead, this, [this]() { - QRemoteObjectPendingReply reply = m_wireguardStartProcess->readAll(); - reply.waitForFinished(1000); - qDebug() << "WireguardProtocol::WireguardProtocol readyRead" << reply.returnValue(); - }); - - connect(m_wireguardStartProcess.data(), &PrivilegedProcess::readyReadStandardOutput, this, [this]() { - QRemoteObjectPendingReply reply = m_wireguardStartProcess->readAllStandardOutput(); - reply.waitForFinished(1000); - qDebug() << "WireguardProtocol::WireguardProtocol readAllStandardOutput" << reply.returnValue(); - }); - - connect(m_wireguardStartProcess.data(), &PrivilegedProcess::readyReadStandardError, this, [this]() { - QRemoteObjectPendingReply reply = m_wireguardStartProcess->readAllStandardError(); - reply.waitForFinished(10); - qDebug() << "WireguardProtocol::WireguardProtocol readAllStandardError" << reply.returnValue(); - }); - - m_wireguardStartProcess->start(); - m_wireguardStartProcess->waitForFinished(10000); - - return ErrorCode::NoError; -} - -void WireguardProtocol::updateVpnGateway(const QString &line) -{ } -QString WireguardProtocol::serviceName() const -{ - return "AmneziaVPN.WireGuard0"; -} - -QStringList WireguardProtocol::stopArgs() -{ -#ifdef Q_OS_WIN - return { "--remove", configPath() }; -#elif defined Q_OS_LINUX - return { "down", "wg99" }; -#else - return {}; -#endif -} - -QStringList WireguardProtocol::startArgs() -{ -#ifdef Q_OS_WIN - return { "--add", configPath() }; -#elif defined Q_OS_LINUX - return { "up", "wg99" }; -#else - return {}; -#endif -} diff --git a/client/protocols/wireguardprotocol.h b/client/protocols/wireguardprotocol.h index dea8d6d9d..4a6ae1e6f 100644 --- a/client/protocols/wireguardprotocol.h +++ b/client/protocols/wireguardprotocol.h @@ -8,7 +8,6 @@ #include #include "vpnprotocol.h" -#include "core/ipcclient.h" #include "mozilla/controllerimpl.h" @@ -23,33 +22,21 @@ class WireguardProtocol : public VpnProtocol ErrorCode start() override; void stop() override; -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) || defined(Q_OS_LINUX) ErrorCode startMzImpl(); ErrorCode stopMzImpl(); -#endif private: QString configPath() const; void writeWireguardConfiguration(const QJsonObject &configuration); - - void updateRouteGateway(QString line); - void updateVpnGateway(const QString &line); QString serviceName() const; - QStringList stopArgs(); - QStringList startArgs(); private: QString m_configFileName; QFile m_configFile; - QSharedPointer m_wireguardStartProcess; - QSharedPointer m_wireguardStopProcess; - bool m_isConfigLoaded = false; -#if defined(Q_OS_MAC) || defined(Q_OS_WIN) || defined(Q_OS_LINUX) QScopedPointer m_impl; -#endif }; #endif // WIREGUARDPROTOCOL_H From 32c304dc1b16bc8aebf95e2cfa35a07da0f8fa59 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Wed, 18 Oct 2023 17:44:28 -0400 Subject: [PATCH 007/144] WG/AWG SplitTunnel for desktop --- client/mozilla/localsocketcontroller.cpp | 53 +++++++++++++++---- .../linux/daemon/linuxroutemonitor.cpp | 14 ++--- client/vpnconnection.cpp | 2 +- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index 2f6fe3713..b7012dd83 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -115,8 +115,12 @@ void LocalSocketController::daemonConnected() { } void LocalSocketController::activate(const QJsonObject &rawConfig) { + QString protocolName = rawConfig.value("protocol").toString(); + int splitTunnelType = rawConfig.value("splitTunnelType").toInt(); + QJsonArray splitTunnelSites = rawConfig.value("splitTunnelSites").toArray(); + QJsonObject wgConfig = rawConfig.value(protocolName + "_config_data").toObject(); QJsonObject json; @@ -137,23 +141,52 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { QJsonArray jsAllowedIPAddesses; - QJsonObject range_ipv4; - range_ipv4.insert("address", "0.0.0.0"); - range_ipv4.insert("range", 0); - range_ipv4.insert("isIpv6", false); - jsAllowedIPAddesses.append(range_ipv4); + if (splitTunnelType == 0 || splitTunnelType == 2) { + QJsonObject range_ipv4; + range_ipv4.insert("address", "0.0.0.0"); + range_ipv4.insert("range", 0); + range_ipv4.insert("isIpv6", false); + jsAllowedIPAddesses.append(range_ipv4); + + QJsonObject range_ipv6; + range_ipv6.insert("address", "::"); + range_ipv6.insert("range", 0); + range_ipv6.insert("isIpv6", true); + jsAllowedIPAddesses.append(range_ipv6); + } - QJsonObject range_ipv6; - range_ipv6.insert("address", "::"); - range_ipv6.insert("range", 0); - range_ipv6.insert("isIpv6", true); - jsAllowedIPAddesses.append(range_ipv6); + if (splitTunnelType == 1) { + for (auto v : splitTunnelSites) { + QString ipRange = v.toString(); + qDebug() << "ipRange " << ipRange; + if (ipRange.split('/').size() > 1){ + QJsonObject range; + range.insert("address", ipRange.split('/')[0]); + range.insert("range", atoi(ipRange.split('/')[1].toLocal8Bit())); + range.insert("isIpv6", false); + jsAllowedIPAddesses.append(range); + } else { + QJsonObject range; + range.insert("address",ipRange); + range.insert("range", 32); + range.insert("isIpv6", false); + jsAllowedIPAddesses.append(range); + } + } + } json.insert("allowedIPAddressRanges", jsAllowedIPAddesses); QJsonArray jsExcludedAddresses; jsExcludedAddresses.append(wgConfig.value(amnezia::config_key::hostName)); + if (splitTunnelType == 2) { + for (auto v : splitTunnelSites) { + QString ipRange = v.toString(); + jsExcludedAddresses.append(ipRange); + } + } + json.insert("excludedAddresses", jsExcludedAddresses); diff --git a/client/platforms/linux/daemon/linuxroutemonitor.cpp b/client/platforms/linux/daemon/linuxroutemonitor.cpp index f0c49eb6e..38f2c56c9 100644 --- a/client/platforms/linux/daemon/linuxroutemonitor.cpp +++ b/client/platforms/linux/daemon/linuxroutemonitor.cpp @@ -158,15 +158,15 @@ bool LinuxRouteMonitor::rtmSendRoute(int action, int flags, int type, return false; } nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_OIF, index); + nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_PRIORITY, 1); } if (rtm->rtm_type == RTN_THROW) { - int index = if_nametoindex(getgatewayandiface().toUtf8()); - if (index <= 0) { - logger.error() << "if_nametoindex() failed:" << strerror(errno); - return false; - } - nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_OIF, index); + struct in_addr ip4; + inet_pton(AF_INET, getgatewayandiface().toUtf8(), &ip4); + nlmsg_append_attr(nlmsg, sizeof(buf), RTA_GATEWAY, &ip4, sizeof(ip4)); + nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_PRIORITY, 0); + rtm->rtm_type = RTN_UNICAST; } struct sockaddr_nl nladdr; @@ -334,7 +334,7 @@ QString LinuxRouteMonitor::getgatewayandiface() } } close(sock); - return interface; + return gateway_address; } static bool buildAllowedIp(wg_allowedip* ip, diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index c73df4447..878a1cde5 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -68,7 +68,7 @@ void VpnConnection::onConnectionStateChanged(Vpn::ConnectionState state) // qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size(); } QString dns1 = m_vpnConfiguration.value(config_key::dns1).toString(); - QString dns2 = m_vpnConfiguration.value(config_key::dns1).toString(); + QString dns2 = m_vpnConfiguration.value(config_key::dns2).toString(); IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << dns1 << dns2); From 414a47e2f2ec852ebae91e1520a511ea6ad63fd0 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Thu, 19 Oct 2023 14:50:51 -0400 Subject: [PATCH 008/144] WG/AWG Desktop AllowedIP from plain WG config --- client/mozilla/localsocketcontroller.cpp | 85 ++++++++++++++-------- client/ui/controllers/importController.cpp | 7 +- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index b7012dd83..cc1d6688c 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -141,36 +141,63 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { QJsonArray jsAllowedIPAddesses; - if (splitTunnelType == 0 || splitTunnelType == 2) { - QJsonObject range_ipv4; - range_ipv4.insert("address", "0.0.0.0"); - range_ipv4.insert("range", 0); - range_ipv4.insert("isIpv6", false); - jsAllowedIPAddesses.append(range_ipv4); - - QJsonObject range_ipv6; - range_ipv6.insert("address", "::"); - range_ipv6.insert("range", 0); - range_ipv6.insert("isIpv6", true); - jsAllowedIPAddesses.append(range_ipv6); - } + QJsonArray plainAllowedIP = wgConfig.value(amnezia::config_key::allowed_ips).toArray(); + QJsonArray defaultAllowedIP = QJsonArray::fromStringList(QString("0.0.0.0/0, ::/0").split(",")); + + if (plainAllowedIP != defaultAllowedIP) { + // Use AllowedIP list from WG config bacouse of higer priority + + for (auto v : plainAllowedIP) { + QString ipRange = v.toString(); + qDebug() << "ipRange " << ipRange; + if (ipRange.split('/').size() > 1){ + QJsonObject range; + range.insert("address", ipRange.split('/')[0]); + range.insert("range", atoi(ipRange.split('/')[1].toLocal8Bit())); + range.insert("isIpv6", false); + jsAllowedIPAddesses.append(range); + } else { + QJsonObject range; + range.insert("address",ipRange); + range.insert("range", 32); + range.insert("isIpv6", false); + jsAllowedIPAddesses.append(range); + } + } + } else { + + // Use APP split tunnel + if (splitTunnelType == 0 || splitTunnelType == 2) { + QJsonObject range_ipv4; + range_ipv4.insert("address", "0.0.0.0"); + range_ipv4.insert("range", 0); + range_ipv4.insert("isIpv6", false); + jsAllowedIPAddesses.append(range_ipv4); + + QJsonObject range_ipv6; + range_ipv6.insert("address", "::"); + range_ipv6.insert("range", 0); + range_ipv6.insert("isIpv6", true); + jsAllowedIPAddesses.append(range_ipv6); + } - if (splitTunnelType == 1) { - for (auto v : splitTunnelSites) { - QString ipRange = v.toString(); - qDebug() << "ipRange " << ipRange; - if (ipRange.split('/').size() > 1){ - QJsonObject range; - range.insert("address", ipRange.split('/')[0]); - range.insert("range", atoi(ipRange.split('/')[1].toLocal8Bit())); - range.insert("isIpv6", false); - jsAllowedIPAddesses.append(range); - } else { - QJsonObject range; - range.insert("address",ipRange); - range.insert("range", 32); - range.insert("isIpv6", false); - jsAllowedIPAddesses.append(range); + if (splitTunnelType == 1) { + for (auto v : splitTunnelSites) { + QString ipRange = v.toString(); + qDebug() << "ipRange " << ipRange; + if (ipRange.split('/').size() > 1){ + QJsonObject range; + range.insert("address", ipRange.split('/')[0]); + range.insert("range", atoi(ipRange.split('/')[1].toLocal8Bit())); + range.insert("isIpv6", false); + jsAllowedIPAddesses.append(range); + } else { + QJsonObject range; + range.insert("address",ipRange); + range.insert("range", 32); + range.insert("isIpv6", false); + jsAllowedIPAddesses.append(range); + } } } } diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index 044ddb37f..de8c003e6 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -263,11 +263,8 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data) // return QJsonObject(); // } - auto allowedIps = configMap.value("AllowedIPs").split(","); - QJsonArray allowedIpsJsonArray; - for (const auto &allowedIp : allowedIps) { - allowedIpsJsonArray.append(allowedIp); - } + QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(configMap.value("AllowedIPs").split(",")); + lastConfig[config_key::allowed_ips] = allowedIpsJsonArray; QString protocolName = "wireguard"; From 78c83b2e216d1db2465f661771cc11bdba74d9ce Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Thu, 19 Oct 2023 17:03:24 -0400 Subject: [PATCH 009/144] Some logic fix --- client/mozilla/localsocketcontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index cc1d6688c..56178eeb9 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -144,7 +144,7 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { QJsonArray plainAllowedIP = wgConfig.value(amnezia::config_key::allowed_ips).toArray(); QJsonArray defaultAllowedIP = QJsonArray::fromStringList(QString("0.0.0.0/0, ::/0").split(",")); - if (plainAllowedIP != defaultAllowedIP) { + if (plainAllowedIP != defaultAllowedIP && !plainAllowedIP.isEmpty()) { // Use AllowedIP list from WG config bacouse of higer priority for (auto v : plainAllowedIP) { From 0c33432436485c06a9ad98a71f77f0e933a2a1d6 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Sat, 21 Oct 2023 14:55:15 -0400 Subject: [PATCH 010/144] Fix pulling exiting AWG config from server --- client/configurators/awg_configurator.cpp | 4 +-- client/core/servercontroller.cpp | 30 ++++++++++++----------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/client/configurators/awg_configurator.cpp b/client/configurators/awg_configurator.cpp index 8962067a8..2bf033590 100644 --- a/client/configurators/awg_configurator.cpp +++ b/client/configurators/awg_configurator.cpp @@ -16,8 +16,6 @@ QString AwgConfigurator::genAwgConfig(const ServerCredentials &credentials, { QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode); - QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object(); - ServerController serverController(m_settings); QString serverConfig = serverController.getTextFileFromContainer(container, credentials, protocols::awg::serverConfigPath, errorCode); @@ -45,6 +43,8 @@ QString AwgConfigurator::genAwgConfig(const ServerCredentials &credentials, config.replace("$UNDERLOAD_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::underloadPacketMagicHeader)); config.replace("$TRANSPORT_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::transportPacketMagicHeader)); + QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object(); + jsonConfig[config_key::junkPacketCount] = serverConfigMap.value(config_key::junkPacketCount); jsonConfig[config_key::junkPacketMinSize] = serverConfigMap.value(config_key::junkPacketMinSize); jsonConfig[config_key::junkPacketMaxSize] = serverConfigMap.value(config_key::junkPacketMaxSize); diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 443cd5a32..082e1338b 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -591,20 +591,22 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({ { "$AWG_SERVER_PORT", amneziaWireguarConfig.value(config_key::port).toString(protocols::awg::defaultPort) } }); - vars.append({ { "$JUNK_PACKET_COUNT", amneziaWireguarConfig.value(config_key::junkPacketCount).toString() } }); - vars.append({ { "$JUNK_PACKET_MIN_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMinSize).toString() } }); - vars.append({ { "$JUNK_PACKET_MAX_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMaxSize).toString() } }); - vars.append({ { "$INIT_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::initPacketJunkSize).toString() } }); - vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", - amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } }); - vars.append({ { "$INIT_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } }); - vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); - vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); - vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); + if (!amneziaWireguarConfig.value(config_key::junkPacketCount).toString().isEmpty()){ + vars.append({ { "$JUNK_PACKET_COUNT", amneziaWireguarConfig.value(config_key::junkPacketCount).toString() } }); + vars.append({ { "$JUNK_PACKET_MIN_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMinSize).toString() } }); + vars.append({ { "$JUNK_PACKET_MAX_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMaxSize).toString() } }); + vars.append({ { "$INIT_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::initPacketJunkSize).toString() } }); + vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", + amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } }); + vars.append({ { "$INIT_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } }); + vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); + vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); + vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); + } QString serverIp = Utils::getIPAddress(credentials.hostName); if (!serverIp.isEmpty()) { From 6a12cad1c9741c5ea00614f0aac16264ed78b540 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 23 Oct 2023 21:30:30 +0500 Subject: [PATCH 011/144] fixed page return after installation --- client/ui/qml/Pages2/PageHome.qml | 2 +- client/ui/qml/Pages2/PageSetupWizardInstalling.qml | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index cc49e4f0b..222f7764c 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -32,7 +32,7 @@ PageType { function onRestorePageHomeState(isContainerInstalled) { buttonContent.state = "expanded" if (isContainerInstalled) { - containersDropDown.menuVisible = true + containersDropDown.rootButtonClickedFunction() } } function onForceCloseDrawer() { diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index a223f646e..c82ce855e 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -28,17 +28,11 @@ PageType { ContainersModel.setDefaultContainer(ContainersModel.getCurrentlyProcessedContainerIndex()) } - PageController.goToStartPage() + PageController.closePage() // close installing page + PageController.closePage() // close protocol settings page + if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageHome)) { PageController.restorePageHomeState(true) - } else if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageSettings)) { - PageController.goToPage(PageEnum.PageSettingsServersList, false) - PageController.goToPage(PageEnum.PageSettingsServerInfo, false) - if (isServiceInstall) { - PageController.goToPageSettingsServerServices() - } - } else { - PageController.goToPage(PageEnum.PageHome) } PageController.showNotificationMessage(finishedMessage) From 4ae9cddccefd7e3923f0b21d831ce94fd150a0fe Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 23 Oct 2023 21:43:25 +0500 Subject: [PATCH 012/144] fixed a typo in the serverController include --- client/configurators/awg_configurator.cpp | 2 +- client/core/controllers/serverController.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/configurators/awg_configurator.cpp b/client/configurators/awg_configurator.cpp index c3e42258c..9470308ae 100644 --- a/client/configurators/awg_configurator.cpp +++ b/client/configurators/awg_configurator.cpp @@ -3,7 +3,7 @@ #include #include -#include "core/servercontroller.h" +#include "core/controllers/serverController.h" AwgConfigurator::AwgConfigurator(std::shared_ptr settings, QObject *parent) : WireguardConfigurator(settings, true, parent) diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index cc81ed94e..5786fa680 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -1,4 +1,4 @@ -#include "servercontroller.h" +#include "serverController.h" #include #include From 3e03002eaded6f90041e1e4d321c1ee783d363e8 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 23 Oct 2023 23:55:01 +0500 Subject: [PATCH 013/144] added getting cloud config for cloak --- client/ui/controllers/cloudController.cpp | 29 +++++++++++++++++++---- client/ui/controllers/cloudController.h | 5 ++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/client/ui/controllers/cloudController.cpp b/client/ui/controllers/cloudController.cpp index 99309d90e..188e12e3c 100644 --- a/client/ui/controllers/cloudController.cpp +++ b/client/ui/controllers/cloudController.cpp @@ -31,8 +31,8 @@ QString CloudController::genCertificateRequest(ServiceTypeId serviceTypeId) { case ServiceTypeId::AmneziaFreeRuWG: return ""; case ServiceTypeId::AmneziaFreeRuCloak: { - auto data = OpenVpnConfigurator::createCertRequest(); - return data.request; + m_certRequest = OpenVpnConfigurator::createCertRequest(); + return m_certRequest.request; } case ServiceTypeId::AmneziaFreeRuAWG: return ""; case ServiceTypeId::AmneziaFreeRuReverseWG: return ""; @@ -41,6 +41,23 @@ QString CloudController::genCertificateRequest(ServiceTypeId serviceTypeId) } } +void CloudController::processCloudConfig(ServiceTypeId serviceTypeId, QString &config) +{ + switch (serviceTypeId) + { + case ServiceTypeId::AmneziaFreeRuWG: return; + case ServiceTypeId::AmneziaFreeRuCloak: { + config.replace("", "\n"); + config.replace("$OPENVPN_PRIV_KEY", m_certRequest.privKey); + return; + } + case ServiceTypeId::AmneziaFreeRuAWG: return; + case ServiceTypeId::AmneziaFreeRuReverseWG: return; + case ServiceTypeId::AmneziaFreeRuReverseCloak: return; + case ServiceTypeId::AmneziaFreeRuReverseAWG: return; + } +} + bool CloudController::updateServerConfigFromCloud() { auto serverConfig = m_serversModel->getDefaultServerConfig(); @@ -53,7 +70,7 @@ bool CloudController::updateServerConfigFromCloud() QNetworkRequest request; request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); QString endpoint = serverConfig.value(config_key::apiEdnpoint).toString(); - request.setUrl(endpoint.replace("https", "http")); // + request.setUrl(endpoint.replace("https", "http")); // todo remove ServiceTypeId serviceTypeId = static_cast(serverConfig.value(config_key::serviceTypeId).toInt()); @@ -85,7 +102,11 @@ bool CloudController::updateServerConfigFromCloud() ba = ba_uncompressed; } - QJsonObject cloudConfig = QJsonDocument::fromJson(ba).object(); + QString configStr = ba; + processCloudConfig(serviceTypeId, configStr); + + QJsonObject cloudConfig = QJsonDocument::fromJson(configStr.toUtf8()).object(); + serverConfig.insert("cloudConfig", cloudConfig); serverConfig.insert(config_key::dns1, cloudConfig.value(config_key::dns1)); serverConfig.insert(config_key::dns2, cloudConfig.value(config_key::dns2)); diff --git a/client/ui/controllers/cloudController.h b/client/ui/controllers/cloudController.h index 409e0981c..36c8427bf 100644 --- a/client/ui/controllers/cloudController.h +++ b/client/ui/controllers/cloudController.h @@ -5,6 +5,7 @@ #include "ui/models/containers_model.h" #include "ui/models/servers_model.h" +#include "configurators/openvpn_configurator.h" class CloudController : public QObject { @@ -36,8 +37,12 @@ public slots: QString genPublicKey(ServiceTypeId serviceTypeId); QString genCertificateRequest(ServiceTypeId serviceTypeId); + void processCloudConfig(ServiceTypeId serviceTypeId, QString &config); + QSharedPointer m_serversModel; QSharedPointer m_containersModel; + + OpenVpnConfigurator::ConnectionData m_certRequest; }; #endif // CLOUDCONTROLLER_H From 22b14dff5f51584ac471a5af239b9693cbba9014 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Sun, 22 Oct 2023 16:21:59 +0300 Subject: [PATCH 014/144] iOS AWG/WG split tunnel --- client/platforms/ios/ios_controller.h | 2 + client/platforms/ios/ios_controller.mm | 24 ++++++- client/platforms/ios/iostunnel.swift | 71 ++++++++++++++++++- client/settings.cpp | 4 -- .../ui/qml/Pages2/PageSettingsConnection.qml | 8 +-- 5 files changed, 98 insertions(+), 11 deletions(-) diff --git a/client/platforms/ios/ios_controller.h b/client/platforms/ios/ios_controller.h index 68f30ce8d..2597e15db 100644 --- a/client/platforms/ios/ios_controller.h +++ b/client/platforms/ios/ios_controller.h @@ -28,6 +28,8 @@ struct MessageKey static const char *host; static const char *port; static const char *isOnDemand; + static const char *SplitTunnelType; + static const char *SplitTunnelSites; }; class IosController : public QObject diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm index 5665ff1de..841ff1e0f 100644 --- a/client/platforms/ios/ios_controller.mm +++ b/client/platforms/ios/ios_controller.mm @@ -29,6 +29,9 @@ const char* MessageKey::host = "host"; const char* MessageKey::port = "port"; const char* MessageKey::isOnDemand = "is-on-demand"; +const char* MessageKey::SplitTunnelType = "SplitTunnelType"; +const char* MessageKey::SplitTunnelSites = "SplitTunnelSites"; + Vpn::ConnectionState iosStatusToState(NEVPNStatus status) { switch (status) { @@ -351,6 +354,15 @@ { m_rxBytes = 0; m_txBytes = 0; + + qDebug() << "m_rawConfig " << m_rawConfig; + + int STT = m_rawConfig["splitTunnelType"].toInt(); + QJsonArray splitTunnelSites = m_rawConfig["splitTunnelSites"].toArray(); + QJsonDocument doc; + doc.setArray(splitTunnelSites); + QString STS(doc.toJson()); + [m_currentTunnel setEnabled:YES]; [m_currentTunnel saveToPreferencesWithCompletionHandler:^(NSError *saveError) { @@ -376,8 +388,16 @@ NSString *actionValue = [NSString stringWithUTF8String:Action::start]; NSString *tunnelIdKey = [NSString stringWithUTF8String:MessageKey::tunnelId]; NSString *tunnelIdValue = !m_tunnelId.isEmpty() ? m_tunnelId.toNSString() : @""; - - NSDictionary* message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue}; + NSString *SplitTunnelTypeKey = [NSString stringWithUTF8String:MessageKey::SplitTunnelType]; + NSString *SplitTunnelTypeValue = [NSString stringWithFormat:@"%d",STT]; + NSString *SplitTunnelSitesKey = [NSString stringWithUTF8String:MessageKey::SplitTunnelSites]; + NSString *SplitTunnelSitesValue = STS.toNSString(); + + + NSDictionary* message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue, + SplitTunnelTypeKey: SplitTunnelTypeValue, SplitTunnelSitesKey: SplitTunnelSitesValue}; + + qDebug() << "sendVpnExtensionMessage " << message; sendVpnExtensionMessage(message); diff --git a/client/platforms/ios/iostunnel.swift b/client/platforms/ios/iostunnel.swift index 41d835aeb..45eee6a30 100644 --- a/client/platforms/ios/iostunnel.swift +++ b/client/platforms/ios/iostunnel.swift @@ -29,6 +29,8 @@ struct Constants { static let kMessageKeyHost = "host" static let kMessageKeyPort = "port" static let kMessageKeyOnDemand = "is-on-demand" + static let kMessageKeySplitTunnelType = "SplitTunnelType" + static let kMessageKeySplitTunnelSites = "SplitTunnelSites" } class PacketTunnelProvider: NEPacketTunnelProvider { @@ -49,6 +51,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { private let dispatchQueue = DispatchQueue(label: "PacketTunnel", qos: .utility) private var openVPNConfig: Data? = nil + private var SplitTunnelType: String? = nil + private var SplitTunnelSites: String? = nil let vpnReachability = OpenVPNReachability() @@ -63,6 +67,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { + + let tmpStr = String(data: messageData, encoding: .utf8)! + wg_log(.error, message: tmpStr) guard let message = try? JSONSerialization.jsonObject(with: messageData, options: []) as? [String: Any] else { Logger.global?.log(message: "Failed to serialize message from app") return @@ -83,6 +90,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider { handleStatusAppMessage(messageData, completionHandler: completionHandler) } + if action == Constants.kActionStart { + SplitTunnelType = message[Constants.kMessageKeySplitTunnelType] as? String + SplitTunnelSites = message[Constants.kMessageKeySplitTunnelSites] as? String + } + let callbackWrapper: (NSNumber?) -> Void = { errorCode in //let tunnelId = self.tunnelConfig?.id ?? "" let response: [String: Any] = [ @@ -175,6 +187,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { return } + let wgConfigStr = String(data: wgConfig, encoding: .utf8)! guard let tunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: wgConfigStr) else { @@ -182,7 +195,63 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler(nil) return } - + + wg_log(.error, message: tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ")) + + if (tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ") == "0.0.0.0/0, ::/0"){ + if (SplitTunnelType == "1") { + wg_log(.error, message: SplitTunnelSites!) + for index in tunnelConfiguration.peers.indices { + tunnelConfiguration.peers[index].allowedIPs.removeAll() + var allowedIPs = [IPAddressRange]() + + let data = Data(SplitTunnelSites!.utf8) + do { + let array = try JSONSerialization.jsonObject(with: data) as! [String] + for allowedIPString in array { + wg_log(.error,message: allowedIPString) + guard let allowedIP = IPAddressRange(from: allowedIPString) else { + wg_log(.error,message: "Parse SplitTunnelSites Error") + return + } + allowedIPs.append(allowedIP) + } + + } catch { + wg_log(.error,message: "Parse JSONSerialization Error") + } + tunnelConfiguration.peers[index].allowedIPs = allowedIPs + } + } else { + if (SplitTunnelType == "2") + { + wg_log(.error, message: SplitTunnelSites!) + for index in tunnelConfiguration.peers.indices { + var excludeIPs = [IPAddressRange]() + + let data = Data(SplitTunnelSites!.utf8) + do { + let array = try JSONSerialization.jsonObject(with: data) as! [String] + for excludeIPString in array { + wg_log(.error,message: excludeIPString) + guard let excludeIP = IPAddressRange(from: excludeIPString) else { + wg_log(.error,message: "Parse SplitTunnelSites Error") + return + } + excludeIPs.append(excludeIP) + } + + } catch { + wg_log(.error,message: "Parse JSONSerialization Error") + } + tunnelConfiguration.peers[index].excludeIPs = excludeIPs + } + } + } + } + + wg_log(.error, message: tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ")) + wg_log(.info, message: "Starting wireguard tunnel from the " + (activationAttemptId == nil ? "OS directly, rather than the app" : "app")) // Start the tunnel diff --git a/client/settings.cpp b/client/settings.cpp index c6db0b639..4757dba6e 100644 --- a/client/settings.cpp +++ b/client/settings.cpp @@ -233,10 +233,6 @@ QString Settings::routeModeString(RouteMode mode) const Settings::RouteMode Settings::routeMode() const { -// TODO implement for mobiles -#if defined(Q_OS_IOS) - return RouteMode::VpnAllSites; -#endif return static_cast(m_settings.value("Conf/routeMode", 0).toInt()); } diff --git a/client/ui/qml/Pages2/PageSettingsConnection.qml b/client/ui/qml/Pages2/PageSettingsConnection.qml index c4f3b64aa..c12c335dc 100644 --- a/client/ui/qml/Pages2/PageSettingsConnection.qml +++ b/client/ui/qml/Pages2/PageSettingsConnection.qml @@ -94,7 +94,7 @@ PageType { DividerType {} LabelWithButtonType { - visible: GC.isDesktop() || Qt.platform.os === "android" + visible: true Layout.fillWidth: true @@ -108,11 +108,11 @@ PageType { } DividerType { - visible: !GC.isMobile() + visible: GC.isDesktop() } LabelWithButtonType { - visible: false//!GC.isMobile() + visible: false Layout.fillWidth: true @@ -125,7 +125,7 @@ PageType { } DividerType { - visible: false//!GC.isMobile() + visible: false } } } From a386d3949555ada04374047800c078da5cbd028d Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 24 Oct 2023 00:28:41 +0300 Subject: [PATCH 015/144] iOS Cloak/OVPN SplitTunnel --- client/platforms/ios/iostunnel.swift | 234 +++++++++++++++------------ 1 file changed, 132 insertions(+), 102 deletions(-) diff --git a/client/platforms/ios/iostunnel.swift b/client/platforms/ios/iostunnel.swift index 45eee6a30..49e017674 100644 --- a/client/platforms/ios/iostunnel.swift +++ b/client/platforms/ios/iostunnel.swift @@ -15,7 +15,7 @@ struct Constants { static let ovpnConfigKey = "ovpn" static let wireGuardConfigKey = "wireguard" static let loggerTag = "NET" - + static let kActionStart = "start" static let kActionRestart = "restart" static let kActionStop = "stop" @@ -40,7 +40,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { wg_log(logLevel.osLogLevel, message: message) } }() - + private lazy var ovpnAdapter: OpenVPNAdapter = { let adapter = OpenVPNAdapter() adapter.delegate = self @@ -53,9 +53,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider { private var openVPNConfig: Data? = nil private var SplitTunnelType: String? = nil private var SplitTunnelSites: String? = nil - + let vpnReachability = OpenVPNReachability() - + var startHandler: ((Error?) -> Void)? var stopHandler: (() -> Void)? var protoType: TunnelProtoType = .none @@ -74,18 +74,18 @@ class PacketTunnelProvider: NEPacketTunnelProvider { Logger.global?.log(message: "Failed to serialize message from app") return } - + guard let completionHandler = completionHandler else { Logger.global?.log(message: "Missing message completion handler") return } - + guard let action = message[Constants.kMessageKeyAction] as? String else { Logger.global?.log(message: "Missing action key in app message") completionHandler(nil) return } - + if action == Constants.kActionStatus { handleStatusAppMessage(messageData, completionHandler: completionHandler) } @@ -102,11 +102,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider { Constants.kMessageKeyErrorCode: errorCode ?? NSNull(), Constants.kMessageKeyTunnelId: 0 ] - + completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) } } - + override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { dispatchQueue.async { let activationAttemptId = options?[Constants.kActivationAttemptId] as? String @@ -130,8 +130,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { switch self.protoType { case .wireguard: self.startWireguard(activationAttemptId: activationAttemptId, - errorNotifier: errorNotifier, - completionHandler: completionHandler) + errorNotifier: errorNotifier, + completionHandler: completionHandler) case .openvpn: self.startOpenVPN(completionHandler: completionHandler) case .shadowsocks: @@ -168,7 +168,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { handleOpenVPNStatusMessage(messageData, completionHandler: completionHandler) case .shadowsocks: break -// handleShadowSocksAppMessage(messageData, completionHandler: completionHandler) + // handleShadowSocksAppMessage(messageData, completionHandler: completionHandler) case .none: break @@ -180,12 +180,12 @@ class PacketTunnelProvider: NEPacketTunnelProvider { errorNotifier: ErrorNotifier, completionHandler: @escaping (Error?) -> Void) { guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, - let providerConfiguration = protocolConfiguration.providerConfiguration, - let wgConfig: Data = providerConfiguration[Constants.wireGuardConfigKey] as? Data else { - wg_log(.error, message: "Can't start WireGuard config missing") - completionHandler(nil) - return - } + let providerConfiguration = protocolConfiguration.providerConfiguration, + let wgConfig: Data = providerConfiguration[Constants.wireGuardConfigKey] as? Data else { + wg_log(.error, message: "Can't start WireGuard config missing") + completionHandler(nil) + return + } let wgConfigStr = String(data: wgConfig, encoding: .utf8)! @@ -196,26 +196,20 @@ class PacketTunnelProvider: NEPacketTunnelProvider { return } - wg_log(.error, message: tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ")) - - if (tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ") == "0.0.0.0/0, ::/0"){ + + if (tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ") == "0.0.0.0/0, ::/0") { if (SplitTunnelType == "1") { - wg_log(.error, message: SplitTunnelSites!) for index in tunnelConfiguration.peers.indices { tunnelConfiguration.peers[index].allowedIPs.removeAll() var allowedIPs = [IPAddressRange]() - - let data = Data(SplitTunnelSites!.utf8) + let STSdata = Data(SplitTunnelSites!.utf8) do { - let array = try JSONSerialization.jsonObject(with: data) as! [String] - for allowedIPString in array { - wg_log(.error,message: allowedIPString) - guard let allowedIP = IPAddressRange(from: allowedIPString) else { - wg_log(.error,message: "Parse SplitTunnelSites Error") - return - } - allowedIPs.append(allowedIP) + let STSArray = try JSONSerialization.jsonObject(with: STSdata) as! [String] + for allowedIPString in STSArray { + if let allowedIP = IPAddressRange(from: allowedIPString) { + allowedIPs.append(allowedIP) } + } } catch { wg_log(.error,message: "Parse JSONSerialization Error") @@ -225,22 +219,16 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } else { if (SplitTunnelType == "2") { - wg_log(.error, message: SplitTunnelSites!) for index in tunnelConfiguration.peers.indices { var excludeIPs = [IPAddressRange]() - - let data = Data(SplitTunnelSites!.utf8) + let STSdata = Data(SplitTunnelSites!.utf8) do { - let array = try JSONSerialization.jsonObject(with: data) as! [String] - for excludeIPString in array { - wg_log(.error,message: excludeIPString) - guard let excludeIP = IPAddressRange(from: excludeIPString) else { - wg_log(.error,message: "Parse SplitTunnelSites Error") - return - } - excludeIPs.append(excludeIP) + let STSarray = try JSONSerialization.jsonObject(with: STSdata) as! [String] + for excludeIPString in STSarray { + if let excludeIP = IPAddressRange(from: excludeIPString) { + excludeIPs.append(excludeIP) } - + } } catch { wg_log(.error,message: "Parse JSONSerialization Error") } @@ -250,8 +238,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } - wg_log(.error, message: tunnelConfiguration.peers.first!.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ")) - wg_log(.info, message: "Starting wireguard tunnel from the " + (activationAttemptId == nil ? "OS directly, rather than the app" : "app")) // Start the tunnel @@ -262,30 +248,30 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler(nil) return } - + switch adapterError { case .cannotLocateTunnelFileDescriptor: wg_log(.error, staticMessage: "Starting tunnel failed: could not determine file descriptor") errorNotifier.notify(PacketTunnelProviderError.couldNotDetermineFileDescriptor) completionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor) - + case .dnsResolution(let dnsErrors): let hostnamesWithDnsResolutionFailure = dnsErrors.map { $0.address } .joined(separator: ", ") wg_log(.error, message: "DNS resolution failed for the following hostnames: \(hostnamesWithDnsResolutionFailure)") errorNotifier.notify(PacketTunnelProviderError.dnsResolutionFailure) completionHandler(PacketTunnelProviderError.dnsResolutionFailure) - + case .setNetworkSettings(let error): wg_log(.error, message: "Starting tunnel failed with setTunnelNetworkSettings returning \(error.localizedDescription)") errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings) completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings) - + case .startWireGuardBackend(let errorCode): wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(errorCode)") errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend) completionHandler(PacketTunnelProviderError.couldNotStartBackend) - + case .invalidState: // Must never happen fatalError() @@ -295,27 +281,27 @@ class PacketTunnelProvider: NEPacketTunnelProvider { private func startOpenVPN(completionHandler: @escaping (Error?) -> Void) { guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, - let providerConfiguration = protocolConfiguration.providerConfiguration, + let providerConfiguration = protocolConfiguration.providerConfiguration, let ovpnConfiguration: Data = providerConfiguration[Constants.ovpnConfigKey] as? Data else { // TODO: handle errors properly - wg_log(.error, message: "Can't start startOpenVPN()") + wg_log(.error, message: "Can't start startOpenVPN()") return } setupAndlaunchOpenVPN(withConfig: ovpnConfiguration, completionHandler: completionHandler) } - + private func stopWireguard(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { wg_log(.info, staticMessage: "Stopping tunnel") wgAdapter.stop { error in ErrorNotifier.removeLastErrorFile() - + if let error = error { wg_log(.error, message: "Failed to stop WireGuard adapter: \(error.localizedDescription)") } completionHandler() - + #if os(macOS) // HACK: This is a filthy hack to work around Apple bug 32073323 (dup'd by us as 47526107). // Remove it when they finally fix this upstream and the fix has been rolled out to @@ -332,7 +318,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } ovpnAdapter.disconnect() } - + func handleWireguardStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { guard let completionHandler = completionHandler else { return } wgAdapter.getRuntimeConfiguration { settings in @@ -347,8 +333,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { for component in components{ let pair = component.components(separatedBy: "=") if pair.count == 2 { - settingsDictionary[pair[0]] = pair[1] - } + settingsDictionary[pair[0]] = pair[1] + } } let response: [String: Any] = [ @@ -378,7 +364,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler(nil) return } - + do { let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: configString) wgAdapter.update(tunnelConfiguration: tunnelConfiguration) { error in @@ -387,7 +373,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler(nil) return } - + self.wgAdapter.getRuntimeConfiguration { settings in var data: Data? if let settings = settings { @@ -403,76 +389,76 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler(nil) } } - + private func handleOpenVPNStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { guard let completionHandler = completionHandler else { return } - let bytesin = ovpnAdapter.transportStatistics.bytesIn - let bytesout = ovpnAdapter.transportStatistics.bytesOut - - let response: [String: Any] = [ - "rx_bytes" : bytesin, - "tx_bytes" : bytesout - ] - - completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) + let bytesin = ovpnAdapter.transportStatistics.bytesIn + let bytesout = ovpnAdapter.transportStatistics.bytesOut + + let response: [String: Any] = [ + "rx_bytes" : bytesin, + "tx_bytes" : bytesout + ] + + completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) } - - + + // TODO review private func setupAndlaunchOpenVPN(withConfig ovpnConfiguration: Data, withShadowSocks viaSS: Bool = false, completionHandler: @escaping (Error?) -> Void) { wg_log(.info, message: "setupAndlaunchOpenVPN") - + let str = String(decoding: ovpnConfiguration, as: UTF8.self) - + let configuration = OpenVPNConfiguration() configuration.fileContent = ovpnConfiguration if(str.contains("cloak")){ configuration.setPTCloak(); } - + let evaluation: OpenVPNConfigurationEvaluation do { evaluation = try ovpnAdapter.apply(configuration: configuration) - + } catch { completionHandler(error) return } - + if !evaluation.autologin { wg_log(.info, message: "Implement login with user credentials") } - + vpnReachability.startTracking { [weak self] status in guard status == .reachableViaWiFi else { return } self?.ovpnAdapter.reconnect(afterTimeInterval: 5) } - + startHandler = completionHandler ovpnAdapter.connect(using: packetFlow) - -// let ifaces = Interface.allInterfaces() -// .filter { $0.family == .ipv4 } -// .map { iface in iface.name } - -// wg_log(.error, message: "Available TUN Interfaces: \(ifaces)") + + // let ifaces = Interface.allInterfaces() + // .filter { $0.family == .ipv4 } + // .map { iface in iface.name } + + // wg_log(.error, message: "Available TUN Interfaces: \(ifaces)") } - + // MARK: -- Network observing methods - + private func startListeningForNetworkChanges() { stopListeningForNetworkChanges() addObserver(self, forKeyPath: Constants.kDefaultPathKey, options: .old, context: nil) } - + private func stopListeningForNetworkChanges() { removeObserver(self, forKeyPath: Constants.kDefaultPathKey) } - + override func observeValue(forKeyPath keyPath: String?, - of object: Any?, - change: [NSKeyValueChangeKey : Any]?, - context: UnsafeMutableRawPointer?) { + of object: Any?, + change: [NSKeyValueChangeKey : Any]?, + context: UnsafeMutableRawPointer?) { guard Constants.kDefaultPathKey != keyPath else { return } // Since iOS 11, we have observed that this KVO event fires repeatedly when connecting over Wifi, // even though the underlying network has not changed (i.e. `isEqualToPath` returns false), @@ -481,28 +467,28 @@ class PacketTunnelProvider: NEPacketTunnelProvider { guard let lastPath: NWPath = change?[.oldKey] as? NWPath, let defPath = defaultPath, lastPath != defPath || lastPath.description != defPath.description else { - return - } + return + } DispatchQueue.main.async { [weak self] in guard let `self` = self, self.defaultPath != nil else { return } self.handle(networkChange: self.defaultPath!) { _ in } } } - + private func handle(networkChange changePath: NWPath, completion: @escaping (Error?) -> Void) { wg_log(.info, message: "Tunnel restarted.") startTunnel(options: nil, completionHandler: completion) } - + private func startEmptyTunnel(completionHandler: @escaping (Error?) -> Void) { dispatchPrecondition(condition: .onQueue(dispatchQueue)) - + let emptyTunnelConfiguration = TunnelConfiguration( name: nil, interface: InterfaceConfiguration(privateKey: PrivateKey()), peers: [] ) - + wgAdapter.start(tunnelConfiguration: emptyTunnelConfiguration) { error in self.dispatchQueue.async { if let error { @@ -514,9 +500,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } } - + let settings = NETunnelNetworkSettings(tunnelRemoteAddress: "1.1.1.1") - + self.setTunnelNetworkSettings(settings) { error in completionHandler(error) } @@ -547,6 +533,50 @@ extension PacketTunnelProvider: OpenVPNAdapterDelegate { // send empty string to NEDNSSettings.matchDomains networkSettings?.dnsSettings?.matchDomains = [""] + if (SplitTunnelType == "1") { + var ipv4IncludedRoutes = [NEIPv4Route]() + let STSdata = Data(SplitTunnelSites!.utf8) + do { + let STSarray = try JSONSerialization.jsonObject(with: STSdata) as! [String] + for allowedIPString in STSarray { + if let allowedIP = IPAddressRange(from: allowedIPString){ + ipv4IncludedRoutes.append(NEIPv4Route(destinationAddress: "\(allowedIP.address)", subnetMask: "\(allowedIP.subnetMask())")) + } + } + } catch { + wg_log(.error,message: "Parse JSONSerialization Error") + } + networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes + } else { + if (SplitTunnelType == "2") + { + var ipv4ExcludedRoutes = [NEIPv4Route]() + var ipv4IncludedRoutes = [NEIPv4Route]() + var ipv6IncludedRoutes = [NEIPv6Route]() + let STSdata = Data(SplitTunnelSites!.utf8) + do { + let STSarray = try JSONSerialization.jsonObject(with: STSdata) as! [String] + for excludeIPString in STSarray { + if let excludeIP = IPAddressRange(from: excludeIPString) { + ipv4ExcludedRoutes.append(NEIPv4Route(destinationAddress: "\(excludeIP.address)", subnetMask: "\(excludeIP.subnetMask())")) + } + } + } catch { + wg_log(.error,message: "Parse JSONSerialization Error") + } + if let allIPv4 = IPAddressRange(from: "0.0.0.0/0"){ + ipv4IncludedRoutes.append(NEIPv4Route(destinationAddress: "\(allIPv4.address)", subnetMask: "\(allIPv4.subnetMask())")) + } + if let allIPv6 = IPAddressRange(from: "::/0") { + ipv6IncludedRoutes.append(NEIPv6Route(destinationAddress: "\(allIPv6.address)", networkPrefixLength: NSNumber(value: allIPv6.networkPrefixLength))) + } + networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes + networkSettings?.ipv6Settings?.includedRoutes = ipv6IncludedRoutes + networkSettings?.ipv4Settings?.excludedRoutes = ipv4ExcludedRoutes + } + + } + // Set the network settings for the current tunneling session. setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler) } @@ -607,7 +637,7 @@ extension PacketTunnelProvider: OpenVPNAdapterDelegate { wg_log(.info, message: logMessage) } } - + extension WireGuardLogLevel { var osLogLevel: OSLogType { switch self { From 306d4f70a89ff81e3b33ff5fa627fff6eec65a17 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 24 Oct 2023 00:33:35 +0300 Subject: [PATCH 016/144] Update NE Sources --- client/3rd/awg-apple | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd/awg-apple b/client/3rd/awg-apple index fab07138d..233eda676 160000 --- a/client/3rd/awg-apple +++ b/client/3rd/awg-apple @@ -1 +1 @@ -Subproject commit fab07138dbab06ac0de256021e47e273f4df8e88 +Subproject commit 233eda6760962efddc860f177a0ce2bcdf533d85 From c772f56da720af1275435c071d2fe2b6cc2f8d30 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 24 Oct 2023 11:00:40 +0300 Subject: [PATCH 017/144] Fixes after merge --- client/core/servercontroller.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index d96c03f4f..da76e1ffd 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -591,22 +591,20 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({ { "$AWG_SERVER_PORT", amneziaWireguarConfig.value(config_key::port).toString(protocols::awg::defaultPort) } }); - if (!amneziaWireguarConfig.value(config_key::junkPacketCount).toString().isEmpty()){ - vars.append({ { "$JUNK_PACKET_COUNT", amneziaWireguarConfig.value(config_key::junkPacketCount).toString() } }); - vars.append({ { "$JUNK_PACKET_MIN_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMinSize).toString() } }); - vars.append({ { "$JUNK_PACKET_MAX_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMaxSize).toString() } }); - vars.append({ { "$INIT_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::initPacketJunkSize).toString() } }); - vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", - amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } }); - vars.append({ { "$INIT_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } }); - vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); - vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); - vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); - } + vars.append({ { "$JUNK_PACKET_COUNT", amneziaWireguarConfig.value(config_key::junkPacketCount).toString() } }); + vars.append({ { "$JUNK_PACKET_MIN_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMinSize).toString() } }); + vars.append({ { "$JUNK_PACKET_MAX_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMaxSize).toString() } }); + vars.append({ { "$INIT_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::initPacketJunkSize).toString() } }); + vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", + amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } }); + vars.append({ { "$INIT_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } }); + vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); + vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); + vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", + amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); QString serverIp = Utils::getIPAddress(credentials.hostName); if (!serverIp.isEmpty()) { From 1b37ca805f4737f748dcdae0d24303ebfba4bd82 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 24 Oct 2023 11:10:16 +0300 Subject: [PATCH 018/144] Cleanup debug stuff --- client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt | 11 ++--------- client/android/src/org/amnezia/vpn/VPNService.kt | 2 -- client/configurators/openvpn_configurator.cpp | 1 - client/platforms/ios/ios_controller.mm | 3 --- 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index d96131af2..b35face48 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -74,14 +74,9 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna val jsonVpnConfig = mService.getVpnConfig() val ovpnConfig = jsonVpnConfig.getJSONObject("openvpn_config_data").getString("config") - Log.e(tag, "jsonVpnConfig $jsonVpnConfig") val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType") val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites") - Log.e(tag, "splitTunnelType $splitTunnelType") - Log.e(tag, "splitTunnelSites $splitTunnelSites") - - val resultingConfig = StringBuilder() resultingConfig.append(ovpnConfig) @@ -158,7 +153,6 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna val site = splitTunnelSites.getString(i) val ipRange = IPRange(site) mService.addRoute(ipRange.getFrom().getHostAddress(), ipRange.getPrefix()) - Log.e(tag, "splitTunnelSites $ipRange") } } if (splitTunnelType == 2) { @@ -170,8 +164,7 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna } ipRangeSet.subnets().forEach { mService.addRoute(it.getFrom().getHostAddress(), it.getPrefix()) - Thread.sleep(100) - Log.e(tag, "splitTunnelSites $it") + Thread.sleep(10) } mService.addRoute("2000::", 3) } @@ -196,7 +189,7 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna override fun tun_builder_reroute_gw(ipv4: Boolean, ipv6: Boolean , flags: Long): Boolean { Log.v(tag, "tun_builder_reroute_gw") - // mService.addRoute("0.0.0.0", 0) + mService.addRoute("0.0.0.0", 0) return true } diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/VPNService.kt index ca4681089..929545d65 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/VPNService.kt @@ -611,7 +611,6 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { /* VPN connection used only for defined IPs */ for (i in 0 until splitTunnelSites.length()) { val site = splitTunnelSites.getString(i) - Log.e(tag, "splitTunnelSites $site") val internet = InetNetwork.parse(site) peerBuilder.addAllowedIp(internet) } @@ -626,7 +625,6 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { ipRangeSet.remove(IPRange(site)) } val allowedIps = ipRangeSet.subnets().joinToString(", ") + ", 2000::/3" - Log.e(tag, "allowedIps $allowedIps") peerBuilder.parseAllowedIPs(allowedIps) } } diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index cc5c30e57..8c58a376d 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -131,7 +131,6 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) config.append("block-ipv6\n"); } if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { - qDebug() << "Settings::VpnOnlyForwardSites"; // no redirect-gateway } diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm index 841ff1e0f..79eddefdf 100644 --- a/client/platforms/ios/ios_controller.mm +++ b/client/platforms/ios/ios_controller.mm @@ -355,8 +355,6 @@ m_rxBytes = 0; m_txBytes = 0; - qDebug() << "m_rawConfig " << m_rawConfig; - int STT = m_rawConfig["splitTunnelType"].toInt(); QJsonArray splitTunnelSites = m_rawConfig["splitTunnelSites"].toArray(); QJsonDocument doc; @@ -397,7 +395,6 @@ NSDictionary* message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue, SplitTunnelTypeKey: SplitTunnelTypeValue, SplitTunnelSitesKey: SplitTunnelSitesValue}; - qDebug() << "sendVpnExtensionMessage " << message; sendVpnExtensionMessage(message); From 3e9dea6f07f983af091ef7fd6b6ee05192ffe291 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 24 Oct 2023 13:37:40 +0300 Subject: [PATCH 019/144] Remove some not implemented notification --- client/amnezia_application.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index e50c67d65..b1ed39eeb 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -296,17 +296,7 @@ void AmneziaApplication::initModels() m_sitesModel.reset(new SitesModel(m_settings, this)); m_engine->rootContext()->setContextProperty("SitesModel", m_sitesModel.get()); - connect(m_containersModel.get(), &ContainersModel::defaultContainerChanged, this, [this]() { - if ((m_containersModel->getDefaultContainer() == DockerContainer::WireGuard - || m_containersModel->getDefaultContainer() == DockerContainer::Awg) - && m_sitesModel->isSplitTunnelingEnabled()) { - m_sitesModel->toggleSplitTunneling(true); - emit m_pageController->showNotificationMessage( - tr("Split tunneling for %1 is not implemented, the option was disabled") - .arg(ContainerProps::containerHumanNames().value(m_containersModel->getDefaultContainer()))); - } - }); - + m_protocolsModel.reset(new ProtocolsModel(m_settings, this)); m_engine->rootContext()->setContextProperty("ProtocolsModel", m_protocolsModel.get()); From a6b6e7850d82600ab944baa93c393348c2a02e1a Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Tue, 24 Oct 2023 22:21:10 +0300 Subject: [PATCH 020/144] Allow traffic for excluded route on Windows kill switch --- .../windows/daemon/windowsfirewall.cpp | 66 ++++++++++++++++++- .../windows/daemon/windowsfirewall.h | 3 + 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/client/platforms/windows/daemon/windowsfirewall.cpp b/client/platforms/windows/daemon/windowsfirewall.cpp index 2cf5e205a..3d45f228c 100644 --- a/client/platforms/windows/daemon/windowsfirewall.cpp +++ b/client/platforms/windows/daemon/windowsfirewall.cpp @@ -236,6 +236,17 @@ bool WindowsFirewall::enablePeerTraffic(const InterfaceConfig& config) { } } + if (!config.m_excludedAddresses.empty()) { + for (const QString& i : config.m_excludedAddresses) { + logger.debug() << "range: " << i; + + if (!allowTrafficToRange(i, HIGH_WEIGHT, + "Allow Ecxlude route", config.m_serverPublicKey)) { + return false; + } + } + } + result = FwpmTransactionCommit0(m_sessionHandle); if (result != ERROR_SUCCESS) { logger.error() << "FwpmTransactionCommit0 failed with error:" << result; @@ -411,8 +422,8 @@ bool WindowsFirewall::allowTrafficOfAdapter(int networkAdapter, uint8_t weight, } bool WindowsFirewall::allowTrafficTo(const QHostAddress& targetIP, uint port, - int weight, const QString& title, - const QString& peer) { + int weight, const QString& title, + const QString& peer) { bool isIPv4 = targetIP.protocol() == QAbstractSocket::IPv4Protocol; GUID layerOut = isIPv4 ? FWPM_LAYER_ALE_AUTH_CONNECT_V4 : FWPM_LAYER_ALE_AUTH_CONNECT_V6; @@ -473,6 +484,57 @@ bool WindowsFirewall::allowTrafficTo(const QHostAddress& targetIP, uint port, return true; } +bool WindowsFirewall::allowTrafficToRange(const IPAddress& addr, uint8_t weight, + const QString& title, + const QString& peer) { + QString description("Allow traffic %1 %2 "); + + auto lower = addr.address(); + auto upper = addr.broadcastAddress(); + + const bool isV4 = addr.type() == QAbstractSocket::IPv4Protocol; + const GUID layerKeyOut = + isV4 ? FWPM_LAYER_ALE_AUTH_CONNECT_V4 : FWPM_LAYER_ALE_AUTH_CONNECT_V6; + const GUID layerKeyIn = isV4 ? FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 + : FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6; + + // Assemble the Filter base + FWPM_FILTER0 filter; + memset(&filter, 0, sizeof(filter)); + filter.action.type = FWP_ACTION_PERMIT; + filter.weight.type = FWP_UINT8; + filter.weight.uint8 = weight; + filter.subLayerKey = ST_FW_WINFW_BASELINE_SUBLAYER_KEY; + + FWPM_FILTER_CONDITION0 cond[1] = {0}; + FWP_RANGE0 ipRange; + QByteArray lowIpV6Buffer; + QByteArray highIpV6Buffer; + + importAddress(lower, ipRange.valueLow, &lowIpV6Buffer); + importAddress(upper, ipRange.valueHigh, &highIpV6Buffer); + + cond[0].fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS; + cond[0].matchType = FWP_MATCH_RANGE; + cond[0].conditionValue.type = FWP_RANGE_TYPE; + cond[0].conditionValue.rangeValue = &ipRange; + + filter.numFilterConditions = 1; + filter.filterCondition = cond; + + filter.layerKey = layerKeyOut; + if (!enableFilter(&filter, title, description.arg("to").arg(addr.toString()), + peer)) { + return false; + } + filter.layerKey = layerKeyIn; + if (!enableFilter(&filter, title, + description.arg("from").arg(addr.toString()), peer)) { + return false; + } + return true; +} + bool WindowsFirewall::allowDHCPTraffic(uint8_t weight, const QString& title) { // Allow outbound DHCPv4 { diff --git a/client/platforms/windows/daemon/windowsfirewall.h b/client/platforms/windows/daemon/windowsfirewall.h index e18913227..e0d5ebe8a 100644 --- a/client/platforms/windows/daemon/windowsfirewall.h +++ b/client/platforms/windows/daemon/windowsfirewall.h @@ -52,6 +52,9 @@ class WindowsFirewall final : public QObject { bool blockTrafficOnPort(uint port, uint8_t weight, const QString& title); bool allowTrafficTo(const QHostAddress& targetIP, uint port, int weight, const QString& title, const QString& peer = QString()); + bool allowTrafficToRange(const IPAddress& addr, uint8_t weight, + const QString& title, + const QString& peer); bool allowTrafficOfAdapter(int networkAdapter, uint8_t weight, const QString& title); bool allowDHCPTraffic(uint8_t weight, const QString& title); From 1739d4861e6b4b39d159b0c9c74dada7413f08cc Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Wed, 25 Oct 2023 21:48:44 +0300 Subject: [PATCH 021/144] Allow acces to Amnezia DNS when used only for selected sites --- client/mozilla/localsocketcontroller.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index 56178eeb9..db9f96635 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -199,6 +199,14 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { jsAllowedIPAddesses.append(range); } } + + // Allow access to Amnezia DNS + QJsonObject range_ipv4; + range_ipv4.insert("address", amnezia::protocols::dns::amneziaDnsIp); + range_ipv4.insert("range", 32); + range_ipv4.insert("isIpv6", false); + jsAllowedIPAddesses.append(range_ipv4); + } } From 0e23b3a1ac077aaf0913cbf7a45f8c76fc0dafd3 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Wed, 25 Oct 2023 22:19:07 +0300 Subject: [PATCH 022/144] Allow traffic to Amezia DNS for all OS --- client/mozilla/localsocketcontroller.cpp | 8 -------- client/vpnconnection.cpp | 5 +++++ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index db9f96635..56178eeb9 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -199,14 +199,6 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { jsAllowedIPAddesses.append(range); } } - - // Allow access to Amnezia DNS - QJsonObject range_ipv4; - range_ipv4.insert("address", amnezia::protocols::dns::amneziaDnsIp); - range_ipv4.insert("range", 32); - range_ipv4.insert("isIpv6", false); - jsAllowedIPAddesses.append(range_ipv4); - } } diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 878a1cde5..dea40f240 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -375,6 +375,11 @@ void VpnConnection::appendSplitTunnelingConfig() sitesJsonArray.append(site); } + // Allow traffic to Amezia DNS + if (routeMode == Settings::VpnOnlyForwardSites){ + sitesJsonArray.append(amnezia::protocols::dns::amneziaDnsIp); + } + m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode); m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray); } From 8164026891c8c916c5a542d5c4d58b0f38fa3079 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 26 Oct 2023 23:34:39 +0500 Subject: [PATCH 023/144] fixed server config update, after container config change --- client/amnezia_application.cpp | 2 ++ client/ui/models/containers_model.cpp | 12 ++---------- client/ui/models/containers_model.h | 1 + client/ui/models/servers_model.cpp | 6 ++++++ client/ui/models/servers_model.h | 2 ++ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 3e227863a..25a131f82 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -288,6 +288,8 @@ void AmneziaApplication::initModels() &ContainersModel::setCurrentlyProcessedServerIndex); connect(m_serversModel.get(), &ServersModel::defaultServerIndexChanged, m_containersModel.get(), &ContainersModel::setCurrentlyProcessedServerIndex); + connect(m_containersModel.get(), &ContainersModel::containersModelUpdated, m_serversModel.get(), + &ServersModel::updateContainersConfig); m_languageModel.reset(new LanguageModel(m_settings, this)); m_engine->rootContext()->setContextProperty("LanguageModel", m_languageModel.get()); diff --git a/client/ui/models/containers_model.cpp b/client/ui/models/containers_model.cpp index 6a4c0e63f..3fff22d4c 100644 --- a/client/ui/models/containers_model.cpp +++ b/client/ui/models/containers_model.cpp @@ -22,10 +22,6 @@ bool ContainersModel::setData(const QModelIndex &index, const QVariant &value, i DockerContainer container = ContainerProps::allContainers().at(index.row()); switch (role) { - case NameRole: - // return ContainerProps::containerHumanNames().value(container); - case DescriptionRole: - // return ContainerProps::containerDescriptions().value(container); case ConfigRole: { m_settings->setContainerConfig(m_currentlyProcessedServerIndex, container, value.toJsonObject()); m_containers = m_settings->containers(m_currentlyProcessedServerIndex); @@ -35,19 +31,15 @@ bool ContainersModel::setData(const QModelIndex &index, const QVariant &value, i break; } } - case ServiceTypeRole: - // return ContainerProps::containerService(container); - case DockerContainerRole: - // return container; - case IsInstalledRole: - // return m_settings->containers(m_currentlyProcessedServerIndex).contains(container); case IsDefaultRole: { //todo remove m_settings->setDefaultContainer(m_currentlyProcessedServerIndex, container); m_defaultContainerIndex = container; emit defaultContainerChanged(); } + default: break; } + emit containersModelUpdated(); emit dataChanged(index, index); return true; } diff --git a/client/ui/models/containers_model.h b/client/ui/models/containers_model.h index 997b21e37..8f087d870 100644 --- a/client/ui/models/containers_model.h +++ b/client/ui/models/containers_model.h @@ -73,6 +73,7 @@ public slots: signals: void defaultContainerChanged(); + void containersModelUpdated(); private: QMap m_containers; diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index a2a286304..f3b2337ff 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -193,6 +193,12 @@ bool ServersModel::isDefaultServerConfigContainsAmneziaDns() return primaryDns == protocols::dns::amneziaDnsIp; } +void ServersModel::updateContainersConfig() +{ + auto server = m_settings->server(m_currentlyProcessedServerIndex); + m_servers.replace(m_currentlyProcessedServerIndex, server); +} + QHash ServersModel::roleNames() const { QHash roles; diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index ad1d5a835..97d8015fa 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -59,6 +59,8 @@ public slots: bool isDefaultServerConfigContainsAmneziaDns(); + void updateContainersConfig(); + protected: QHash roleNames() const override; From 2fc33875bb20c09d1f20dbca6b631ca5fd043906 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Fri, 27 Oct 2023 15:38:24 -0400 Subject: [PATCH 024/144] Bump version --- CMakeLists.txt | 2 +- client/android/build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e7be4356..abb382cbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.0.8.6 +project(${PROJECT} VERSION 4.1.0.0 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) diff --git a/client/android/build.gradle b/client/android/build.gradle index a6b3f651c..3819a4fe9 100644 --- a/client/android/build.gradle +++ b/client/android/build.gradle @@ -138,8 +138,8 @@ android { resConfig "en" minSdkVersion = 24 targetSdkVersion = 34 - versionCode 37 // Change to a higher number - versionName "4.0.8" // Change to a higher number + versionCode 39 // Change to a higher number + versionName "4.1.0" // Change to a higher number javaCompileOptions.annotationProcessorOptions.arguments = [ "room.schemaLocation": "${qtAndroidDir}/schemas".toString() From 4ef8c77a2d474b85c9a75db02efaf01acd73ccfa Mon Sep 17 00:00:00 2001 From: lunardunno <126363523+lunardunno@users.noreply.github.com> Date: Sun, 29 Oct 2023 17:56:10 +0400 Subject: [PATCH 025/144] Update DNS description --- client/translations/amneziavpn_ru.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index cfa330400..861beec2b 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -686,7 +686,7 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - На вашем сервере устанавливается DNS-сервис, доступ к нему возможен только через VPN. + На вашем сервере установлен DNS-сервис, доступ к нему возможен только через VPN. From 4848091203cc865203d7cb7831264a8dc70a279d Mon Sep 17 00:00:00 2001 From: useribs Date: Mon, 30 Oct 2023 20:09:13 +0300 Subject: [PATCH 026/144] Update servercontroller.cpp, replace 2 calls (shred ; rm) with one (shred -u) --- client/core/servercontroller.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index da76e1ffd..398b46b34 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -167,11 +167,8 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, return ErrorCode::ServerContainerMissingError; } - runScript(credentials, - replaceVars(QString("sudo shred %1").arg(tmpFileName), genVarsForScript(credentials, container))); - - runScript(credentials, replaceVars(QString("sudo rm %1").arg(tmpFileName), genVarsForScript(credentials, container))); - + runScript(credentials, + replaceVars(QString("sudo shred -u %1").arg(tmpFileName), genVarsForScript(credentials, container))); return e; } From 9cfcb714aebfd7c31a105e647621479dd1068946 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 30 Oct 2023 14:20:21 +0500 Subject: [PATCH 027/144] added native config generation for ss and cloak --- client/ui/controllers/exportController.cpp | 80 +++++++++++++++++++ client/ui/controllers/exportController.h | 2 + .../qml/Pages2/PageSetupWizardCredentials.qml | 10 ++- client/ui/qml/Pages2/PageShare.qml | 43 ++++++++-- 4 files changed, 127 insertions(+), 8 deletions(-) diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index ef5cc4e3b..06bddb8a0 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -10,6 +10,8 @@ #include "configurators/openvpn_configurator.h" #include "configurators/wireguard_configurator.h" +#include "configurators/shadowsocks_configurator.h" +#include "configurators/cloak_configurator.h" #include "core/errorstrings.h" #include "systemController.h" #ifdef Q_OS_ANDROID @@ -155,6 +157,8 @@ void ExportController::generateOpenVpnConfig() m_config.append(line + "\n"); } + m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + emit exportConfigChanged(); } @@ -187,6 +191,82 @@ void ExportController::generateWireGuardConfig() m_config.append(line + "\n"); } + m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + + emit exportConfigChanged(); +} + +void ExportController::generateShadowSocksConfig() +{ + clearPreviousConfig(); + + int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + ServerCredentials credentials = + qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); + + DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); + QModelIndex containerModelIndex = m_containersModel->index(container); + QJsonObject containerConfig = + qvariant_cast(m_containersModel->data(containerModelIndex, ContainersModel::Roles::ConfigRole)); + containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); + + ErrorCode errorCode = ErrorCode::NoError; + QString config = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, &errorCode); + + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::ShadowSocks, config); + QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object(); + + m_config = QString("%1:%2@%3:%4") + .arg(configJson.value("method").toString(), + configJson.value("password").toString(), + configJson.value("server").toString(), + configJson.value("server_port").toString()); + + m_config = "ss://" + m_config.toUtf8().toBase64(); + + m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + + emit exportConfigChanged(); +} + +void ExportController::generateCloakConfig() +{ + clearPreviousConfig(); + + int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + ServerCredentials credentials = + qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); + + DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); + QModelIndex containerModelIndex = m_containersModel->index(container); + QJsonObject containerConfig = + qvariant_cast(m_containersModel->data(containerModelIndex, ContainersModel::Roles::ConfigRole)); + containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); + + ErrorCode errorCode = ErrorCode::NoError; + QString config = m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &errorCode); + + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::Cloak, config); + QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object(); + + configJson.remove(config_key::transport_proto); + configJson.insert("ProxyMethod", "shadowsocks"); + + QStringList lines = QString(QJsonDocument(configJson).toJson()).replace("\r", "").split("\n"); + for (const QString &line : lines) { + m_config.append(line + "\n"); + } + + m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + emit exportConfigChanged(); } diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index 24eaa5c85..ee94e7412 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -31,6 +31,8 @@ public slots: void generateConnectionConfig(); void generateOpenVpnConfig(); void generateWireGuardConfig(); + void generateShadowSocksConfig(); + void generateCloakConfig(); QString getConfig(); QList getQrCodes(); diff --git a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml index 5c32b0c54..3eadb6479 100644 --- a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml +++ b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml @@ -54,7 +54,7 @@ PageType { regularExpression: InstallController.ipAddressPortRegExp() } - onTextFieldTextChanged: { + onFocusChanged: { textField.text = textField.text.replace(/^\s+|\s+$/g, ''); } } @@ -81,6 +81,10 @@ PageType { clickedFunc: function() { hidePassword = !hidePassword } + + onFocusChanged: { + textField.text = textField.text.replace(/^\s+|\s+$/g, ''); + } } BasicButtonType { @@ -90,6 +94,7 @@ PageType { text: qsTr("Continue") onClicked: function() { + forceActiveFocus() if (!isCredentialsFilled()) { return } @@ -112,8 +117,7 @@ PageType { Layout.fillWidth: true Layout.topMargin: 12 - text: qsTr("All data you enter will remain strictly confidential -and will not be shared or disclosed to the Amnezia or any third parties") + text: qsTr("All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties") } } } diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index ced7a5ff0..577a9b3a6 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -20,7 +20,9 @@ PageType { AmneziaConnection, AmneziaFullAccess, OpenVpn, - WireGuard + WireGuard, + ShadowSocks, + Cloak } Connections { @@ -44,18 +46,32 @@ PageType { break; } case PageShare.ConfigType.OpenVpn: { - ExportController.generateOpenVpnConfig(); + ExportController.generateOpenVpnConfig() shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") shareConnectionDrawer.configExtension = ".ovpn" shareConnectionDrawer.configFileName = "amnezia_for_openvpn" - break; + break } case PageShare.ConfigType.WireGuard: { - ExportController.generateWireGuardConfig(); + ExportController.generateWireGuardConfig() shareConnectionDrawer.configCaption = qsTr("Save WireGuard config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_wireguard" - break; + break + } + case PageShare.ConfigType.ShadowSocks: { + ExportController.generateShadowSocksConfig() + shareConnectionDrawer.configCaption = qsTr("Save ShadowSocks config") + shareConnectionDrawer.configExtension = ".json" + shareConnectionDrawer.configFileName = "amnezia_for_shadowsocks" + break + } + case PageShare.ConfigType.Cloak: { + ExportController.generateCloakConfig() + shareConnectionDrawer.configCaption = qsTr("Save Cloak config") + shareConnectionDrawer.configExtension = ".json" + shareConnectionDrawer.configFileName = "amnezia_for_cloak" + break } } @@ -96,6 +112,16 @@ PageType { property string name: qsTr("WireGuard native format") property var type: PageShare.ConfigType.WireGuard } + QtObject { + id: shadowSocksConnectionFormat + property string name: qsTr("ShadowSocks native format") + property var type: PageShare.ConfigType.ShadowSocks + } + QtObject { + id: cloakConnectionFormat + property string name: qsTr("Cloak native format") + property var type: PageShare.ConfigType.Cloak + } FlickableType { anchors.top: parent.top @@ -322,6 +348,13 @@ PageType { root.connectionTypesModel.push(openVpnConnectionFormat) } else if (index === ContainerProps.containerFromString("amnezia-wireguard")) { root.connectionTypesModel.push(wireGuardConnectionFormat) + } else if (index === ContainerProps.containerFromString("amnezia-shadowsocks")) { + root.connectionTypesModel.push(openVpnConnectionFormat) + root.connectionTypesModel.push(shadowSocksConnectionFormat) + } else if (index === ContainerProps.containerFromString("amnezia-openvpn-cloak")) { + root.connectionTypesModel.push(openVpnConnectionFormat) + root.connectionTypesModel.push(shadowSocksConnectionFormat) + root.connectionTypesModel.push(cloakConnectionFormat) } } } From 071738116ed1d0ca76be9d94159e8b4c5339c4ff Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Fri, 3 Nov 2023 17:29:40 -0400 Subject: [PATCH 028/144] Update Windows OpenVPN binary This binary builded with ENABLE_DEBUG flag. This flag needed for ROUTE_GATEWAY varible output in log. --- client/3rd-prebuilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index ac32d3355..fcf3022a2 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit ac32d33555bd62f0b0af314b1e5119d6d78a1a4e +Subproject commit fcf3022a2724402f68cc11bcbed9b43ea9ffcc07 From 5e9f688000cfdea5ba5afd212343d583a7616588 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Sat, 4 Nov 2023 15:28:59 -0400 Subject: [PATCH 029/144] Use DNS over VPN for ForwardSites mode split tunnel This feature was in previous version of Split Tunnel --- client/vpnconnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index dea40f240..2505a9ea3 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -377,7 +377,8 @@ void VpnConnection::appendSplitTunnelingConfig() // Allow traffic to Amezia DNS if (routeMode == Settings::VpnOnlyForwardSites){ - sitesJsonArray.append(amnezia::protocols::dns::amneziaDnsIp); + sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString()); + sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString()); } m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode); From 8497aeeb912bf932f2ac9ddf384aa47569063f87 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 6 Nov 2023 14:10:31 +0300 Subject: [PATCH 030/144] removed the debugging code --- client/protocols/openvpnprotocol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/protocols/openvpnprotocol.cpp b/client/protocols/openvpnprotocol.cpp index f91cfe090..c38c6eea5 100644 --- a/client/protocols/openvpnprotocol.cpp +++ b/client/protocols/openvpnprotocol.cpp @@ -214,7 +214,7 @@ ErrorCode OpenVpnProtocol::start() m_openVpnProcess->setProgram(PermittedProcess::OpenVPN); QStringList arguments({ "--config", configPath(), "--management", m_managementHost, QString::number(mgmtPort), - "--management-client" , "--log", "/Users/nethius/Documents/git/log" + "--management-client" /*, "--log", vpnLogFileNamePath */ }); m_openVpnProcess->setArguments(arguments); From 72de38b4fb5ec462ed0c05c37d27071b4072b650 Mon Sep 17 00:00:00 2001 From: tiaga Date: Fri, 10 Nov 2023 23:18:47 +0700 Subject: [PATCH 031/144] Upload new versions to R2 A new GitHub Actions workflow for a tagged commit which uploads installers for a desktop version to Cloudflare R2. --- .github/workflows/tag-upload.yml | 64 ++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .github/workflows/tag-upload.yml diff --git a/.github/workflows/tag-upload.yml b/.github/workflows/tag-upload.yml new file mode 100644 index 000000000..22629ed32 --- /dev/null +++ b/.github/workflows/tag-upload.yml @@ -0,0 +1,64 @@ +name: 'Upload a new version' + +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+.[0-9]+' + +jobs: + upload: + runs-on: ubuntu-latest + name: upload + steps: + - name: Checkout CMakeLists.txt + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + sparse-checkout: | + CMakeLists.txt + sparse-checkout-cone-mode: false + + - name: Verify git tag + run: | + GIT_TAG=${{ github.ref_name }} + CMAKE_TAG=$(grep 'project.*VERSION' CMakeLists.txt | sed -E 's/.* ([0-9]+.[0-9]+.[0-9]+.[0-9]+)$/\1/') + + if [[ "$GIT_TAG" == "$CMAKE_TAG" ]]; then + echo "Git tag ($GIT_TAG) and version in CMakeLists.txt ($CMAKE_TAG) are the same. Continuing..." + else + echo "Git tag ($GIT_TAG) and version in CMakeLists.txt ($CMAKE_TAG) are not the same! Cancelling..." + exit 1 + fi + + - name: Download artifacts from the "${{ github.ref_name }}" tag + uses: robinraju/release-downloader@v1.8 + with: + tag: ${{ github.ref_name }} + fileName: "AmneziaVPN_(Linux_|)${{ github.ref_name }}*" + out-file-path: ${{ github.ref_name }} + + - name: Upload beta version + uses: jakejarvis/s3-sync-action@master + if: contains(github.event.base_ref, 'dev') + with: + args: --include "AmneziaVPN*" --delete + env: + AWS_S3_BUCKET: updates + AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }} + AWS_S3_ENDPOINT: https://${{ vars.CF_ACCOUNT_ID }}.r2.cloudflarestorage.com + SOURCE_DIR: ${{ github.ref_name }} + DEST_DIR: beta/${{ github.ref_name }} + + - name: Upload stable version + uses: jakejarvis/s3-sync-action@master + if: contains(github.event.base_ref, 'master') + with: + args: --include "AmneziaVPN*" --delete + env: + AWS_S3_BUCKET: updates + AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }} + AWS_S3_ENDPOINT: https://${{ vars.CF_ACCOUNT_ID }}.r2.cloudflarestorage.com + SOURCE_DIR: ${{ github.ref_name }} + DEST_DIR: stable/${{ github.ref_name }} From 362a82f94496075b2187cf1bfbe0d2acf79894c0 Mon Sep 17 00:00:00 2001 From: tiaga Date: Tue, 14 Nov 2023 16:57:04 +0700 Subject: [PATCH 032/144] Improve logic of install_docker.sh - check packages update only when it's required - avoid `dnf/yum update` for RHEL-based systems --- client/server_scripts/install_docker.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/client/server_scripts/install_docker.sh b/client/server_scripts/install_docker.sh index 58f925407..e6708ddf0 100644 --- a/client/server_scripts/install_docker.sh +++ b/client/server_scripts/install_docker.sh @@ -1,19 +1,19 @@ -if which apt-get > /dev/null 2>&1; then pm=$(which apt-get); docker_pkg="docker.io"; dist="debian";\ -elif which dnf > /dev/null 2>&1; then pm=$(which dnf); docker_pkg="docker"; dist="fedora";\ -elif which yum > /dev/null 2>&1; then pm=$(which yum); docker_pkg="docker"; dist="centos";\ +if which apt-get > /dev/null 2>&1; then pm=$(which apt-get); silent_inst="-yq install"; check_pkgs="-yq update"; docker_pkg="docker.io"; dist="debian";\ +elif which dnf > /dev/null 2>&1; then pm=$(which dnf); silent_inst="-yq install"; check_pkgs="-yq check-update"; docker_pkg="docker"; dist="fedora";\ +elif which yum > /dev/null 2>&1; then pm=$(which yum); silent_inst="-y -q install"; check_pkgs="-y -q check-update"; docker_pkg="docker"; dist="centos";\ else echo "Packet manager not found"; exit 1; fi;\ -echo "Dist: $dist, Packet manager: $pm, Docker pkg: $docker_pkg";\ +echo "Dist: $dist, Packet manager: $pm, Install command: $silent_inst, Check pkgs command: $check_pkgs, Docker pkg: $docker_pkg";\ if [ "$dist" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive; fi;\ -if ! command -v sudo > /dev/null 2>&1; then $pm update -yq; $pm install -yq sudo; fi;\ -if ! command -v fuser > /dev/null 2>&1; then sudo $pm install -yq psmisc; fi;\ -if ! command -v lsof > /dev/null 2>&1; then sudo $pm install -yq lsof; fi;\ -if ! command -v docker > /dev/null 2>&1; then sudo $pm update -yq; sudo $pm install -yq $docker_pkg;\ +if ! command -v sudo > /dev/null 2>&1; then $pm $check_pkgs; $pm $silent_inst sudo; fi;\ +if ! command -v fuser > /dev/null 2>&1; then sudo $pm $check_pkgs; sudo $pm $silent_inst psmisc; fi;\ +if ! command -v lsof > /dev/null 2>&1; then sudo $pm $check_pkgs; sudo $pm $silent_inst lsof; fi;\ +if ! command -v docker > /dev/null 2>&1; then sudo $pm $check_pkgs; sudo $pm $silent_inst $docker_pkg;\ if [ "$dist" = "fedora" ] || [ "$dist" = "centos" ] || [ "$dist" = "debian" ]; then sudo systemctl enable docker && sudo systemctl start docker; fi;\ fi;\ if [ "$dist" = "debian" ]; then \ docker_service=$(systemctl list-units --full --all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ - if [ -z "$docker_service" ]; then sudo $pm update -yq; sudo $pm install -yq curl $docker_pkg; fi;\ + if [ -z "$docker_service" ]; then sudo $pm $check_pkgs; sudo $pm $silent_inst curl $docker_pkg; fi;\ sleep 3 && sudo systemctl start docker && sleep 3;\ fi;\ -if ! command -v sudo > /dev/null 2>&1; then echo "Failed to install Docker";exit 1;fi;\ +if ! command -v sudo > /dev/null 2>&1; then echo "Failed to install Docker"; exit 1; fi;\ docker --version From b0004fd9dc9bc1afc465af84fcea010e15cc4741 Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 14 Nov 2023 12:50:52 +0000 Subject: [PATCH 033/144] Version bump --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index abb382cbe..2d38a422e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.1.0.0 +project(${PROJECT} VERSION 4.1.0.1 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) From abb2cae1f8a6c49bf56da86e7ea29ca50f6637ef Mon Sep 17 00:00:00 2001 From: tiaga Date: Tue, 14 Nov 2023 23:39:15 +0700 Subject: [PATCH 034/144] Change Qt mirror for builds Use UC Berkeley mirror for installing Qt during a build. In addition, don't trigger builds on a tag push. --- .github/workflows/deploy.yml | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 546316690..719fcd723 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,7 +1,12 @@ name: 'Deploy workflow' +on: + push: + branches: + - '**' -on: [push] +env: + QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ # https://download.qt.io/static/mirrorlist/ jobs: Build-Linux-Ubuntu: @@ -25,7 +30,7 @@ jobs: setup-python: 'true' tools: 'tools_ifw' set-env: 'true' - extra: '--external 7z' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Get sources' uses: actions/checkout@v3 @@ -89,7 +94,7 @@ jobs: setup-python: 'true' tools: 'tools_ifw' set-env: 'true' - extra: '--external 7z' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Setup mvsc' uses: ilammy/msvc-dev-cmd@v1 @@ -119,15 +124,14 @@ jobs: # ------------------------------------------------------ - Build-IOS: - name: 'Build-IOS' + Build-iOS: + name: 'Build-iOS' runs-on: macos-12 env: QT_VERSION: 6.5.2 steps: - # Just select XCode - name: 'Setup xcode' uses: maxim-lobanov/setup-xcode@v1 with: @@ -143,6 +147,7 @@ jobs: arch: 'clang_64' dir: ${{ runner.temp }} set-env: 'true' + extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install iOS Qt' uses: jurplel/install-qt-action@v3 @@ -154,7 +159,7 @@ jobs: dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' - extra: '--external 7z' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Install go' uses: actions/setup-go@v3 @@ -174,7 +179,7 @@ jobs: - name: 'Setup ccache' uses: hendrikmuhs/ccache-action@v1.2 - - name: Install dependencies + - name: 'Install dependencies' run: pip install jsonschema jinja2 - name: 'Build project' @@ -232,7 +237,7 @@ jobs: setup-python: 'true' tools: 'tools_ifw' set-env: 'true' - extra: '--external 7z' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Get sources' uses: actions/checkout@v3 @@ -296,7 +301,7 @@ jobs: dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' - extra: '--external 7z' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Install android Qt' uses: jurplel/install-qt-action@v3 @@ -309,7 +314,7 @@ jobs: dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' - extra: '--external 7z' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Grant execute permission for qt-cmake' shell: bash From fcabf08e74398cd57e506797feb4e70d9e981c57 Mon Sep 17 00:00:00 2001 From: albexk Date: Sat, 11 Nov 2023 13:40:36 +0300 Subject: [PATCH 035/144] Update gradle, fix gradlew.bat crlf --- .gitattributes | 1 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- client/android/gradlew | 301 +++++++++++------- client/android/gradlew.bat | 56 ++-- 5 files changed, 223 insertions(+), 137 deletions(-) diff --git a/.gitattributes b/.gitattributes index c96e19e3d..44b9d8f3f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,4 @@ deploy/data/windows/x64/tap/windows_10/OemVista.inf eol=crlf deploy/data/windows/x32/tap/windows_7/OemVista.inf eol=crlf deploy/data/windows/x32/tap/windows_10/OemVista.inf eol=crlf client/3rd/* linguist-vendored +client/android/gradlew.bat eol=crlf diff --git a/client/android/gradle/wrapper/gradle-wrapper.jar b/client/android/gradle/wrapper/gradle-wrapper.jar index f6b961fd5a86aa5fbfe90f707c3138408be7c718..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch literal 63721 zcmb5Wb9gP!wgnp7wrv|bwr$&XvSZt}Z6`anZSUAlc9NHKf9JdJ;NJVr`=eI(_pMp0 zy1VAAG3FfAOI`{X1O)&90s;U4K;XLp008~hCjbEC_fbYfS%6kTR+JtXK>nW$ZR+`W ze|#J8f4A@M|F5BpfUJb5h>|j$jOe}0oE!`Zf6fM>CR?!y@zU(cL8NsKk`a z6tx5mAkdjD;J=LcJ;;Aw8p!v#ouk>mUDZF@ zK>yvw%+bKu+T{Nk@LZ;zkYy0HBKw06_IWcMHo*0HKpTsEFZhn5qCHH9j z)|XpN&{`!0a>Vl+PmdQc)Yg4A(AG-z!+@Q#eHr&g<9D?7E)_aEB?s_rx>UE9TUq|? z;(ggJt>9l?C|zoO@5)tu?EV0x_7T17q4fF-q3{yZ^ipUbKcRZ4Qftd!xO(#UGhb2y>?*@{xq%`(-`2T^vc=#< zx!+@4pRdk&*1ht2OWk^Z5IAQ0YTAXLkL{(D*$gENaD)7A%^XXrCchN&z2x+*>o2FwPFjWpeaL=!tzv#JOW#( z$B)Nel<+$bkH1KZv3&-}=SiG~w2sbDbAWarg%5>YbC|}*d9hBjBkR(@tyM0T)FO$# zPtRXukGPnOd)~z=?avu+4Co@wF}1T)-uh5jI<1$HLtyDrVak{gw`mcH@Q-@wg{v^c zRzu}hMKFHV<8w}o*yg6p@Sq%=gkd~;`_VGTS?L@yVu`xuGy+dH6YOwcP6ZE`_0rK% zAx5!FjDuss`FQ3eF|mhrWkjux(Pny^k$u_)dyCSEbAsecHsq#8B3n3kDU(zW5yE|( zgc>sFQywFj5}U*qtF9Y(bi*;>B7WJykcAXF86@)z|0-Vm@jt!EPoLA6>r)?@DIobIZ5Sx zsc@OC{b|3%vaMbyeM|O^UxEYlEMHK4r)V-{r)_yz`w1*xV0|lh-LQOP`OP`Pk1aW( z8DSlGN>Ts|n*xj+%If~+E_BxK)~5T#w6Q1WEKt{!Xtbd`J;`2a>8boRo;7u2M&iOop4qcy<)z023=oghSFV zST;?S;ye+dRQe>ygiJ6HCv4;~3DHtJ({fWeE~$H@mKn@Oh6Z(_sO>01JwH5oA4nvK zr5Sr^g+LC zLt(i&ecdmqsIJGNOSUyUpglvhhrY8lGkzO=0USEKNL%8zHshS>Qziu|`eyWP^5xL4 zRP122_dCJl>hZc~?58w~>`P_s18VoU|7(|Eit0-lZRgLTZKNq5{k zE?V=`7=R&ro(X%LTS*f+#H-mGo_j3dm@F_krAYegDLk6UV{`UKE;{YSsn$ z(yz{v1@p|p!0>g04!eRSrSVb>MQYPr8_MA|MpoGzqyd*$@4j|)cD_%^Hrd>SorF>@ zBX+V<@vEB5PRLGR(uP9&U&5=(HVc?6B58NJT_igiAH*q~Wb`dDZpJSKfy5#Aag4IX zj~uv74EQ_Q_1qaXWI!7Vf@ZrdUhZFE;L&P_Xr8l@GMkhc#=plV0+g(ki>+7fO%?Jb zl+bTy7q{w^pTb{>(Xf2q1BVdq?#f=!geqssXp z4pMu*q;iiHmA*IjOj4`4S&|8@gSw*^{|PT}Aw~}ZXU`6=vZB=GGeMm}V6W46|pU&58~P+?LUs%n@J}CSrICkeng6YJ^M? zS(W?K4nOtoBe4tvBXs@@`i?4G$S2W&;$z8VBSM;Mn9 zxcaEiQ9=vS|bIJ>*tf9AH~m&U%2+Dim<)E=}KORp+cZ^!@wI`h1NVBXu{@%hB2Cq(dXx_aQ9x3mr*fwL5!ZryQqi|KFJuzvP zK1)nrKZ7U+B{1ZmJub?4)Ln^J6k!i0t~VO#=q1{?T)%OV?MN}k5M{}vjyZu#M0_*u z8jwZKJ#Df~1jcLXZL7bnCEhB6IzQZ-GcoQJ!16I*39iazoVGugcKA{lhiHg4Ta2fD zk1Utyc5%QzZ$s3;p0N+N8VX{sd!~l*Ta3|t>lhI&G`sr6L~G5Lul`>m z{!^INm?J|&7X=;{XveF!(b*=?9NAp4y&r&N3(GKcW4rS(Ejk|Lzs1PrxPI_owB-`H zg3(Rruh^&)`TKA6+_!n>RdI6pw>Vt1_j&+bKIaMTYLiqhZ#y_=J8`TK{Jd<7l9&sY z^^`hmi7^14s16B6)1O;vJWOF$=$B5ONW;;2&|pUvJlmeUS&F;DbSHCrEb0QBDR|my zIs+pE0Y^`qJTyH-_mP=)Y+u^LHcuZhsM3+P||?+W#V!_6E-8boP#R-*na4!o-Q1 zVthtYhK{mDhF(&7Okzo9dTi03X(AE{8cH$JIg%MEQca`S zy@8{Fjft~~BdzWC(di#X{ny;!yYGK9b@=b|zcKZ{vv4D8i+`ilOPl;PJl{!&5-0!w z^fOl#|}vVg%=n)@_e1BrP)`A zKPgs`O0EO}Y2KWLuo`iGaKu1k#YR6BMySxQf2V++Wo{6EHmK>A~Q5o73yM z-RbxC7Qdh0Cz!nG+7BRZE>~FLI-?&W_rJUl-8FDIaXoNBL)@1hwKa^wOr1($*5h~T zF;%f^%<$p8Y_yu(JEg=c_O!aZ#)Gjh$n(hfJAp$C2he555W5zdrBqjFmo|VY+el;o z=*D_w|GXG|p0**hQ7~9-n|y5k%B}TAF0iarDM!q-jYbR^us(>&y;n^2l0C%@2B}KM zyeRT9)oMt97Agvc4sEKUEy%MpXr2vz*lb zh*L}}iG>-pqDRw7ud{=FvTD?}xjD)w{`KzjNom-$jS^;iw0+7nXSnt1R@G|VqoRhE%12nm+PH?9`(4rM0kfrZzIK9JU=^$YNyLvAIoxl#Q)xxDz!^0@zZ zSCs$nfcxK_vRYM34O<1}QHZ|hp4`ioX3x8(UV(FU$J@o%tw3t4k1QPmlEpZa2IujG&(roX_q*%e`Hq|);0;@k z0z=fZiFckp#JzW0p+2A+D$PC~IsakhJJkG(c;CqAgFfU0Z`u$PzG~-9I1oPHrCw&)@s^Dc~^)#HPW0Ra}J^=|h7Fs*<8|b13ZzG6MP*Q1dkoZ6&A^!}|hbjM{2HpqlSXv_UUg1U4gn z3Q)2VjU^ti1myodv+tjhSZp%D978m~p& z43uZUrraHs80Mq&vcetqfQpQP?m!CFj)44t8Z}k`E798wxg&~aCm+DBoI+nKq}&j^ zlPY3W$)K;KtEajks1`G?-@me7C>{PiiBu+41#yU_c(dITaqE?IQ(DBu+c^Ux!>pCj zLC|HJGU*v+!it1(;3e`6igkH(VA)-S+k(*yqxMgUah3$@C zz`7hEM47xr>j8^g`%*f=6S5n>z%Bt_Fg{Tvmr+MIsCx=0gsu_sF`q2hlkEmisz#Fy zj_0;zUWr;Gz}$BS%Y`meb(=$d%@Crs(OoJ|}m#<7=-A~PQbyN$x%2iXP2@e*nO0b7AwfH8cCUa*Wfu@b)D_>I*%uE4O3 z(lfnB`-Xf*LfC)E}e?%X2kK7DItK6Tf<+M^mX0Ijf_!IP>7c8IZX%8_#0060P{QMuV^B9i<^E`_Qf0pv9(P%_s8D`qvDE9LK9u-jB}J2S`(mCO&XHTS04Z5Ez*vl^T%!^$~EH8M-UdwhegL>3IQ*)(MtuH2Xt1p!fS4o~*rR?WLxlA!sjc2(O znjJn~wQ!Fp9s2e^IWP1C<4%sFF}T4omr}7+4asciyo3DntTgWIzhQpQirM$9{EbQd z3jz9vS@{aOqTQHI|l#aUV@2Q^Wko4T0T04Me4!2nsdrA8QY1%fnAYb~d2GDz@lAtfcHq(P7 zaMBAGo}+NcE-K*@9y;Vt3*(aCaMKXBB*BJcD_Qnxpt75r?GeAQ}*|>pYJE=uZb73 zC>sv)18)q#EGrTG6io*}JLuB_jP3AU1Uiu$D7r|2_zlIGb9 zjhst#ni)Y`$)!fc#reM*$~iaYoz~_Cy7J3ZTiPm)E?%`fbk`3Tu-F#`{i!l5pNEn5 zO-Tw-=TojYhzT{J=?SZj=Z8#|eoF>434b-DXiUsignxXNaR3 zm_}4iWU$gt2Mw5NvZ5(VpF`?X*f2UZDs1TEa1oZCif?Jdgr{>O~7}-$|BZ7I(IKW`{f;@|IZFX*R8&iT= zoWstN8&R;}@2Ka%d3vrLtR|O??ben;k8QbS-WB0VgiCz;<$pBmIZdN!aalyCSEm)crpS9dcD^Y@XT1a3+zpi-`D}e#HV<} z$Y(G&o~PvL-xSVD5D?JqF3?B9rxGWeb=oEGJ3vRp5xfBPlngh1O$yI95EL+T8{GC@ z98i1H9KhZGFl|;`)_=QpM6H?eDPpw~^(aFQWwyXZ8_EEE4#@QeT_URray*mEOGsGc z6|sdXtq!hVZo=d#+9^@lm&L5|q&-GDCyUx#YQiccq;spOBe3V+VKdjJA=IL=Zn%P} zNk=_8u}VhzFf{UYZV0`lUwcD&)9AFx0@Fc6LD9A6Rd1=ga>Mi0)_QxM2ddCVRmZ0d z+J=uXc(?5JLX3=)e)Jm$HS2yF`44IKhwRnm2*669_J=2LlwuF5$1tAo@ROSU@-y+;Foy2IEl2^V1N;fk~YR z?&EP8#t&m0B=?aJeuz~lHjAzRBX>&x=A;gIvb>MD{XEV zV%l-+9N-)i;YH%nKP?>f`=?#`>B(`*t`aiPLoQM(a6(qs4p5KFjDBN?8JGrf3z8>= zi7sD)c)Nm~x{e<^jy4nTx${P~cwz_*a>%0_;ULou3kHCAD7EYkw@l$8TN#LO9jC( z1BeFW`k+bu5e8Ns^a8dPcjEVHM;r6UX+cN=Uy7HU)j-myRU0wHd$A1fNI~`4;I~`zC)3ul#8#^rXVSO*m}Ag>c%_;nj=Nv$rCZ z*~L@C@OZg%Q^m)lc-kcX&a*a5`y&DaRxh6O*dfhLfF+fU5wKs(1v*!TkZidw*)YBP za@r`3+^IHRFeO%!ai%rxy;R;;V^Fr=OJlpBX;(b*3+SIw}7= zIq$*Thr(Zft-RlY)D3e8V;BmD&HOfX+E$H#Y@B3?UL5L~_fA-@*IB-!gItK7PIgG9 zgWuGZK_nuZjHVT_Fv(XxtU%)58;W39vzTI2n&)&4Dmq7&JX6G>XFaAR{7_3QB6zsT z?$L8c*WdN~nZGiscY%5KljQARN;`w$gho=p006z;n(qIQ*Zu<``TMO3n0{ARL@gYh zoRwS*|Niw~cR!?hE{m*y@F`1)vx-JRfqET=dJ5_(076st(=lFfjtKHoYg`k3oNmo_ zNbQEw8&sO5jAYmkD|Zaz_yUb0rC})U!rCHOl}JhbYIDLzLvrZVw0~JO`d*6f;X&?V=#T@ND*cv^I;`sFeq4 z##H5;gpZTb^0Hz@3C*~u0AqqNZ-r%rN3KD~%Gw`0XsIq$(^MEb<~H(2*5G^<2(*aI z%7}WB+TRlMIrEK#s0 z93xn*Ohb=kWFc)BNHG4I(~RPn-R8#0lqyBBz5OM6o5|>x9LK@%HaM}}Y5goCQRt2C z{j*2TtT4ne!Z}vh89mjwiSXG=%DURar~=kGNNaO_+Nkb+tRi~Rkf!7a$*QlavziD( z83s4GmQ^Wf*0Bd04f#0HX@ua_d8 z23~z*53ePD6@xwZ(vdl0DLc=>cPIOPOdca&MyR^jhhKrdQO?_jJh`xV3GKz&2lvP8 zEOwW6L*ufvK;TN{=S&R@pzV^U=QNk^Ec}5H z+2~JvEVA{`uMAr)?Kf|aW>33`)UL@bnfIUQc~L;TsTQ6>r-<^rB8uoNOJ>HWgqMI8 zSW}pZmp_;z_2O5_RD|fGyTxaxk53Hg_3Khc<8AUzV|ZeK{fp|Ne933=1&_^Dbv5^u zB9n=*)k*tjHDRJ@$bp9mrh}qFn*s}npMl5BMDC%Hs0M0g-hW~P*3CNG06G!MOPEQ_ zi}Qs-6M8aMt;sL$vlmVBR^+Ry<64jrm1EI1%#j?c?4b*7>)a{aDw#TfTYKq+SjEFA z(aJ&z_0?0JB83D-i3Vh+o|XV4UP+YJ$9Boid2^M2en@APw&wx7vU~t$r2V`F|7Qfo z>WKgI@eNBZ-+Og<{u2ZiG%>YvH2L3fNpV9J;WLJoBZda)01Rn;o@){01{7E#ke(7U zHK>S#qZ(N=aoae*4X!0A{)nu0R_sKpi1{)u>GVjC+b5Jyl6#AoQ-1_3UDovNSo`T> z?c-@7XX*2GMy?k?{g)7?Sv;SJkmxYPJPs!&QqB12ejq`Lee^-cDveVWL^CTUldb(G zjDGe(O4P=S{4fF=#~oAu>LG>wrU^z_?3yt24FOx>}{^lCGh8?vtvY$^hbZ)9I0E3r3NOlb9I?F-Yc=r$*~l`4N^xzlV~N zl~#oc>U)Yjl0BxV>O*Kr@lKT{Z09OXt2GlvE38nfs+DD7exl|&vT;)>VFXJVZp9Np zDK}aO;R3~ag$X*|hRVY3OPax|PG`@_ESc8E!mHRByJbZQRS38V2F__7MW~sgh!a>98Q2%lUNFO=^xU52|?D=IK#QjwBky-C>zOWlsiiM&1n z;!&1((Xn1$9K}xabq~222gYvx3hnZPg}VMF_GV~5ocE=-v>V=T&RsLBo&`)DOyIj* zLV{h)JU_y*7SdRtDajP_Y+rBkNN*1_TXiKwHH2&p51d(#zv~s#HwbNy?<+(=9WBvo zw2hkk2Dj%kTFhY+$T+W-b7@qD!bkfN#Z2ng@Pd=i3-i?xYfs5Z*1hO?kd7Sp^9`;Y zM2jeGg<-nJD1er@Pc_cSY7wo5dzQX44=%6rn}P_SRbpzsA{6B+!$3B0#;}qwO37G^ zL(V_5JK`XT?OHVk|{_$vQ|oNEpab*BO4F zUTNQ7RUhnRsU`TK#~`)$icsvKh~(pl=3p6m98@k3P#~upd=k*u20SNcb{l^1rUa)>qO997)pYRWMncC8A&&MHlbW?7i^7M`+B$hH~Y|J zd>FYOGQ;j>Zc2e7R{KK7)0>>nn_jYJy&o@sK!4G>-rLKM8Hv)f;hi1D2fAc$+six2 zyVZ@wZ6x|fJ!4KrpCJY=!Mq0;)X)OoS~{Lkh6u8J`eK%u0WtKh6B>GW_)PVc zl}-k`p09qwGtZ@VbYJC!>29V?Dr>>vk?)o(x?!z*9DJ||9qG-&G~#kXxbw{KKYy}J zQKa-dPt~M~E}V?PhW0R26xdA%1T*%ra6SguGu50YHngOTIv)@N|YttEXo#OZfgtP7;H?EeZZxo<}3YlYxtBq znJ!WFR^tmGf0Py}N?kZ(#=VtpC@%xJkDmfcCoBTxq zr_|5gP?u1@vJZbxPZ|G0AW4=tpb84gM2DpJU||(b8kMOV1S3|(yuwZJ&rIiFW(U;5 zUtAW`O6F6Zy+eZ1EDuP~AAHlSY-+A_eI5Gx)%*uro5tljy}kCZU*_d7)oJ>oQSZ3* zneTn`{gnNC&uJd)0aMBzAg021?YJ~b(fmkwZAd696a=0NzBAqBN54KuNDwa*no(^O z6p05bioXUR^uXjpTol*ppHp%1v9e)vkoUAUJyBx3lw0UO39b0?^{}yb!$yca(@DUn zCquRF?t=Zb9`Ed3AI6|L{eX~ijVH`VzSMheKoP7LSSf4g>md>`yi!TkoG5P>Ofp+n z(v~rW+(5L96L{vBb^g51B=(o)?%%xhvT*A5btOpw(TKh^g^4c zw>0%X!_0`{iN%RbVk+A^f{w-4-SSf*fu@FhruNL##F~sF24O~u zyYF<3el2b$$wZ_|uW#@Ak+VAGk#e|kS8nL1g>2B-SNMjMp^8;-FfeofY2fphFHO!{ z*!o4oTb{4e;S<|JEs<1_hPsmAlVNk?_5-Fp5KKU&d#FiNW~Y+pVFk@Cua1I{T+1|+ zHx6rFMor)7L)krbilqsWwy@T+g3DiH5MyVf8Wy}XbEaoFIDr~y;@r&I>FMW{ z?Q+(IgyebZ)-i4jNoXQhq4Muy9Fv+OxU;9_Jmn+<`mEC#%2Q_2bpcgzcinygNI!&^ z=V$)o2&Yz04~+&pPWWn`rrWxJ&}8khR)6B(--!9Q zubo}h+1T)>a@c)H^i``@<^j?|r4*{;tQf78(xn0g39IoZw0(CwY1f<%F>kEaJ zp9u|IeMY5mRdAlw*+gSN^5$Q)ShM<~E=(c8QM+T-Qk)FyKz#Sw0EJ*edYcuOtO#~Cx^(M7w5 z3)rl#L)rF|(Vun2LkFr!rg8Q@=r>9p>(t3Gf_auiJ2Xx9HmxYTa|=MH_SUlYL`mz9 zTTS$`%;D-|Jt}AP1&k7PcnfFNTH0A-*FmxstjBDiZX?}%u%Yq94$fUT&z6od+(Uk> zuqsld#G(b$G8tus=M!N#oPd|PVFX)?M?tCD0tS%2IGTfh}3YA3f&UM)W$_GNV8 zQo+a(ml2Km4o6O%gKTCSDNq+#zCTIQ1*`TIJh~k6Gp;htHBFnne))rlFdGqwC6dx2+La1&Mnko*352k0y z+tQcwndQlX`nc6nb$A9?<-o|r*%aWXV#=6PQic0Ok_D;q>wbv&j7cKc!w4~KF#-{6 z(S%6Za)WpGIWf7jZ3svNG5OLs0>vCL9{V7cgO%zevIVMH{WgP*^D9ws&OqA{yr|m| zKD4*07dGXshJHd#e%x%J+qmS^lS|0Bp?{drv;{@{l9ArPO&?Q5=?OO9=}h$oVe#3b z3Yofj&Cb}WC$PxmRRS)H%&$1-)z7jELS}!u!zQ?A^Y{Tv4QVt*vd@uj-^t2fYRzQj zfxGR>-q|o$3sGn^#VzZ!QQx?h9`njeJry}@x?|k0-GTTA4y3t2E`3DZ!A~D?GiJup z)8%PK2^9OVRlP(24P^4_<|D=H^7}WlWu#LgsdHzB%cPy|f8dD3|A^mh4WXxhLTVu_ z@abE{6Saz|Y{rXYPd4$tfPYo}ef(oQWZ=4Bct-=_9`#Qgp4ma$n$`tOwq#&E18$B; z@Bp)bn3&rEi0>fWWZ@7k5WazfoX`SCO4jQWwVuo+$PmSZn^Hz?O(-tW@*DGxuf)V1 zO_xm&;NVCaHD4dqt(-MlszI3F-p?0!-e$fbiCeuaw66h^TTDLWuaV<@C-`=Xe5WL) zwooG7h>4&*)p3pKMS3O!4>-4jQUN}iAMQ)2*70?hP~)TzzR?-f@?Aqy$$1Iy8VGG$ zMM?8;j!pUX7QQD$gRc_#+=raAS577ga-w?jd`vCiN5lu)dEUkkUPl9!?{$IJNxQys z*E4e$eF&n&+AMRQR2gcaFEjAy*r)G!s(P6D&TfoApMFC_*Ftx0|D0@E-=B7tezU@d zZ{hGiN;YLIoSeRS;9o%dEua4b%4R3;$SugDjP$x;Z!M!@QibuSBb)HY!3zJ7M;^jw zlx6AD50FD&p3JyP*>o+t9YWW8(7P2t!VQQ21pHJOcG_SXQD;(5aX#M6x##5H_Re>6lPyDCjxr*R(+HE%c&QN+b^tbT zXBJk?p)zhJj#I?&Y2n&~XiytG9!1ox;bw5Rbj~)7c(MFBb4>IiRATdhg zmiEFlj@S_hwYYI(ki{}&<;_7(Z0Qkfq>am z&LtL=2qc7rWguk3BtE4zL41@#S;NN*-jWw|7Kx7H7~_%7fPt;TIX}Ubo>;Rmj94V> zNB1=;-9AR7s`Pxn}t_6^3ahlq53e&!Lh85uG zec0vJY_6e`tg7LgfrJ3k!DjR)Bi#L@DHIrZ`sK=<5O0Ip!fxGf*OgGSpP@Hbbe&$9 z;ZI}8lEoC2_7;%L2=w?tb%1oL0V+=Z`7b=P&lNGY;yVBazXRYu;+cQDKvm*7NCxu&i;zub zAJh#11%?w>E2rf2e~C4+rAb-&$^vsdACs7 z@|Ra!OfVM(ke{vyiqh7puf&Yp6cd6{DptUteYfIRWG3pI+5< zBVBI_xkBAc<(pcb$!Y%dTW(b;B;2pOI-(QCsLv@U-D1XJ z(Gk8Q3l7Ws46Aktuj>|s{$6zA&xCPuXL-kB`CgYMs}4IeyG*P51IDwW?8UNQd+$i~ zlxOPtSi5L|gJcF@DwmJA5Ju8HEJ>o{{upwIpb!f{2(vLNBw`7xMbvcw<^{Fj@E~1( z?w`iIMieunS#>nXlmUcSMU+D3rX28f?s7z;X=se6bo8;5vM|O^(D6{A9*ChnGH!RG zP##3>LDC3jZPE4PH32AxrqPk|yIIrq~`aL-=}`okhNu9aT%q z1b)7iJ)CN=V#Ly84N_r7U^SH2FGdE5FpTO2 z630TF$P>GNMu8`rOytb(lB2};`;P4YNwW1<5d3Q~AX#P0aX}R2b2)`rgkp#zTxcGj zAV^cvFbhP|JgWrq_e`~exr~sIR$6p5V?o4Wym3kQ3HA+;Pr$bQ0(PmADVO%MKL!^q z?zAM8j1l4jrq|5X+V!8S*2Wl@=7*pPgciTVK6kS1Ge zMsd_u6DFK$jTnvVtE;qa+8(1sGBu~n&F%dh(&c(Zs4Fc#A=gG^^%^AyH}1^?|8quj zl@Z47h$){PlELJgYZCIHHL= z{U8O>Tw4x3<1{?$8>k-P<}1y9DmAZP_;(3Y*{Sk^H^A=_iSJ@+s5ktgwTXz_2$~W9>VVZsfwCm@s0sQ zeB50_yu@uS+e7QoPvdCwDz{prjo(AFwR%C?z`EL{1`|coJHQTk^nX=tvs1<0arUOJ z!^`*x&&BvTYmemyZ)2p~{%eYX=JVR?DYr(rNgqRMA5E1PR1Iw=prk=L2ldy3r3Vg@27IZx43+ywyzr-X*p*d@tZV+!U#~$-q=8c zgdSuh#r?b4GhEGNai)ayHQpk>5(%j5c@C1K3(W1pb~HeHpaqijJZa-e6vq_8t-^M^ zBJxq|MqZc?pjXPIH}70a5vt!IUh;l}<>VX<-Qcv^u@5(@@M2CHSe_hD$VG-eiV^V( zj7*9T0?di?P$FaD6oo?)<)QT>Npf6Og!GO^GmPV(Km0!=+dE&bk#SNI+C9RGQ|{~O*VC+tXK3!n`5 zHfl6>lwf_aEVV3`0T!aHNZLsj$paS$=LL(?b!Czaa5bbSuZ6#$_@LK<(7yrrl+80| z{tOFd=|ta2Z`^ssozD9BINn45NxUeCQis?-BKmU*Kt=FY-NJ+)8S1ecuFtN-M?&42 zl2$G>u!iNhAk*HoJ^4v^9#ORYp5t^wDj6|lx~5w45#E5wVqI1JQ~9l?nPp1YINf++ zMAdSif~_ETv@Er(EFBI^@L4BULFW>)NI+ejHFP*T}UhWNN`I)RRS8za? z*@`1>9ZB}An%aT5K=_2iQmfE;GcBVHLF!$`I99o5GO`O%O_zLr9AG18>&^HkG(;=V z%}c!OBQ~?MX(9h~tajX{=x)+!cbM7$YzTlmsPOdp2L-?GoW`@{lY9U3f;OUo*BwRB z8A+nv(br0-SH#VxGy#ZrgnGD(=@;HME;yd46EgWJ`EL%oXc&lFpc@Y}^>G(W>h_v_ zlN!`idhX+OjL+~T?19sroAFVGfa5tX-D49w$1g2g_-T|EpHL6}K_aX4$K=LTvwtlF zL*z}j{f+Uoe7{-px3_5iKPA<_7W=>Izkk)!l9ez2w%vi(?Y;i8AxRNLSOGDzNoqoI zP!1uAl}r=_871(G?y`i&)-7{u=%nxk7CZ_Qh#!|ITec zwQn`33GTUM`;D2POWnkqngqJhJRlM>CTONzTG}>^Q0wUunQyn|TAiHzyX2_%ATx%P z%7gW)%4rA9^)M<_%k@`Y?RbC<29sWU&5;@|9thf2#zf8z12$hRcZ!CSb>kUp=4N#y zl3hE#y6>kkA8VY2`W`g5Ip?2qC_BY$>R`iGQLhz2-S>x(RuWv)SPaGdl^)gGw7tjR zH@;jwk!jIaCgSg_*9iF|a);sRUTq30(8I(obh^|}S~}P4U^BIGYqcz;MPpC~Y@k_m zaw4WG1_vz2GdCAX!$_a%GHK**@IrHSkGoN>)e}>yzUTm52on`hYot7cB=oA-h1u|R ztH$11t?54Qg2L+i33FPFKKRm1aOjKST{l1*(nps`>sv%VqeVMWjl5+Gh+9);hIP8? zA@$?}Sc z3qIRpba+y5yf{R6G(u8Z^vkg0Fu&D-7?1s=QZU`Ub{-!Y`I?AGf1VNuc^L3v>)>i# z{DV9W$)>34wnzAXUiV^ZpYKw>UElrN_5Xj6{r_3| z$X5PK`e5$7>~9Dj7gK5ash(dvs`vwfk}&RD`>04;j62zoXESkFBklYaKm5seyiX(P zqQ-;XxlV*yg?Dhlx%xt!b0N3GHp@(p$A;8|%# zZ5m2KL|{on4nr>2_s9Yh=r5ScQ0;aMF)G$-9-Ca6%wA`Pa)i?NGFA|#Yi?{X-4ZO_ z^}%7%vkzvUHa$-^Y#aA+aiR5sa%S|Ebyn`EV<3Pc?ax_f>@sBZF1S;7y$CXd5t5=WGsTKBk8$OfH4v|0?0I=Yp}7c=WBSCg!{0n)XmiU;lfx)**zZaYqmDJelxk$)nZyx5`x$6R|fz(;u zEje5Dtm|a%zK!!tk3{i9$I2b{vXNFy%Bf{50X!x{98+BsDr_u9i>G5%*sqEX|06J0 z^IY{UcEbj6LDwuMh7cH`H@9sVt1l1#8kEQ(LyT@&+K}(ReE`ux8gb0r6L_#bDUo^P z3Ka2lRo52Hdtl_%+pwVs14=q`{d^L58PsU@AMf(hENumaxM{7iAT5sYmWh@hQCO^ zK&}ijo=`VqZ#a3vE?`7QW0ZREL17ZvDfdqKGD?0D4fg{7v%|Yj&_jcKJAB)>=*RS* zto8p6@k%;&^ZF>hvXm&$PCuEp{uqw3VPG$9VMdW5$w-fy2CNNT>E;>ejBgy-m_6`& z97L1p{%srn@O_JQgFpa_#f(_)eb#YS>o>q3(*uB;uZb605(iqM$=NK{nHY=+X2*G) zO3-_Xh%aG}fHWe*==58zBwp%&`mge<8uq8;xIxOd=P%9EK!34^E9sk|(Zq1QSz-JVeP12Fp)-`F|KY$LPwUE?rku zY@OJ)Z9A!ojfzfeyJ9;zv2EM7ZQB)AR5xGa-tMn^bl)FmoIiVyJ@!~@%{}qXXD&Ns zPnfe5U+&ohKefILu_1mPfLGuapX@btta5C#gPB2cjk5m4T}Nfi+Vfka!Yd(L?-c~5 z#ZK4VeQEXNPc4r$K00Fg>g#_W!YZ)cJ?JTS<&68_$#cZT-ME`}tcwqg3#``3M3UPvn+pi}(VNNx6y zFIMVb6OwYU(2`at$gHba*qrMVUl8xk5z-z~fb@Q3Y_+aXuEKH}L+>eW__!IAd@V}L zkw#s%H0v2k5-=vh$^vPCuAi22Luu3uKTf6fPo?*nvj$9(u)4$6tvF-%IM+3pt*cgs z_?wW}J7VAA{_~!?))?s6{M=KPpVhg4fNuU*|3THp@_(q!b*hdl{fjRVFWtu^1dV(f z6iOux9hi&+UK=|%M*~|aqFK{Urfl!TA}UWY#`w(0P!KMe1Si{8|o))Gy6d7;!JQYhgMYmXl?3FfOM2nQGN@~Ap6(G z3+d_5y@=nkpKAhRqf{qQ~k7Z$v&l&@m7Ppt#FSNzKPZM z8LhihcE6i=<(#87E|Wr~HKvVWhkll4iSK$^mUHaxgy8*K$_Zj;zJ`L$naPj+^3zTi z-3NTaaKnD5FPY-~?Tq6QHnmDDRxu0mh0D|zD~Y=vv_qig5r-cIbCpxlju&8Sya)@{ zsmv6XUSi)@(?PvItkiZEeN*)AE~I_?#+Ja-r8$(XiXei2d@Hi7Rx8+rZZb?ZLa{;@*EHeRQ-YDadz~M*YCM4&F-r;E#M+@CSJMJ0oU|PQ^ z=E!HBJDMQ2TN*Y(Ag(ynAL8%^v;=~q?s4plA_hig&5Z0x_^Oab!T)@6kRN$)qEJ6E zNuQjg|G7iwU(N8pI@_6==0CL;lRh1dQF#wePhmu@hADFd3B5KIH#dx(2A zp~K&;Xw}F_N6CU~0)QpQk7s$a+LcTOj1%=WXI(U=Dv!6 z{#<#-)2+gCyyv=Jw?Ab#PVkxPDeH|sAxyG`|Ys}A$PW4TdBv%zDz z^?lwrxWR<%Vzc8Sgt|?FL6ej_*e&rhqJZ3Y>k=X(^dytycR;XDU16}Pc9Vn0>_@H+ zQ;a`GSMEG64=JRAOg%~L)x*w{2re6DVprNp+FcNra4VdNjiaF0M^*>CdPkt(m150rCue?FVdL0nFL$V%5y6N z%eLr5%YN7D06k5ji5*p4v$UMM)G??Q%RB27IvH7vYr_^3>1D-M66#MN8tWGw>WED} z5AhlsanO=STFYFs)Il_0i)l)f<8qn|$DW7ZXhf5xI;m+7M5-%P63XFQrG9>DMqHc} zsgNU9nR`b}E^mL5=@7<1_R~j@q_2U^3h|+`7YH-?C=vme1C3m`Fe0HC>pjt6f_XMh zy~-i-8R46QNYneL4t@)<0VU7({aUO?aH`z4V2+kxgH5pYD5)wCh75JqQY)jIPN=U6 z+qi8cGiOtXG2tXm;_CfpH9ESCz#i5B(42}rBJJF$jh<1sbpj^8&L;gzGHb8M{of+} zzF^8VgML2O9nxBW7AvdEt90vp+#kZxWf@A)o9f9}vKJy9NDBjBW zSt=Hcs=YWCwnfY1UYx*+msp{g!w0HC<_SM!VL1(I2PE?CS}r(eh?{I)mQixmo5^p# zV?2R!R@3GV6hwTCrfHiK#3Orj>I!GS2kYhk1S;aFBD_}u2v;0HYFq}Iz1Z(I4oca4 zxquja8$+8JW_EagDHf$a1OTk5S97umGSDaj)gH=fLs9>_=XvVj^Xj9a#gLdk=&3tl zfmK9MNnIX9v{?%xdw7568 zNrZ|roYs(vC4pHB5RJ8>)^*OuyNC>x7ad)tB_}3SgQ96+-JT^Qi<`xi=)_=$Skwv~ zdqeT9Pa`LYvCAn&rMa2aCDV(TMI#PA5g#RtV|CWpgDYRA^|55LLN^uNh*gOU>Z=a06qJ;$C9z8;n-Pq=qZnc1zUwJ@t)L;&NN+E5m zRkQ(SeM8=l-aoAKGKD>!@?mWTW&~)uF2PYUJ;tB^my`r9n|Ly~0c%diYzqs9W#FTjy?h&X3TnH zXqA{QI82sdjPO->f=^K^f>N`+B`q9&rN0bOXO79S&a9XX8zund(kW7O76f4dcWhIu zER`XSMSFbSL>b;Rp#`CuGJ&p$s~G|76){d?xSA5wVg##_O0DrmyEYppyBr%fyWbbv zp`K84JwRNP$d-pJ!Qk|(RMr?*!wi1if-9G#0p>>1QXKXWFy)eB3ai)l3601q8!9JC zvU#ZWWDNKq9g6fYs?JQ)Q4C_cgTy3FhgKb8s&m)DdmL5zhNK#8wWg!J*7G7Qhe9VU zha?^AQTDpYcuN!B+#1dE*X{<#!M%zfUQbj=zLE{dW0XeQ7-oIsGY6RbkP2re@Q{}r_$iiH0xU%iN*ST`A)-EH6eaZB$GA#v)cLi z*MpA(3bYk$oBDKAzu^kJoSUsDd|856DApz={3u8sbQV@JnRkp2nC|)m;#T=DvIL-O zI4vh;g7824l}*`_p@MT4+d`JZ2%6NQh=N9bmgJ#q!hK@_<`HQq3}Z8Ij>3%~<*= zcv=!oT#5xmeGI92lqm9sGVE%#X$ls;St|F#u!?5Y7syhx6q#MVRa&lBmmn%$C0QzU z);*ldgwwCmzM3uglr}!Z2G+?& zf%Dpo&mD%2ZcNFiN-Z0f;c_Q;A%f@>26f?{d1kxIJD}LxsQkB47SAdwinfMILZdN3 zfj^HmTzS3Ku5BxY>ANutS8WPQ-G>v4^_Qndy==P3pDm+Xc?>rUHl-4+^%Sp5atOja z2oP}ftw-rqnb}+khR3CrRg^ibi6?QYk1*i^;kQGirQ=uB9Sd1NTfT-Rbv;hqnY4neE5H1YUrjS2m+2&@uXiAo- zrKUX|Ohg7(6F(AoP~tj;NZlV#xsfo-5reuQHB$&EIAhyZk;bL;k9ouDmJNBAun;H& zn;Of1z_Qj`x&M;5X;{s~iGzBQTY^kv-k{ksbE*Dl%Qf%N@hQCfY~iUw!=F-*$cpf2 z3wix|aLBV0b;W@z^%7S{>9Z^T^fLOI68_;l@+Qzaxo`nAI8emTV@rRhEKZ z?*z_{oGdI~R*#<2{bkz$G~^Qef}$*4OYTgtL$e9q!FY7EqxJ2`zk6SQc}M(k(_MaV zSLJnTXw&@djco1~a(vhBl^&w=$fa9{Sru>7g8SHahv$&Bl(D@(Zwxo_3r=;VH|uc5 zi1Ny)J!<(KN-EcQ(xlw%PNwK8U>4$9nVOhj(y0l9X^vP1TA>r_7WtSExIOsz`nDOP zs}d>Vxb2Vo2e5x8p(n~Y5ggAyvib>d)6?)|E@{FIz?G3PVGLf7-;BxaP;c?7ddH$z zA+{~k^V=bZuXafOv!RPsE1GrR3J2TH9uB=Z67gok+u`V#}BR86hB1xl}H4v`F+mRfr zYhortD%@IGfh!JB(NUNSDh+qDz?4ztEgCz&bIG-Wg7w-ua4ChgQR_c+z8dT3<1?uX z*G(DKy_LTl*Ea!%v!RhpCXW1WJO6F`bgS-SB;Xw9#! z<*K}=#wVu9$`Yo|e!z-CPYH!nj7s9dEPr-E`DXUBu0n!xX~&|%#G=BeM?X@shQQMf zMvr2!y7p_gD5-!Lnm|a@z8Of^EKboZsTMk%5VsJEm>VsJ4W7Kv{<|#4f-qDE$D-W>gWT%z-!qXnDHhOvLk=?^a1*|0j z{pW{M0{#1VcR5;F!!fIlLVNh_Gj zbnW(_j?0c2q$EHIi@fSMR{OUKBcLr{Y&$hrM8XhPByyZaXy|dd&{hYQRJ9@Fn%h3p7*VQolBIV@Eq`=y%5BU~3RPa^$a?ixp^cCg z+}Q*X+CW9~TL29@OOng(#OAOd!)e$d%sr}^KBJ-?-X&|4HTmtemxmp?cT3uA?md4% zT8yZ0U;6Rg6JHy3fJae{6TMGS?ZUX6+gGTT{Q{)SI85$5FD{g-eR%O0KMpWPY`4@O zx!hen1*8^E(*}{m^V_?}(b5k3hYo=T+$&M32+B`}81~KKZhY;2H{7O-M@vbCzuX0n zW-&HXeyr1%I3$@ns-V1~Lb@wIpkmx|8I~ob1Of7i6BTNysEwI}=!nU%q7(V_^+d*G z7G;07m(CRTJup!`cdYi93r^+LY+`M*>aMuHJm(A8_O8C#A*$!Xvddgpjx5)?_EB*q zgE8o5O>e~9IiSC@WtZpF{4Bj2J5eZ>uUzY%TgWF7wdDE!fSQIAWCP)V{;HsU3ap?4 znRsiiDbtN7i9hapO;(|Ew>Ip2TZSvK9Z^N21%J?OiA_&eP1{(Pu_=%JjKy|HOardq ze?zK^K zA%sjF64*Wufad%H<) z^|t>e*h+Z1#l=5wHexzt9HNDNXgM=-OPWKd^5p!~%SIl>Fo&7BvNpbf8{NXmH)o{r zO=aBJ;meX1^{O%q;kqdw*5k!Y7%t_30 zy{nGRVc&5qt?dBwLs+^Sfp;f`YVMSB#C>z^a9@fpZ!xb|b-JEz1LBX7ci)V@W+kvQ89KWA0T~Lj$aCcfW#nD5bt&Y_< z-q{4ZXDqVg?|0o)j1%l0^_it0WF*LCn-+)c!2y5yS7aZIN$>0LqNnkujV*YVes(v$ zY@_-!Q;!ZyJ}Bg|G-~w@or&u0RO?vlt5*9~yeoPV_UWrO2J54b4#{D(D>jF(R88u2 zo#B^@iF_%S>{iXSol8jpmsZuJ?+;epg>k=$d`?GSegAVp3n$`GVDvK${N*#L_1`44 z{w0fL{2%)0|E+qgZtjX}itZz^KJt4Y;*8uSK}Ft38+3>j|K(PxIXXR-t4VopXo#9# zt|F{LWr-?34y`$nLBVV_*UEgA6AUI65dYIbqpNq9cl&uLJ0~L}<=ESlOm?Y-S@L*d z<7vt}`)TW#f%Rp$Q}6@3=j$7Tze@_uZO@aMn<|si{?S}~maII`VTjs&?}jQ4_cut9$)PEqMukwoXobzaKx^MV z2fQwl+;LSZ$qy%Tys0oo^K=jOw$!YwCv^ei4NBVauL)tN%=wz9M{uf{IB(BxK|lT*pFkmNK_1tV`nb%jH=a0~VNq2RCKY(rG7jz!-D^k)Ec)yS%17pE#o6&eY+ z^qN(hQT$}5F(=4lgNQhlxj?nB4N6ntUY6(?+R#B?W3hY_a*)hnr4PA|vJ<6p`K3Z5Hy z{{8(|ux~NLUW=!?9Qe&WXMTAkQnLXg(g=I@(VG3{HE13OaUT|DljyWXPs2FE@?`iU z4GQlM&Q=T<4&v@Fe<+TuXiZQT3G~vZ&^POfmI1K2h6t4eD}Gk5XFGpbj1n_g*{qmD6Xy z`6Vv|lLZtLmrnv*{Q%xxtcWVj3K4M%$bdBk_a&ar{{GWyu#ljM;dII;*jP;QH z#+^o-A4np{@|Mz+LphTD0`FTyxYq#wY)*&Ls5o{0z9yg2K+K7ZN>j1>N&;r+Z`vI| zDzG1LJZ+sE?m?>x{5LJx^)g&pGEpY=fQ-4}{x=ru;}FL$inHemOg%|R*ZXPodU}Kh zFEd5#+8rGq$Y<_?k-}r5zgQ3jRV=ooHiF|@z_#D4pKVEmn5CGV(9VKCyG|sT9nc=U zEoT67R`C->KY8Wp-fEcjjFm^;Cg(ls|*ABVHq8clBE(;~K^b+S>6uj70g? z&{XQ5U&!Z$SO7zfP+y^8XBbiu*Cv-yJG|l-oe*!s5$@Lh_KpxYL2sx`B|V=dETN>5K+C+CU~a_3cI8{vbu$TNVdGf15*>D zz@f{zIlorkY>TRh7mKuAlN9A0>N>SV`X)+bEHms=mfYTMWt_AJtz_h+JMmrgH?mZt zm=lfdF`t^J*XLg7v+iS)XZROygK=CS@CvUaJo&w2W!Wb@aa?~Drtf`JV^cCMjngVZ zv&xaIBEo8EYWuML+vxCpjjY^s1-ahXJzAV6hTw%ZIy!FjI}aJ+{rE&u#>rs)vzuxz z+$5z=7W?zH2>Eb32dvgHYZtCAf!=OLY-pb4>Ae79rd68E2LkVPj-|jFeyqtBCCwiW zkB@kO_(3wFq)7qwV}bA=zD!*@UhT`geq}ITo%@O(Z5Y80nEX~;0-8kO{oB6|(4fQh z);73T!>3@{ZobPwRv*W?7m0Ml9GmJBCJd&6E?hdj9lV= z4flNfsc(J*DyPv?RCOx!MSvk(M952PJ-G|JeVxWVjN~SNS6n-_Ge3Q;TGE;EQvZg86%wZ`MB zSMQua(i*R8a75!6$QRO^(o7sGoomb+Y{OMy;m~Oa`;P9Yqo>?bJAhqXxLr7_3g_n>f#UVtxG!^F#1+y@os6x(sg z^28bsQ@8rw%Gxk-stAEPRbv^}5sLe=VMbkc@Jjimqjvmd!3E7+QnL>|(^3!R} zD-l1l7*Amu@j+PWLGHXXaFG0Ct2Q=}5YNUxEQHCAU7gA$sSC<5OGylNnQUa>>l%sM zyu}z6i&({U@x^hln**o6r2s-(C-L50tQvz|zHTqW!ir?w&V23tuYEDJVV#5pE|OJu z7^R!A$iM$YCe?8n67l*J-okwfZ+ZTkGvZ)tVPfR;|3gyFjF)8V zyXXN=!*bpyRg9#~Bg1+UDYCt0 ztp4&?t1X0q>uz;ann$OrZs{5*r`(oNvw=$7O#rD|Wuv*wIi)4b zGtq4%BX+kkagv3F9Id6~-c+1&?zny%w5j&nk9SQfo0k4LhdSU_kWGW7axkfpgR`8* z!?UTG*Zi_baA1^0eda8S|@&F z{)Rad0kiLjB|=}XFJhD(S3ssKlveFFmkN{Vl^_nb!o5M!RC=m)V&v2%e?ZoRC@h3> zJ(?pvToFd`*Zc@HFPL#=otWKwtuuQ_dT-Hr{S%pQX<6dqVJ8;f(o)4~VM_kEQkMR+ zs1SCVi~k>M`u1u2xc}>#D!V&6nOOh-E$O&SzYrjJdZpaDv1!R-QGA141WjQe2s0J~ zQ;AXG)F+K#K8_5HVqRoRM%^EduqOnS(j2)|ctA6Q^=|s_WJYU;Z%5bHp08HPL`YF2 zR)Ad1z{zh`=sDs^&V}J z%$Z$!jd7BY5AkT?j`eqMs%!Gm@T8)4w3GYEX~IwgE~`d|@T{WYHkudy(47brgHXx& zBL1yFG6!!!VOSmDxBpefy2{L_u5yTwja&HA!mYA#wg#bc-m%~8aRR|~AvMnind@zs zy>wkShe5&*un^zvSOdlVu%kHsEo>@puMQ`b1}(|)l~E{5)f7gC=E$fP(FC2=F<^|A zxeIm?{EE!3sO!Gr7e{w)Dx(uU#3WrFZ>ibmKSQ1tY?*-Nh1TDHLe+k*;{Rp!Bmd_m zb#^kh`Y*8l|9Cz2e{;RL%_lg{#^Ar+NH|3z*Zye>!alpt{z;4dFAw^^H!6ING*EFc z_yqhr8d!;%nHX9AKhFQZBGrSzfzYCi%C!(Q5*~hX>)0N`vbhZ@N|i;_972WSx*>LH z87?en(;2_`{_JHF`Sv6Wlps;dCcj+8IJ8ca6`DsOQCMb3n# z3)_w%FuJ3>fjeOOtWyq)ag|PmgQbC-s}KRHG~enBcIwqIiGW8R8jFeBNY9|YswRY5 zjGUxdGgUD26wOpwM#8a!Nuqg68*dG@VM~SbOroL_On0N6QdT9?)NeB3@0FCC?Z|E0 z6TPZj(AsPtwCw>*{eDEE}Gby>0q{*lI+g2e&(YQrsY&uGM{O~}(oM@YWmb*F zA0^rr5~UD^qmNljq$F#ARXRZ1igP`MQx4aS6*MS;Ot(1L5jF2NJ;de!NujUYg$dr# z=TEL_zTj2@>ZZN(NYCeVX2==~=aT)R30gETO{G&GM4XN<+!&W&(WcDP%oL8PyIVUC zs5AvMgh6qr-2?^unB@mXK*Dbil^y-GTC+>&N5HkzXtozVf93m~xOUHn8`HpX=$_v2 z61H;Z1qK9o;>->tb8y%#4H)765W4E>TQ1o0PFj)uTOPEvv&}%(_mG0ISmyhnQV33Z$#&yd{ zc{>8V8XK$3u8}04CmAQ#I@XvtmB*s4t8va?-IY4@CN>;)mLb_4!&P3XSw4pA_NzDb zORn!blT-aHk1%Jpi>T~oGLuh{DB)JIGZ9KOsciWs2N7mM1JWM+lna4vkDL?Q)z_Ct z`!mi0jtr+4*L&N7jk&LodVO#6?_qRGVaucqVB8*us6i3BTa^^EI0x%EREQSXV@f!lak6Wf1cNZ8>*artIJ(ADO*=<-an`3zB4d*oO*8D1K!f z*A@P1bZCNtU=p!742MrAj%&5v%Xp_dSX@4YCw%F|%Dk=u|1BOmo)HsVz)nD5USa zR~??e61sO(;PR)iaxK{M%QM_rIua9C^4ppVS$qCT9j2%?*em?`4Z;4@>I(c%M&#cH z>4}*;ej<4cKkbCAjjDsyKS8rIm90O)Jjgyxj5^venBx&7B!xLmzxW3jhj7sR(^3Fz z84EY|p1NauwXUr;FfZjdaAfh%ivyp+^!jBjJuAaKa!yCq=?T_)R!>16?{~p)FQ3LDoMyG%hL#pR!f@P%*;#90rs_y z@9}@r1BmM-SJ#DeuqCQk=J?ixDSwL*wh|G#us;dd{H}3*-Y7Tv5m=bQJMcH+_S`zVtf;!0kt*(zwJ zs+kedTm!A}cMiM!qv(c$o5K%}Yd0|nOd0iLjus&;s0Acvoi-PFrWm?+q9f^FslxGi z6ywB`QpL$rJzWDg(4)C4+!2cLE}UPCTBLa*_=c#*$b2PWrRN46$y~yST3a2$7hEH= zNjux+wna^AzQ=KEa_5#9Ph=G1{S0#hh1L3hQ`@HrVnCx{!fw_a0N5xV(iPdKZ-HOM za)LdgK}1ww*C_>V7hbQnTzjURJL`S%`6nTHcgS+dB6b_;PY1FsrdE8(2K6FN>37!62j_cBlui{jO^$dPkGHV>pXvW0EiOA zqW`YaSUBWg_v^Y5tPJfWLcLpsA8T zG)!x>pKMpt!lv3&KV!-um= zKCir6`bEL_LCFx4Z5bAFXW$g3Cq`?Q%)3q0r852XI*Der*JNuKUZ`C{cCuu8R8nkt z%pnF>R$uY8L+D!V{s^9>IC+bmt<05h**>49R*#vpM*4i0qRB2uPbg8{{s#9yC;Z18 zD7|4m<9qneQ84uX|J&f-g8a|nFKFt34@Bt{CU`v(SYbbn95Q67*)_Esl_;v291s=9 z+#2F2apZU4Tq=x+?V}CjwD(P=U~d<=mfEFuyPB`Ey82V9G#Sk8H_Ob_RnP3s?)S_3 zr%}Pb?;lt_)Nf>@zX~D~TBr;-LS<1I##8z`;0ZCvI_QbXNh8Iv)$LS=*gHr;}dgb=w5$3k2la1keIm|=7<-JD>)U%=Avl0Vj@+&vxn zt-)`vJxJr88D&!}2^{GPXc^nmRf#}nb$4MMkBA21GzB`-Or`-3lq^O^svO7Vs~FdM zv`NvzyG+0T!P8l_&8gH|pzE{N(gv_tgDU7SWeiI-iHC#0Ai%Ixn4&nt{5y3(GQs)i z&uA;~_0shP$0Wh0VooIeyC|lak__#KVJfxa7*mYmZ22@(<^W}FdKjd*U1CqSjNKW% z*z$5$=t^+;Ui=MoDW~A7;)Mj%ibX1_p4gu>RC}Z_pl`U*{_z@+HN?AF{_W z?M_X@o%w8fgFIJ$fIzBeK=v#*`mtY$HC3tqw7q^GCT!P$I%=2N4FY7j9nG8aIm$c9 zeKTxVKN!UJ{#W)zxW|Q^K!3s;(*7Gbn;e@pQBCDS(I|Y0euK#dSQ_W^)sv5pa%<^o zyu}3d?Lx`)3-n5Sy9r#`I{+t6x%I%G(iewGbvor&I^{lhu-!#}*Q3^itvY(^UWXgvthH52zLy&T+B)Pw;5>4D6>74 zO_EBS)>l!zLTVkX@NDqyN2cXTwsUVao7$HcqV2%t$YzdAC&T)dwzExa3*kt9d(}al zA~M}=%2NVNUjZiO7c>04YH)sRelXJYpWSn^aC$|Ji|E13a^-v2MB!Nc*b+=KY7MCm zqIteKfNkONq}uM;PB?vvgQvfKLPMB8u5+Am=d#>g+o&Ysb>dX9EC8q?D$pJH!MTAqa=DS5$cb+;hEvjwVfF{4;M{5U&^_+r zvZdu_rildI!*|*A$TzJ&apQWV@p{!W`=?t(o0{?9y&vM)V)ycGSlI3`;ps(vf2PUq zX745#`cmT*ra7XECC0gKkpu2eyhFEUb?;4@X7weEnLjXj_F~?OzL1U1L0|s6M+kIhmi%`n5vvDALMagi4`wMc=JV{XiO+^ z?s9i7;GgrRW{Mx)d7rj)?(;|b-`iBNPqdwtt%32se@?w4<^KU&585_kZ=`Wy^oLu9 z?DQAh5z%q;UkP48jgMFHTf#mj?#z|=w= z(q6~17Vn}P)J3M?O)x))%a5+>TFW3No~TgP;f}K$#icBh;rSS+R|}l鯊%1Et zwk~hMkhq;MOw^Q5`7oC{CUUyTw9x>^%*FHx^qJw(LB+E0WBX@{Ghw;)6aA-KyYg8p z7XDveQOpEr;B4je@2~usI5BlFadedX^ma{b{ypd|RNYqo#~d*mj&y`^iojR}s%~vF z(H!u`yx68D1Tj(3(m;Q+Ma}s2n#;O~bcB1`lYk%Irx60&-nWIUBr2x&@}@76+*zJ5 ze&4?q8?m%L9c6h=J$WBzbiTf1Z-0Eb5$IZs>lvm$>1n_Mezp*qw_pr8<8$6f)5f<@ zyV#tzMCs51nTv_5ca`x`yfE5YA^*%O_H?;tWYdM_kHPubA%vy47i=9>Bq) zRQ&0UwLQHeswmB1yP)+BiR;S+Vc-5TX84KUA;8VY9}yEj0eESSO`7HQ4lO z4(CyA8y1G7_C;6kd4U3K-aNOK!sHE}KL_-^EDl(vB42P$2Km7$WGqNy=%fqB+ zSLdrlcbEH=T@W8V4(TgoXZ*G1_aq$K^@ek=TVhoKRjw;HyI&coln|uRr5mMOy2GXP zwr*F^Y|!Sjr2YQXX(Fp^*`Wk905K%$bd03R4(igl0&7IIm*#f`A!DCarW9$h$z`kYk9MjjqN&5-DsH@8xh63!fTNPxWsFQhNv z#|3RjnP$Thdb#Ys7M+v|>AHm0BVTw)EH}>x@_f4zca&3tXJhTZ8pO}aN?(dHo)44Z z_5j+YP=jMlFqwvf3lq!57-SAuRV2_gJ*wsR_!Y4Z(trO}0wmB9%f#jNDHPdQGHFR; zZXzS-$`;7DQ5vF~oSgP3bNV$6Z(rwo6W(U07b1n3UHqml>{=6&-4PALATsH@Bh^W? z)ob%oAPaiw{?9HfMzpGb)@Kys^J$CN{uf*HX?)z=g`J(uK1YO^8~s1(ZIbG%Et(|q z$D@_QqltVZu9Py4R0Ld8!U|#`5~^M=b>fnHthzKBRr=i+w@0Vr^l|W;=zFT#PJ?*a zbC}G#It}rQP^Ait^W&aa6B;+0gNvz4cWUMzpv(1gvfw-X4xJ2Sv;mt;zb2Tsn|kSS zo*U9N?I{=-;a-OybL4r;PolCfiaL=y@o9{%`>+&FI#D^uy#>)R@b^1ue&AKKwuI*` zx%+6r48EIX6nF4o;>)zhV_8(IEX})NGU6Vs(yslrx{5fII}o3SMHW7wGtK9oIO4OM&@@ECtXSICLcPXoS|{;=_yj>hh*%hP27yZwOmj4&Lh z*Nd@OMkd!aKReoqNOkp5cW*lC)&C$P?+H3*%8)6HcpBg&IhGP^77XPZpc%WKYLX$T zsSQ$|ntaVVOoRat$6lvZO(G-QM5s#N4j*|N_;8cc2v_k4n6zx9c1L4JL*83F-C1Cn zaJhd;>rHXB%%ZN=3_o3&Qd2YOxrK~&?1=UuN9QhL$~OY-Qyg&})#ez*8NpQW_*a&kD&ANjedxT0Ar z<6r{eaVz3`d~+N~vkMaV8{F?RBVemN(jD@S8qO~L{rUw#=2a$V(7rLE+kGUZ<%pdr z?$DP|Vg#gZ9S}w((O2NbxzQ^zTot=89!0^~hE{|c9q1hVzv0?YC5s42Yx($;hAp*E zyoGuRyphQY{Q2ee0Xx`1&lv(l-SeC$NEyS~8iil3_aNlnqF_G|;zt#F%1;J)jnPT& z@iU0S;wHJ2$f!juqEzPZeZkjcQ+Pa@eERSLKsWf=`{R@yv7AuRh&ALRTAy z8=g&nxsSJCe!QLchJ=}6|LshnXIK)SNd zRkJNiqHwKK{SO;N5m5wdL&qK`v|d?5<4!(FAsDxR>Ky#0#t$8XCMptvNo?|SY?d8b z`*8dVBlXTUanlh6n)!EHf2&PDG8sXNAt6~u-_1EjPI1|<=33T8 zEnA00E!`4Ave0d&VVh0e>)Dc}=FfAFxpsC1u9ATfQ`-Cu;mhc8Z>2;uyXtqpLb7(P zd2F9<3cXS} znMg?{&8_YFTGRQZEPU-XPq55%51}RJpw@LO_|)CFAt62-_!u_Uq$csc+7|3+TV_!h z+2a7Yh^5AA{q^m|=KSJL+w-EWDBc&I_I1vOr^}P8i?cKMhGy$CP0XKrQzCheG$}G# zuglf8*PAFO8%xop7KSwI8||liTaQ9NCAFarr~psQt)g*pC@9bORZ>m`_GA`_K@~&% zijH0z;T$fd;-Liw8%EKZas>BH8nYTqsK7F;>>@YsE=Rqo?_8}UO-S#|6~CAW0Oz1} z3F(1=+#wrBJh4H)9jTQ_$~@#9|Bc1Pd3rAIA_&vOpvvbgDJOM(yNPhJJq2%PCcMaI zrbe~toYzvkZYQ{ea(Wiyu#4WB#RRN%bMe=SOk!CbJZv^m?Flo5p{W8|0i3`hI3Np# zvCZqY%o258CI=SGb+A3yJe~JH^i{uU`#U#fvSC~rWTq+K`E%J@ zasU07&pB6A4w3b?d?q}2=0rA#SA7D`X+zg@&zm^iA*HVi z009#PUH<%lk4z~p^l0S{lCJk1Uxi=F4e_DwlfHA`X`rv(|JqWKAA5nH+u4Da+E_p+ zVmH@lg^n4ixs~*@gm_dgQ&eDmE1mnw5wBz9Yg?QdZwF|an67Xd*x!He)Gc8&2!urh z4_uXzbYz-aX)X1>&iUjGp;P1u8&7TID0bTH-jCL&Xk8b&;;6p2op_=y^m@Nq*0{#o!!A;wNAFG@0%Z9rHo zcJs?Th>Ny6+hI`+1XoU*ED$Yf@9f91m9Y=#N(HJP^Y@ZEYR6I?oM{>&Wq4|v0IB(p zqX#Z<_3X(&{H+{3Tr|sFy}~=bv+l=P;|sBz$wk-n^R`G3p0(p>p=5ahpaD7>r|>pm zv;V`_IR@tvZreIuv2EM7ZQHhO+qUgw#kOs%*ekY^n|=1#x9&c;Ro&I~{rG-#_3ZB1 z?|9}IFdbP}^DneP*T-JaoYHt~r@EfvnPE5EKUwIxjPbsr$% zfWW83pgWST7*B(o=kmo)74$8UU)v0{@4DI+ci&%=#90}!CZz|rnH+Mz=HN~97G3~@ z;v5(9_2%eca(9iu@J@aqaMS6*$TMw!S>H(b z4(*B!|H|8&EuB%mITr~O?vVEf%(Gr)6E=>H~1VR z&1YOXluJSG1!?TnT)_*YmJ*o_Q@om~(GdrhI{$Fsx_zrkupc#y{DK1WOUR>tk>ZE) ziOLoBkhZZ?0Uf}cm>GsA>Rd6V8@JF)J*EQlQ<=JD@m<)hyElXR0`pTku*3MU`HJn| zIf7$)RlK^pW-$87U;431;Ye4Ie+l~_B3*bH1>*yKzn23cH0u(i5pXV! z4K?{3oF7ZavmmtTq((wtml)m6i)8X6ot_mrE-QJCW}Yn!(3~aUHYG=^fA<^~`e3yc z-NWTb{gR;DOUcK#zPbN^D*e=2eR^_!(!RKkiwMW@@yYtEoOp4XjOGgzi`;=8 zi3`Ccw1%L*y(FDj=C7Ro-V?q)-%p?Ob2ZElu`eZ99n14-ZkEV#y5C+{Pq87Gu3&>g zFy~Wk7^6v*)4pF3@F@rE__k3ikx(hzN3@e*^0=KNA6|jC^B5nf(XaoQaZN?Xi}Rn3 z$8&m*KmWvPaUQ(V<#J+S&zO|8P-#!f%7G+n_%sXp9=J%Z4&9OkWXeuZN}ssgQ#Tcj z8p6ErJQJWZ+fXLCco=RN8D{W%+*kko*2-LEb))xcHwNl~Xmir>kmAxW?eW50Osw3# zki8Fl$#fvw*7rqd?%E?}ZX4`c5-R&w!Y0#EBbelVXSng+kUfeUiqofPehl}$ormli zg%r)}?%=?_pHb9`Cq9Z|B`L8b>(!+8HSX?`5+5mm81AFXfnAt1*R3F z%b2RPIacKAddx%JfQ8l{3U|vK@W7KB$CdLqn@wP^?azRks@x8z59#$Q*7q!KilY-P zHUbs(IFYRGG1{~@RF;Lqyho$~7^hNC`NL3kn^Td%A7dRgr_&`2k=t+}D-o9&C!y^? z6MsQ=tc3g0xkK(O%DzR9nbNB(r@L;1zQrs8mzx&4dz}?3KNYozOW5;=w18U6$G4U2 z#2^qRLT*Mo4bV1Oeo1PKQ2WQS2Y-hv&S|C7`xh6=Pj7MNLC5K-zokZ67S)C;(F0Dd zloDK2_o1$Fmza>EMj3X9je7e%Q`$39Dk~GoOj89-6q9|_WJlSl!!+*{R=tGp z8u|MuSwm^t7K^nUe+^0G3dkGZr3@(X+TL5eah)K^Tn zXEtHmR9UIaEYgD5Nhh(s*fcG_lh-mfy5iUF3xxpRZ0q3nZ=1qAtUa?(LnT9I&~uxX z`pV?+=|-Gl(kz?w!zIieXT}o}7@`QO>;u$Z!QB${a08_bW0_o@&9cjJUXzVyNGCm8 zm=W+$H!;_Kzp6WQqxUI;JlPY&`V}9C$8HZ^m?NvI*JT@~BM=()T()Ii#+*$y@lTZBkmMMda>7s#O(1YZR+zTG@&}!EXFG{ zEWPSDI5bFi;NT>Yj*FjH((=oe%t%xYmE~AGaOc4#9K_XsVpl<4SP@E!TgC0qpe1oi zNpxU2b0(lEMcoibQ-G^cxO?ySVW26HoBNa;n0}CWL*{k)oBu1>F18X061$SP{Gu67 z-v-Fa=Fl^u3lnGY^o5v)Bux}bNZ~ z5pL+7F_Esoun8^5>z8NFoIdb$sNS&xT8_|`GTe8zSXQzs4r^g0kZjg(b0bJvz`g<70u9Z3fQILX1Lj@;@+##bP|FAOl)U^9U>0rx zGi)M1(Hce)LAvQO-pW!MN$;#ZMX?VE(22lTlJrk#pB0FJNqVwC+*%${Gt#r_tH9I_ z;+#)#8cWAl?d@R+O+}@1A^hAR1s3UcW{G+>;X4utD2d9X(jF555}!TVN-hByV6t+A zdFR^aE@GNNgSxxixS2p=on4(+*+f<8xrwAObC)D5)4!z7)}mTpb7&ofF3u&9&wPS< zB62WHLGMhmrmOAgmJ+|c>qEWTD#jd~lHNgT0?t-p{T=~#EMcB| z=AoDKOL+qXCfk~F)-Rv**V}}gWFl>liXOl7Uec_8v)(S#av99PX1sQIVZ9eNLkhq$ zt|qu0b?GW_uo}TbU8!jYn8iJeIP)r@;!Ze_7mj{AUV$GEz6bDSDO=D!&C9!M@*S2! zfGyA|EPlXGMjkH6x7OMF?gKL7{GvGfED=Jte^p=91FpCu)#{whAMw`vSLa`K#atdN zThnL+7!ZNmP{rc=Z>%$meH;Qi1=m1E3Lq2D_O1-X5C;!I0L>zur@tPAC9*7Jeh)`;eec}1`nkRP(%iv-`N zZ@ip-g|7l6Hz%j%gcAM}6-nrC8oA$BkOTz^?dakvX?`^=ZkYh%vUE z9+&)K1UTK=ahYiaNn&G5nHUY5niLGus@p5E2@RwZufRvF{@$hW{;{3QhjvEHMvduO z#Wf-@oYU4ht?#uP{N3utVzV49mEc9>*TV_W2TVC`6+oI)zAjy$KJrr=*q##&kobiQ z1vNbya&OVjK`2pdRrM?LuK6BgrLN7H_3m z!qpNKg~87XgCwb#I=Q&0rI*l$wM!qTkXrx1ko5q-f;=R2fImRMwt5Qs{P*p^z@9ex z`2#v(qE&F%MXlHpdO#QEZyZftn4f05ab^f2vjxuFaat2}jke{j?5GrF=WYBR?gS(^ z9SBiNi}anzBDBRc+QqizTTQuJrzm^bNA~A{j%ugXP7McZqJ}65l10({wk++$=e8O{ zxWjG!Qp#5OmI#XRQQM?n6?1ztl6^D40hDJr?4$Wc&O_{*OfMfxe)V0=e{|N?J#fgE>j9jAajze$iN!*yeF%jJU#G1c@@rm zolGW!j?W6Q8pP=lkctNFdfgUMg92wlM4E$aks1??M$~WQfzzzXtS)wKrr2sJeCN4X zY(X^H_c^PzfcO8Bq(Q*p4c_v@F$Y8cHLrH$`pJ2}=#*8%JYdqsqnGqEdBQMpl!Ot04tUGSXTQdsX&GDtjbWD=prcCT9(+ z&UM%lW%Q3yrl1yiYs;LxzIy>2G}EPY6|sBhL&X&RAQrSAV4Tlh2nITR?{6xO9ujGu zr*)^E`>o!c=gT*_@6S&>0POxcXYNQd&HMw6<|#{eSute2C3{&h?Ah|cw56-AP^f8l zT^kvZY$YiH8j)sk7_=;gx)vx-PW`hbSBXJGCTkpt;ap(}G2GY=2bbjABU5)ty%G#x zAi07{Bjhv}>OD#5zh#$0w;-vvC@^}F! z#X$@)zIs1L^E;2xDAwEjaXhTBw2<{&JkF*`;c3<1U@A4MaLPe{M5DGGkL}#{cHL%* zYMG+-Fm0#qzPL#V)TvQVI|?_M>=zVJr9>(6ib*#z8q@mYKXDP`k&A4A};xMK0h=yrMp~JW{L?mE~ph&1Y1a#4%SO)@{ zK2juwynUOC)U*hVlJU17%llUxAJFuKZh3K0gU`aP)pc~bE~mM!i1mi!~LTf>1Wp< zuG+ahp^gH8g8-M$u{HUWh0m^9Rg@cQ{&DAO{PTMudV6c?ka7+AO& z746QylZ&Oj`1aqfu?l&zGtJnpEQOt;OAFq19MXTcI~`ZcoZmyMrIKDFRIDi`FH)w; z8+*8tdevMDv*VtQi|e}CnB_JWs>fhLOH-+Os2Lh!&)Oh2utl{*AwR)QVLS49iTp{6 z;|172Jl!Ml17unF+pd+Ff@jIE-{Oxv)5|pOm@CkHW?{l}b@1>Pe!l}VccX#xp@xgJ zyE<&ep$=*vT=}7vtvif0B?9xw_3Gej7mN*dOHdQPtW5kA5_zGD zpA4tV2*0E^OUimSsV#?Tg#oiQ>%4D@1F5@AHwT8Kgen$bSMHD3sXCkq8^(uo7CWk`mT zuslYq`6Yz;L%wJh$3l1%SZv#QnG3=NZ=BK4yzk#HAPbqXa92;3K5?0kn4TQ`%E%X} z&>Lbt!!QclYKd6+J7Nl@xv!uD%)*bY-;p`y^ZCC<%LEHUi$l5biu!sT3TGGSTPA21 zT8@B&a0lJHVn1I$I3I1I{W9fJAYc+8 zVj8>HvD}&O`TqU2AAb={?eT;0hyL(R{|h23=4fDSZKC32;wWxsVj`P z3J3{M$PwdH!ro*Cn!D&=jnFR>BNGR<<|I8CI@+@658Dy(lhqbhXfPTVecY@L8%`3Q z1Fux2w?2C3th60jI~%OC9BtpNF$QPqcG+Pz96qZJ71_`0o0w_q7|h&O>`6U+^BA&5 zXd5Zp1Xkw~>M%RixTm&OqpNl8Q+ue=92Op_>T~_9UON?ZM2c0aGm=^A4ejrXj3dV9 zhh_bCt-b9`uOX#cFLj!vhZ#lS8Tc47OH>*)y#{O9?AT~KR9LntM|#l#Dlm^8{nZdk zjMl#>ZM%#^nK2TPzLcKxqx24P7R1FPlBy7LSBrRvx>fE$9AJ;7{PQm~^LBX^k#6Zq zw*Z(zJC|`!6_)EFR}8|n8&&Rbj8y028~P~sFXBFRt+tmqH-S3<%N;C&WGH!f3{7cm zy_fCAb9@HqaXa1Y5vFbxWf%#zg6SI$C+Uz5=CTO}e|2fjWkZ;Dx|84Ow~bkI=LW+U zuq;KSv9VMboRvs9)}2PAO|b(JCEC_A0wq{uEj|3x@}*=bOd zwr{TgeCGG>HT<@Zeq8y}vTpwDg#UBvD)BEs@1KP$^3$sh&_joQPn{hjBXmLPJ{tC) z*HS`*2+VtJO{|e$mM^|qv1R*8i(m1`%)}g=SU#T#0KlTM2RSvYUc1fP+va|4;5}Bfz98UvDCpq7}+SMV&;nX zQw~N6qOX{P55{#LQkrZk(e5YGzr|(B;Q;ju;2a`q+S9bsEH@i1{_Y0;hWYn1-79jl z5c&bytD*k)GqrVcHn6t-7kinadiD>B{Tl`ZY@`g|b~pvHh5!gKP4({rp?D0aFd_cN zhHRo4dd5^S6ViN(>(28qZT6E>??aRhc($kP`>@<+lIKS5HdhjVU;>f7<4))E*5|g{ z&d1}D|vpuV^eRj5j|xx9nwaCxXFG?Qbjn~_WSy=N}P0W>MP zG-F%70lX5Xr$a)2i6?i|iMyM|;Jtf*hO?=Jxj12oz&>P=1#h~lf%#fc73M2_(SUM- zf&qnjS80|_Y0lDgl&I?*eMumUklLe_=Td!9G@eR*tcPOgIShJipp3{A10u(4eT~DY zHezEj8V+7m!knn7)W!-5QI3=IvC^as5+TW1@Ern@yX| z7Nn~xVx&fGSr+L%4iohtS3w^{-H1A_5=r&x8}R!YZvp<2T^YFvj8G_vm}5q;^UOJf ztl=X3iL;;^^a#`t{Ae-%5Oq{?M#s6Npj+L(n-*LMI-yMR{)qki!~{5z{&`-iL}lgW zxo+tnvICK=lImjV$Z|O_cYj_PlEYCzu-XBz&XC-JVxUh9;6*z4fuBG+H{voCC;`~GYV|hj%j_&I zDZCj>Q_0RCwFauYoVMiUSB+*Mx`tg)bWmM^SwMA+?lBg12QUF_x2b)b?qb88K-YUd z0dO}3k#QirBV<5%jL$#wlf!60dizu;tsp(7XLdI=eQs?P`tOZYMjVq&jE)qK*6B^$ zBe>VvH5TO>s>izhwJJ$<`a8fakTL!yM^Zfr2hV9`f}}VVUXK39p@G|xYRz{fTI+Yq z20d=)iwjuG9RB$%$^&8#(c0_j0t_C~^|n+c`Apu|x7~;#cS-s=X1|C*YxX3ailhg_|0`g!E&GZJEr?bh#Tpb8siR=JxWKc{#w7g zWznLwi;zLFmM1g8V5-P#RsM@iX>TK$xsWuujcsVR^7TQ@!+vCD<>Bk9tdCo7Mzgq5 zv8d>dK9x8C@Qoh01u@3h0X_`SZluTb@5o;{4{{eF!-4405x8X7hewZWpz z2qEi4UTiXTvsa(0X7kQH{3VMF>W|6;6iTrrYD2fMggFA&-CBEfSqPlQDxqsa>{e2M z(R5PJ7uOooFc|9GU0ELA%m4&4Ja#cQpNw8i8ACAoK6?-px+oBl_yKmenZut#Xumjz zk8p^OV2KY&?5MUwGrBOo?ki`Sxo#?-Q4gw*Sh0k`@ zFTaYK2;}%Zk-68`#5DXU$2#=%YL#S&MTN8bF+!J2VT6x^XBci6O)Q#JfW{YMz) zOBM>t2rSj)n#0a3cjvu}r|k3od6W(SN}V-cL?bi*Iz-8uOcCcsX0L>ZXjLqk zZu2uHq5B|Kt>e+=pPKu=1P@1r9WLgYFq_TNV1p9pu0erHGd!+bBp!qGi+~4A(RsYN@CyXNrC&hxGmW)u5m35OmWwX`I+0yByglO`}HC4nGE^_HUs^&A(uaM zKPj^=qI{&ayOq#z=p&pnx@@k&I1JI>cttJcu@Ihljt?6p^6{|ds`0MoQwp+I{3l6` zB<9S((RpLG^>=Kic`1LnhpW2=Gu!x`m~=y;A`Qk!-w`IN;S8S930#vBVMv2vCKi}u z6<-VPrU0AnE&vzwV(CFC0gnZYcpa-l5T0ZS$P6(?9AM;`Aj~XDvt;Jua=jIgF=Fm? zdp=M$>`phx%+Gu};;-&7T|B1AcC#L4@mW5SV_^1BRbo6;2PWe$r+npRV`yc;T1mo& z+~_?7rA+(Um&o@Tddl zL_hxvWk~a)yY}%j`Y+200D%9$bWHy&;(yj{jpi?Rtz{J66ANw)UyPOm;t6FzY3$hx zcn)Ir79nhFvNa7^a{SHN7XH*|Vlsx`CddPnA&Qvh8aNhEA;mPVv;Ah=k<*u!Zq^7 z<=xs*iQTQOMMcg|(NA_auh@x`3#_LFt=)}%SQppP{E>mu_LgquAWvh<>L7tf9+~rO znwUDS52u)OtY<~!d$;m9+87aO+&`#2ICl@Y>&F{jI=H(K+@3M1$rr=*H^dye#~TyD z!){#Pyfn+|ugUu}G;a~!&&0aqQ59U@UT3|_JuBlYUpT$2+11;}JBJ`{+lQN9T@QFY z5+`t;6(TS0F?OlBTE!@7D`8#URDNqx2t6`GZ{ZgXeS@v%-eJzZOHz18aS|svxII$a zZeFjrJ*$IwX$f-Rzr_G>xbu@euGl)B7pC&S+CmDJBg$BoV~jxSO#>y z33`bupN#LDoW0feZe0%q8un0rYN|eRAnwDHQ6e_)xBTbtoZtTA=Fvk){q}9Os~6mQ zKB80VI_&6iSq`LnK7*kfHZoeX6?WE}8yjuDn=2#JG$+;-TOA1%^=DnXx%w{b=w}tS zQbU3XxtOI8E(!%`64r2`zog;5<0b4i)xBmGP^jiDZ2%HNSxIf3@wKs~uk4%3Mxz;~ zts_S~E4>W+YwI<-*-$U8*^HKDEa8oLbmqGg?3vewnaNg%Mm)W=)lcC_J+1ov^u*N3 zXJ?!BrH-+wGYziJq2Y#vyry6Z>NPgkEk+Ke`^DvNRdb>Q2Nlr#v%O@<5hbflI6EKE z9dWc0-ORk^T}jP!nkJ1imyjdVX@GrjOs%cpgA8-c&FH&$(4od#x6Y&=LiJZPINVyW z0snY$8JW@>tc2}DlrD3StQmA0Twck~@>8dSix9CyQOALcREdxoM$Sw*l!}bXKq9&r zysMWR@%OY24@e`?+#xV2bk{T^C_xSo8v2ZI=lBI*l{RciPwuE>L5@uhz@{!l)rtVlWC>)6(G)1~n=Q|S!{E9~6*fdpa*n z!()-8EpTdj=zr_Lswi;#{TxbtH$8*G=UM`I+icz7sr_SdnHXrv=?iEOF1UL+*6O;% zPw>t^kbW9X@oEXx<97%lBm-9?O_7L!DeD)Me#rwE54t~UBu9VZ zl_I1tBB~>jm@bw0Aljz8! zXBB6ATG6iByKIxs!qr%pz%wgqbg(l{65DP4#v(vqhhL{0b#0C8mq`bnqZ1OwFV z7mlZZJFMACm>h9v^2J9+^_zc1=JjL#qM5ZHaThH&n zXPTsR8(+)cj&>Un{6v*z?@VTLr{TmZ@-fY%*o2G}*G}#!bmqpoo*Ay@U!JI^Q@7gj;Kg-HIrLj4}#ec4~D2~X6vo;ghep-@&yOivYP zC19L0D`jjKy1Yi-SGPAn94(768Tcf$urAf{)1)9W58P`6MA{YG%O?|07!g9(b`8PXG1B1Sh0?HQmeJtP0M$O$hI z{5G`&9XzYhh|y@qsF1GnHN|~^ru~HVf#)lOTSrv=S@DyR$UKQk zjdEPFDz{uHM&UM;=mG!xKvp;xAGHOBo~>_=WFTmh$chpC7c`~7?36h)7$fF~Ii}8q zF|YXxH-Z?d+Q+27Rs3X9S&K3N+)OBxMHn1u(vlrUC6ckBY@@jl+mgr#KQUKo#VeFm zFwNYgv0<%~Wn}KeLeD9e1$S>jhOq&(e*I@L<=I5b(?G(zpqI*WBqf|Zge0&aoDUsC zngMRA_Kt0>La+Erl=Uv_J^p(z=!?XHpenzn$%EA`JIq#yYF?JLDMYiPfM(&Csr#f{ zdd+LJL1by?xz|D8+(fgzRs~(N1k9DSyK@LJygwaYX8dZl0W!I&c^K?7)z{2is;OkE zd$VK-(uH#AUaZrp=1z;O*n=b?QJkxu`Xsw&7yrX0?(CX=I-C#T;yi8a<{E~?vr3W> zQrpPqOW2M+AnZ&p{hqmHZU-;Q(7?- zP8L|Q0RM~sB0w1w53f&Kd*y}ofx@c z5Y6B8qGel+uT1JMot$nT1!Tim6{>oZzJXdyA+4euOLME?5Fd_85Uk%#E*ln%y{u8Q z$|?|R@Hpb~yTVK-Yr_S#%NUy7EBfYGAg>b({J|5b+j-PBpPy$Ns`PaJin4JdRfOaS zE|<HjH%NuJgsd2wOlv>~y=np%=2)$M9LS|>P)zJ+Fei5vYo_N~B0XCn+GM76 z)Xz3tg*FRVFgIl9zpESgdpWAavvVViGlU8|UFY{{gVJskg*I!ZjWyk~OW-Td4(mZ6 zB&SQreAAMqwp}rjy`HsG({l2&q5Y52<@AULVAu~rWI$UbFuZs>Sc*x+XI<+ez%$U)|a^unjpiW0l0 zj1!K0(b6$8LOjzRqQ~K&dfbMIE=TF}XFAi)$+h}5SD3lo z%%Qd>p9se=VtQG{kQ;N`sI)G^u|DN#7{aoEd zkksYP%_X$Rq08);-s6o>CGJ<}v`qs%eYf+J%DQ^2k68C%nvikRsN?$ap--f+vCS`K z#&~)f7!N^;sdUXu54gl3L=LN>FB^tuK=y2e#|hWiWUls__n@L|>xH{%8lIJTd5`w? zSwZbnS;W~DawT4OwSJVdAylbY+u5S+ZH{4hAi2&}Iv~W(UvHg(1GTZRPz`@{SOqzy z(8g&Dz=$PfRV=6FgxN~zo+G8OoPI&d-thcGVR*_^(R8COTM@bq?fDwY{}WhsQS1AK zF6R1t8!RdFmfocpJ6?9Yv~;WYi~XPgs(|>{5})j!AR!voO7y9&cMPo#80A(`za@t>cx<0;qxM@S*m(jYP)dMXr*?q0E`oL;12}VAep179uEr8c<=D zr5?A*C{eJ`z9Ee;E$8)MECqatHkbHH z&Y+ho0B$31MIB-xm&;xyaFCtg<{m~M-QDbY)fQ>Q*Xibb~8ytxZQ?QMf9!%cV zU0_X1@b4d+Pg#R!`OJ~DOrQz3@cpiGy~XSKjZQQ|^4J1puvwKeScrH8o{bscBsowomu z^f12kTvje`yEI3eEXDHJ6L+O{Jv$HVj%IKb|J{IvD*l6IG8WUgDJ*UGz z3!C%>?=dlfSJ>4U88)V+`U-!9r^@AxJBx8R;)J4Fn@`~k>8>v0M9xp90OJElWP&R5 zM#v*vtT}*Gm1^)Bv!s72T3PB0yVIjJW)H7a)ilkAvoaH?)jjb`MP>2z{%Y?}83 zUIwBKn`-MSg)=?R)1Q0z3b>dHE^)D8LFs}6ASG1|daDly_^lOSy&zIIhm*HXm1?VS=_iacG);_I9c zUQH1>i#*?oPIwBMJkzi_*>HoUe}_4o>2(SHWzqQ=;TyhAHS;Enr7!#8;sdlty&(>d zl%5cjri8`2X^Ds`jnw7>A`X|bl=U8n+3LKLy(1dAu8`g@9=5iw$R0qk)w8Vh_Dt^U zIglK}sn^)W7aB(Q>HvrX=rxB z+*L)3DiqpQ_%~|m=44LcD4-bxO3OO*LPjsh%p(k?&jvLp0py57oMH|*IMa(<|{m1(0S|x)?R-mqJ=I;_YUZA>J z62v*eSK;5w!h8J+6Z2~oyGdZ68waWfy09?4fU&m7%u~zi?YPHPgK6LDwphgaYu%0j zurtw)AYOpYKgHBrkX189mlJ`q)w-f|6>IER{5Lk97%P~a-JyCRFjejW@L>n4vt6#hq;!|m;hNE||LK3nw1{bJOy+eBJjK=QqNjI;Q6;Rp5 z&035pZDUZ#%Oa;&_7x0T<7!RW`#YBOj}F380Bq?MjjEhrvlCATPdkCTTl+2efTX$k zH&0zR1n^`C3ef~^sXzJK-)52(T}uTG%OF8yDhT76L~|^+hZ2hiSM*QA9*D5odI1>& z9kV9jC~twA5MwyOx(lsGD_ggYmztXPD`2=_V|ks_FOx!_J8!zM zTzh^cc+=VNZ&(OdN=y4Juw)@8-85lwf_#VMN!Ed(eQiRiLB2^2e`4dp286h@v@`O%_b)Y~A; zv}r6U?zs&@uD_+(_4bwoy7*uozNvp?bXFoB8?l8yG0qsm1JYzIvB_OH4_2G*IIOwT zVl%HX1562vLVcxM_RG*~w_`FbIc!(T=3>r528#%mwwMK}uEhJ()3MEby zQQjzqjWkwfI~;Fuj(Lj=Ug0y`>~C7`w&wzjK(rPw+Hpd~EvQ-ufQOiB4OMpyUKJhw zqEt~jle9d7S~LI~$6Z->J~QJ{Vdn3!c}g9}*KG^Kzr^(7VI5Gk(mHLL{itj_hG?&K4Ws0+T4gLfi3eu$N=`s36geNC?c zm!~}vG6lx9Uf^5M;bWntF<-{p^bruy~f?sk9 zcETAPQZLoJ8JzMMg<-=ju4keY@SY%Wo?u9Gx=j&dfa6LIAB|IrbORLV1-H==Z1zCM zeZcOYpm5>U2fU7V*h;%n`8 zN95QhfD994={1*<2vKLCNF)feKOGk`R#K~G=;rfq}|)s20&MCa65 zUM?xF5!&e0lF%|U!#rD@I{~OsS_?=;s_MQ_b_s=PuWdC)q|UQ&ea)DMRh5>fpQjXe z%9#*x=7{iRCtBKT#H>#v%>77|{4_slZ)XCY{s3j_r{tdpvb#|r|sbS^dU1x70$eJMU!h{Y7Kd{dl}9&vxQl6Jt1a` zHQZrWyY0?!vqf@u-fxU_@+}u(%Wm>0I#KP48tiAPYY!TdW(o|KtVI|EUB9V`CBBNaBLVih7+yMVF|GSoIQD0Jfb{ z!OXq;(>Z?O`1gap(L~bUcp>Lc@Jl-})^=6P%<~~9ywY=$iu8pJ0m*hOPzr~q`23eX zgbs;VOxxENe0UMVeN*>uCn9Gk!4siN-e>x)pIKAbQz!G)TcqIJ0`JBBaX>1-4_XO_-HCS^vr2vjv#7KltDZdyQ{tlWh4$Gm zB>|O1cBDC)yG(sbnc*@w6e%e}r*|IhpXckx&;sQCwGdKH+3oSG-2)Bf#x`@<4ETAr z0My%7RFh6ZLiZ_;X6Mu1YmXx7C$lSZ^}1h;j`EZd6@%JNUe=btBE z%s=Xmo1Ps?8G`}9+6>iaB8bgjUdXT?=trMu|4yLX^m0Dg{m7rpKNJey|EwHI+nN1e zL^>qN%5Fg)dGs4DO~uwIdXImN)QJ*Jhpj7$fq_^`{3fwpztL@WBB}OwQ#Epo-mqMO zsM$UgpFiG&d#)lzEQ{3Q;)&zTw;SzGOah-Dpm{!q7<8*)Ti_;xvV2TYXa}=faXZy? z3y?~GY@kl)>G&EvEijk9y1S`*=zBJSB1iet>0;x1Ai)*`^{pj0JMs)KAM=@UyOGtO z3y0BouW$N&TnwU6!%zS%nIrnANvZF&vB1~P5_d`x-giHuG zPJ;>XkVoghm#kZXRf>qxxEix;2;D1CC~NrbO6NBX!`&_$iXwP~P*c($EVV|669kDO zKoTLZNF4Cskh!Jz5ga9uZ`3o%7Pv`d^;a=cXI|>y;zC3rYPFLQkF*nv(r>SQvD*## z(Vo%^9g`%XwS0t#94zPq;mYGLKu4LU3;txF26?V~A0xZbU4Lmy`)>SoQX^m7fd^*E z+%{R4eN!rIk~K)M&UEzxp9dbY;_I^c} zOc{wlIrN_P(PPqi51k_$>Lt|X6A^|CGYgKAmoI#Li?;Wq%q~q*L7ehZkUrMxW67Jl zhsb~+U?33QS>eqyN{(odAkbopo=Q$Az?L+NZW>j;#~@wCDX?=L5SI|OxI~7!Pli;e zELMFcZtJY3!|=Gr2L4>z8yQ-{To>(f80*#;6`4IAiqUw`=Pg$%C?#1 z_g@hIGerILSU>=P>z{gM|DS91A4cT@PEIB^hSop!uhMo#2G;+tQSpDO_6nOnPWSLU zS;a9m^DFMXR4?*X=}d7l;nXuHk&0|m`NQn%d?8|Ab3A9l9Jh5s120ibWBdB z$5YwsK3;wvp!Kn@)Qae{ef`0#NwlRpQ}k^r>yos_Ne1;xyKLO?4)t_G4eK~wkUS2A&@_;)K0-03XGBzU+5f+uMDxC z(s8!8!RvdC#@`~fx$r)TKdLD6fWEVdEYtV#{ncT-ZMX~eI#UeQ-+H(Z43vVn%Yj9X zLdu9>o%wnWdvzA-#d6Z~vzj-}V3FQ5;axDIZ;i(95IIU=GQ4WuU{tl-{gk!5{l4_d zvvb&uE{%!iFwpymz{wh?bKr1*qzeZb5f6e6m_ozRF&zux2mlK=v_(_s^R6b5lu?_W4W3#<$zeG~Pd)^!4tzhs}-Sx$FJP>)ZGF(hVTH|C3(U zs0PO&*h_ zNA-&qZpTP$$LtIgfiCn07}XDbK#HIXdmv8zdz4TY;ifNIH-0jy(gMSByG2EF~Th#eb_TueZC` zE?3I>UTMpKQ})=C;6p!?G)M6w^u*A57bD?2X`m3X^6;&4%i_m(uGJ3Z5h`nwxM<)H z$I5m?wN>O~8`BGnZ=y^p6;0+%_0K}Dcg|K;+fEi|qoBqvHj(M&aHGqNF48~XqhtU? z^ogwBzRlOfpAJ+Rw7IED8lRbTdBdyEK$gPUpUG}j-M42xDj_&qEAQEtbs>D#dRd7Y z<&TpSZ(quQDHiCFn&0xsrz~4`4tz!CdL8m~HxZM_agu@IrBpyeL1Ft}V$HX_ZqDPm z-f89)pjuEzGdq-PRu`b1m+qBGY{zr_>{6Ss>F|xHZlJj9dt5HD$u`1*WZe)qEIuDSR)%z+|n zatVlhQ?$w#XRS7xUrFE;Y8vMGhQS5*T{ZnY=q1P?w5g$OKJ#M&e??tAmPWHMj3xhS ziGxapy?kn@$~2%ZY;M8Bc@%$pkl%Rvj!?o%agBvpQ-Q61n9kznC4ttrRNQ4%GFR5u zyv%Yo9~yxQJWJSfj z?#HY$y=O~F|2pZs22pu|_&Ajd+D(Mt!nPUG{|1nlvP`=R#kKH zO*s$r_%ss5h1YO7k0bHJ2CXN)Yd6CHn~W!R=SqkWe=&nAZu(Q1G!xgcUilM@YVei@2@a`8he z9@pM`)VB*=e7-MWgLlXlc)t;fF&-AwM{E-EX}pViFn0I0CNw2bNEnN2dj!^4(^zS3 zobUm1uQnpqk_4q{pl*n06=TfK_C>UgurKFjRXsK_LEn};=79`TB12tv6KzwSu*-C8 z;=~ohDLZylHQ|Mpx-?yql>|e=vI1Z!epyUpAcDCp4T|*RV&X`Q$0ogNwy6mFALo^@ z9=&(9txO8V@E!@6^(W0{*~CT>+-MA~vnJULBxCTUW>X5>r7*eXYUT0B6+w@lzw%n> z_VjJ<2qf|(d6jYq2(x$(ZDf!yVkfnbvNmb5c|hhZ^2TV_LBz`9w!e_V*W_(MiA7|= z&EeIIkw*+$Xd!)j8<@_<}A5;~A_>3JT*kX^@}cDoLd>Qj<`Se^wdUa(j0dp+Tl8EptwBm{9OGsdFEq zM`!pjf(Lm(`$e3FLOjqA5LnN5o!}z{ zNf}rJuZh@yUtq&ErjHeGzX4(!luV!jB&;FAP|!R_QHYw#^Z1LwTePAKJ6X&IDNO#; z)#I@Xnnzyij~C@UH~X51JCgQeF0&hTXnuoElz#m{heZRexWc0k4<>0+ClX7%0 zEBqCCld1tD9Zwkr4{?Nor19#E5-YKfB8d?qgR82-Ow2^AuNevly2*tHA|sK!ybYkX zm-sLQH72P&{vEAW6+z~O5d0qd=xW~rua~5a?ymYFSD@8&gV)E5@RNNBAj^C99+Z5Z zR@Pq55mbCQbz+Mn$d_CMW<-+?TU960agEk1J<>d>0K=pF19yN))a~4>m^G&tc*xR+yMD*S=yip-q=H zIlredHpsJV8H(32@Zxc@bX6a21dUV95Th--8pE6C&3F>pk=yv$yd6@Haw;$v4+Fcb zRwn{Qo@0`7aPa2LQOP}j9v>sjOo5Kqvn|`FLizX zB+@-u4Lw|jsvz{p^>n8Vo8H2peIqJJnMN}A)q6%$Tmig7eu^}K2 zrh$X?T|ZMsoh{6pdw1G$_T<`Ds-G=jc;qcGdK4{?dN2-XxjDNbb(7pk|3JUVCU4y; z)?LXR>f+AAu)JEiti_Zy#z5{RgsC}R(@jl%9YZ>zu~hKQ*AxbvhC378-I@{~#%Y`Z zy=a=9YpewPIC+gkEUUwtUL7|RU7=!^Aa}Mk^6uxOgRGA#JXjWLsjFUnix|Mau{hDT z7mn*z1m5g`vP(#tjT0Zy4eAY(br&!RiiXE=ZI!{sE1#^#%x^Z7t1U)b<;%Y}Q9=5v z;wpDCEZ@OE36TWT=|gxigT@VaW9BvHS05;_P(#s z8zI4XFQys}q)<`tkX$WnSarn{3e!s}4(J!=Yf>+Y>cP3f;vr63f2{|S^`_pWc)^5_!R z*(x-fuBxL51@xe!lnDBKi}Br$c$BMZ3%f2Sa6kLabiBS{pq*yj;q|k(86x`PiC{p6 z_bxCW{>Q2BA8~Ggz&0jkrcU+-$ANBsOop*ms>34K9lNYil@}jC;?cYP(m^P}nR6FV zk(M%48Z&%2Rx$A&FhOEirEhY0(dn;-k(qkTU)sFQ`+-ih+s@A8g?r8Pw+}2;35WYf zi}VO`jS`p(tc)$X$a>-#WXoW!phhatC*$}|rk>|wUU71eUJG^$c6_jwX?iSHM@6__ zvV|6%U*$sSXJu9SX?2%M^kK|}a2QJ8AhF{fuXrHZxXsI~O zGKX45!K7p*MCPEQ=gp?eu&#AW*pR{lhQR##P_*{c_DjMGL|3T3-bSJ(o$|M{ytU}> zAV>wq*uE*qFo9KvnA^@juy{x<-u*#2NvkV={Ly}ysKYB-k`K3@K#^S1Bb$8Y#0L0# z`6IkSG&|Z$ODy|VLS+y5pFJx&8tvPmMd8c9FhCyiU8~k6FwkakUd^(_ml8`rnl>JS zZV){9G*)xBqPz^LDqRwyS6w86#D^~xP4($150M)SOZRe9sn=>V#aG0Iy(_^YcPpIz8QYM-#s+n% z@Jd?xQq?Xk6=<3xSY7XYP$$yd&Spu{A#uafiIfy8gRC`o0nk{ezEDjb=q_qRAlR1d zFq^*9Gn)yTG4b}R{!+3hWQ+u3GT~8nwl2S1lpw`s0X_qpxv)g+JIkVKl${sYf_nV~B>Em>M;RlqGb5WVil(89 zs=ld@|#;dq1*vQGz=7--Br-|l) zZ%Xh@v8>B7P?~}?Cg$q9_={59l%m~O&*a6TKsCMAzG&vD>k2WDzJ6!tc!V)+oxF;h zJH;apM=wO?r_+*#;ulohuP=E>^zon}a$NnlcQ{1$SO*i=jnGVcQa^>QOILc)e6;eNTI>os=eaJ{*^DE+~jc zS}TYeOykDmJ=6O%>m`i*>&pO_S;qMySJIyP=}4E&J%#1zju$RpVAkZbEl+p%?ZP^C z*$$2b4t%a(e+%>a>d_f_<JjxI#J1x;=hPd1zFPx=6T$;;X1TD*2(edZ3f46zaAoW>L53vS_J*N8TMB|n+;LD| zC=GkQPpyDY#Am4l49chDv*gojhRj_?63&&8#doW`INATAo(qY#{q}%nf@eTIXmtU< zdB<7YWfyCmBs|c)cK>1)v&M#!yNj#4d$~pVfDWQc_ke1?fw{T1Nce_b`v|Vp5ig(H zJvRD^+ps46^hLX;=e2!2e;w9y1D@!D$c@Jc&%%%IL=+xzw55&2?darw=9g~>P z9>?Kdc$r?6c$m%x2S$sdpPl>GQZ{rC9mPS63*qjCVa?OIBj!fW zm|g?>CVfGXNjOfcyqImXR_(tXS(F{FcoNzKvG5R$IgGaxC@)i(e+$ME}vPVIhd|mx2IIE+f zM?9opQHIVgBWu)^A|RzXw!^??S!x)SZOwZaJkGjc<_}2l^eSBm!eAJG9T>EC6I_sy z?bxzDIAn&K5*mX)$RQzDA?s)-no-XF(g*yl4%+GBf`##bDXJ==AQk*xmnatI;SsLp zP9XTHq5mmS=iWu~9ES>b%Q=1aMa|ya^vj$@qz9S!ih{T8_PD%Sf_QrNKwgrXw9ldm zHRVR98*{C?_XNpJn{abA!oix_mowRMu^2lV-LPi;0+?-F(>^5#OHX-fPED zCu^l7u3E%STI}c4{J2!)9SUlGP_@!d?5W^QJXOI-Ea`hFMKjR7TluLvzC-ozCPn1`Tpy z!vlv@_Z58ILX6>nDjTp-1LlFMx~-%GA`aJvG$?8*Ihn;mH37eK**rmOEwqegf-Ccx zrIX4;{c~RK>XuTXxYo5kMiWMy)!IC{*DHG@E$hx?RwP@+wuad(P1{@%tRkyJRqD)3 zMHHHZ4boqDn>-=DgR5VlhQTpfVy182Gk;A_S8A1-;U1RR>+$62>(MUx@Nox$vTjHq z%QR=j!6Gdyb5wu7y(YUktwMuW5<@jl?m4cv4BODiT5o8qVdC0MBqGr@-YBIwnpZAY znX9(_uQjP}JJ=!~Ve9#5I~rUnN|P_3D$LqZcvBnywYhjlMSFHm`;u9GPla{5QD7(7*6Tb3Svr8;(nuAd81q$*uq6HC_&~je*Ca7hP4sJp0av{M8480wF zxASi7Qv+~@2U%Nu1Ud;s-G4CTVWIPyx!sg&8ZG0Wq zG_}i3C(6_1>q3w!EH7$Kwq8uBp2F2N7}l65mk1p*9v0&+;th=_E-W)E;w}P(j⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 54329 zcmagFV|ZrKvM!pAZQHhO+qP}9lTNj?q^^Y^VFp)SH8qbSJ)2BQ2giqr}t zFG7D6)c?v~^Z#E_K}1nTQbJ9gQ9<%vVRAxVj)8FwL5_iTdUB>&m3fhE=kRWl;g`&m z!W5kh{WsV%fO*%je&j+Lv4xxK~zsEYQls$Q-p&dwID|A)!7uWtJF-=Tm1{V@#x*+kUI$=%KUuf2ka zjiZ{oiL1MXE2EjciJM!jrjFNwCh`~hL>iemrqwqnX?T*MX;U>>8yRcZb{Oy+VKZos zLiFKYPw=LcaaQt8tj=eoo3-@bG_342HQ%?jpgAE?KCLEHC+DmjxAfJ%Og^$dpC8Xw zAcp-)tfJm}BPNq_+6m4gBgBm3+CvmL>4|$2N$^Bz7W(}fz1?U-u;nE`+9`KCLuqg} zwNstNM!J4Uw|78&Y9~9>MLf56to!@qGkJw5Thx%zkzj%Ek9Nn1QA@8NBXbwyWC>9H z#EPwjMNYPigE>*Ofz)HfTF&%PFj$U6mCe-AFw$U%-L?~-+nSXHHKkdgC5KJRTF}`G zE_HNdrE}S0zf4j{r_f-V2imSqW?}3w-4=f@o@-q+cZgaAbZ((hn))@|eWWhcT2pLpTpL!;_5*vM=sRL8 zqU##{U#lJKuyqW^X$ETU5ETeEVzhU|1m1750#f}38_5N9)B_2|v@1hUu=Kt7-@dhA zq_`OMgW01n`%1dB*}C)qxC8q;?zPeF_r;>}%JYmlER_1CUbKa07+=TV45~symC*g8 zW-8(gag#cAOuM0B1xG8eTp5HGVLE}+gYTmK=`XVVV*U!>H`~j4+ROIQ+NkN$LY>h4 zqpwdeE_@AX@PL};e5vTn`Ro(EjHVf$;^oiA%@IBQq>R7_D>m2D4OwwEepkg}R_k*M zM-o;+P27087eb+%*+6vWFCo9UEGw>t&WI17Pe7QVuoAoGHdJ(TEQNlJOqnjZ8adCb zI`}op16D@v7UOEo%8E-~m?c8FL1utPYlg@m$q@q7%mQ4?OK1h%ODjTjFvqd!C z-PI?8qX8{a@6d&Lb_X+hKxCImb*3GFemm?W_du5_&EqRq!+H?5#xiX#w$eLti-?E$;Dhu`{R(o>LzM4CjO>ICf z&DMfES#FW7npnbcuqREgjPQM#gs6h>`av_oEWwOJZ2i2|D|0~pYd#WazE2Bbsa}X@ zu;(9fi~%!VcjK6)?_wMAW-YXJAR{QHxrD5g(ou9mR6LPSA4BRG1QSZT6A?kelP_g- zH(JQjLc!`H4N=oLw=f3{+WmPA*s8QEeEUf6Vg}@!xwnsnR0bl~^2GSa5vb!Yl&4!> zWb|KQUsC$lT=3A|7vM9+d;mq=@L%uWKwXiO9}a~gP4s_4Yohc!fKEgV7WbVo>2ITbE*i`a|V!^p@~^<={#?Gz57 zyPWeM2@p>D*FW#W5Q`1`#5NW62XduP1XNO(bhg&cX`-LYZa|m-**bu|>}S;3)eP8_ zpNTnTfm8 ze+7wDH3KJ95p)5tlwk`S7mbD`SqHnYD*6`;gpp8VdHDz%RR_~I_Ar>5)vE-Pgu7^Y z|9Px+>pi3!DV%E%4N;ii0U3VBd2ZJNUY1YC^-e+{DYq+l@cGtmu(H#Oh%ibUBOd?C z{y5jW3v=0eV0r@qMLgv1JjZC|cZ9l9Q)k1lLgm))UR@#FrJd>w^`+iy$c9F@ic-|q zVHe@S2UAnc5VY_U4253QJxm&Ip!XKP8WNcnx9^cQ;KH6PlW8%pSihSH2(@{2m_o+m zr((MvBja2ctg0d0&U5XTD;5?d?h%JcRJp{_1BQW1xu&BrA3(a4Fh9hon-ly$pyeHq zG&;6q?m%NJ36K1Sq_=fdP(4f{Hop;_G_(i?sPzvB zDM}>*(uOsY0I1j^{$yn3#U(;B*g4cy$-1DTOkh3P!LQ;lJlP%jY8}Nya=h8$XD~%Y zbV&HJ%eCD9nui-0cw!+n`V~p6VCRqh5fRX z8`GbdZ@73r7~myQLBW%db;+BI?c-a>Y)m-FW~M=1^|<21_Sh9RT3iGbO{o-hpN%d6 z7%++#WekoBOP^d0$$|5npPe>u3PLvX_gjH2x(?{&z{jJ2tAOWTznPxv-pAv<*V7r$ z6&glt>7CAClWz6FEi3bToz-soY^{ScrjwVPV51=>n->c(NJngMj6TyHty`bfkF1hc zkJS%A@cL~QV0-aK4>Id!9dh7>0IV;1J9(myDO+gv76L3NLMUm9XyPauvNu$S<)-|F zZS}(kK_WnB)Cl`U?jsdYfAV4nrgzIF@+%1U8$poW&h^c6>kCx3;||fS1_7JvQT~CV zQ8Js+!p)3oW>Df(-}uqC`Tcd%E7GdJ0p}kYj5j8NKMp(KUs9u7?jQ94C)}0rba($~ zqyBx$(1ae^HEDG`Zc@-rXk1cqc7v0wibOR4qpgRDt#>-*8N3P;uKV0CgJE2SP>#8h z=+;i_CGlv+B^+$5a}SicVaSeaNn29K`C&=}`=#Nj&WJP9Xhz4mVa<+yP6hkrq1vo= z1rX4qg8dc4pmEvq%NAkpMK>mf2g?tg_1k2%v}<3`$6~Wlq@ItJ*PhHPoEh1Yi>v57 z4k0JMO)*=S`tKvR5gb-(VTEo>5Y>DZJZzgR+j6{Y`kd|jCVrg!>2hVjz({kZR z`dLlKhoqT!aI8=S+fVp(5*Dn6RrbpyO~0+?fy;bm$0jmTN|t5i6rxqr4=O}dY+ROd zo9Et|x}!u*xi~>-y>!M^+f&jc;IAsGiM_^}+4|pHRn{LThFFpD{bZ|TA*wcGm}XV^ zr*C6~@^5X-*R%FrHIgo-hJTBcyQ|3QEj+cSqp#>&t`ZzB?cXM6S(lRQw$I2?m5=wd z78ki`R?%;o%VUhXH?Z#(uwAn9$m`npJ=cA+lHGk@T7qq_M6Zoy1Lm9E0UUysN)I_x zW__OAqvku^>`J&CB=ie@yNWsaFmem}#L3T(x?a`oZ+$;3O-icj2(5z72Hnj=9Z0w% z<2#q-R=>hig*(t0^v)eGq2DHC%GymE-_j1WwBVGoU=GORGjtaqr0BNigOCqyt;O(S zKG+DoBsZU~okF<7ahjS}bzwXxbAxFfQAk&O@>LsZMsZ`?N?|CDWM(vOm%B3CBPC3o z%2t@%H$fwur}SSnckUm0-k)mOtht`?nwsDz=2#v=RBPGg39i#%odKq{K^;bTD!6A9 zskz$}t)sU^=a#jLZP@I=bPo?f-L}wpMs{Tc!m7-bi!Ldqj3EA~V;4(dltJmTXqH0r z%HAWKGutEc9vOo3P6Q;JdC^YTnby->VZ6&X8f{obffZ??1(cm&L2h7q)*w**+sE6dG*;(H|_Q!WxU{g)CeoT z(KY&bv!Usc|m+Fqfmk;h&RNF|LWuNZ!+DdX*L=s-=_iH=@i` z?Z+Okq^cFO4}_n|G*!)Wl_i%qiMBaH8(WuXtgI7EO=M>=i_+;MDjf3aY~6S9w0K zUuDO7O5Ta6+k40~xh~)D{=L&?Y0?c$s9cw*Ufe18)zzk%#ZY>Tr^|e%8KPb0ht`b( zuP@8#Ox@nQIqz9}AbW0RzE`Cf>39bOWz5N3qzS}ocxI=o$W|(nD~@EhW13Rj5nAp; zu2obEJa=kGC*#3=MkdkWy_%RKcN=?g$7!AZ8vBYKr$ePY(8aIQ&yRPlQ=mudv#q$q z4%WzAx=B{i)UdLFx4os?rZp6poShD7Vc&mSD@RdBJ=_m^&OlkEE1DFU@csgKcBifJ zz4N7+XEJhYzzO=86 z#%eBQZ$Nsf2+X0XPHUNmg#(sNt^NW1Y0|M(${e<0kW6f2q5M!2YE|hSEQ*X-%qo(V zHaFwyGZ0on=I{=fhe<=zo{=Og-_(to3?cvL4m6PymtNsdDINsBh8m>a%!5o3s(en) z=1I z6O+YNertC|OFNqd6P=$gMyvmfa`w~p9*gKDESFqNBy(~Zw3TFDYh}$iudn)9HxPBi zdokK@o~nu?%imcURr5Y~?6oo_JBe}t|pU5qjai|#JDyG=i^V~7+a{dEnO<(y>ahND#_X_fcEBNiZ)uc&%1HVtx8Ts z*H_Btvx^IhkfOB#{szN*n6;y05A>3eARDXslaE>tnLa>+`V&cgho?ED+&vv5KJszf zG4@G;7i;4_bVvZ>!mli3j7~tPgybF5|J6=Lt`u$D%X0l}#iY9nOXH@(%FFJLtzb%p zzHfABnSs;v-9(&nzbZytLiqqDIWzn>JQDk#JULcE5CyPq_m#4QV!}3421haQ+LcfO*>r;rg6K|r#5Sh|y@h1ao%Cl)t*u`4 zMTP!deC?aL7uTxm5^nUv#q2vS-5QbBKP|drbDXS%erB>fYM84Kpk^au99-BQBZR z7CDynflrIAi&ahza+kUryju5LR_}-Z27g)jqOc(!Lx9y)e z{cYc&_r947s9pteaa4}dc|!$$N9+M38sUr7h(%@Ehq`4HJtTpA>B8CLNO__@%(F5d z`SmX5jbux6i#qc}xOhumzbAELh*Mfr2SW99=WNOZRZgoCU4A2|4i|ZVFQt6qEhH#B zK_9G;&h*LO6tB`5dXRSBF0hq0tk{2q__aCKXYkP#9n^)@cq}`&Lo)1KM{W+>5mSed zKp~=}$p7>~nK@va`vN{mYzWN1(tE=u2BZhga5(VtPKk(*TvE&zmn5vSbjo zZLVobTl%;t@6;4SsZ>5+U-XEGUZGG;+~|V(pE&qqrp_f~{_1h@5ZrNETqe{bt9ioZ z#Qn~gWCH!t#Ha^n&fT2?{`}D@s4?9kXj;E;lWV9Zw8_4yM0Qg-6YSsKgvQ*fF{#Pq z{=(nyV>#*`RloBVCs;Lp*R1PBIQOY=EK4CQa*BD0MsYcg=opP?8;xYQDSAJBeJpw5 zPBc_Ft9?;<0?pBhCmOtWU*pN*;CkjJ_}qVic`}V@$TwFi15!mF1*m2wVX+>5p%(+R zQ~JUW*zWkalde{90@2v+oVlkxOZFihE&ZJ){c?hX3L2@R7jk*xjYtHi=}qb+4B(XJ z$gYcNudR~4Kz_WRq8eS((>ALWCO)&R-MXE+YxDn9V#X{_H@j616<|P(8h(7z?q*r+ zmpqR#7+g$cT@e&(%_|ipI&A%9+47%30TLY(yuf&*knx1wNx|%*H^;YB%ftt%5>QM= z^i;*6_KTSRzQm%qz*>cK&EISvF^ovbS4|R%)zKhTH_2K>jP3mBGn5{95&G9^a#4|K zv+!>fIsR8z{^x4)FIr*cYT@Q4Z{y}};rLHL+atCgHbfX*;+k&37DIgENn&=k(*lKD zG;uL-KAdLn*JQ?@r6Q!0V$xXP=J2i~;_+i3|F;_En;oAMG|I-RX#FwnmU&G}w`7R{ z788CrR-g1DW4h_`&$Z`ctN~{A)Hv_-Bl!%+pfif8wN32rMD zJDs$eVWBYQx1&2sCdB0!vU5~uf)=vy*{}t{2VBpcz<+~h0wb7F3?V^44*&83Z2#F` z32!rd4>uc63rQP$3lTH3zb-47IGR}f)8kZ4JvX#toIpXH`L%NnPDE~$QI1)0)|HS4 zVcITo$$oWWwCN@E-5h>N?Hua!N9CYb6f8vTFd>h3q5Jg-lCI6y%vu{Z_Uf z$MU{{^o~;nD_@m2|E{J)q;|BK7rx%`m``+OqZAqAVj-Dy+pD4-S3xK?($>wn5bi90CFAQ+ACd;&m6DQB8_o zjAq^=eUYc1o{#+p+ zn;K<)Pn*4u742P!;H^E3^Qu%2dM{2slouc$AN_3V^M7H_KY3H)#n7qd5_p~Za7zAj|s9{l)RdbV9e||_67`#Tu*c<8!I=zb@ z(MSvQ9;Wrkq6d)!9afh+G`!f$Ip!F<4ADdc*OY-y7BZMsau%y?EN6*hW4mOF%Q~bw z2==Z3^~?q<1GTeS>xGN-?CHZ7a#M4kDL zQxQr~1ZMzCSKFK5+32C%+C1kE#(2L=15AR!er7GKbp?Xd1qkkGipx5Q~FI-6zt< z*PTpeVI)Ngnnyaz5noIIgNZtb4bQdKG{Bs~&tf)?nM$a;7>r36djllw%hQxeCXeW^ z(i6@TEIuxD<2ulwLTt|&gZP%Ei+l!(%p5Yij6U(H#HMkqM8U$@OKB|5@vUiuY^d6X zW}fP3;Kps6051OEO(|JzmVU6SX(8q>*yf*x5QoxDK={PH^F?!VCzES_Qs>()_y|jg6LJlJWp;L zKM*g5DK7>W_*uv}{0WUB0>MHZ#oJZmO!b3MjEc}VhsLD~;E-qNNd?x7Q6~v zR=0$u>Zc2Xr}>x_5$-s#l!oz6I>W?lw;m9Ae{Tf9eMX;TI-Wf_mZ6sVrMnY#F}cDd z%CV*}fDsXUF7Vbw>PuDaGhu631+3|{xp<@Kl|%WxU+vuLlcrklMC!Aq+7n~I3cmQ! z`e3cA!XUEGdEPSu``&lZEKD1IKO(-VGvcnSc153m(i!8ohi`)N2n>U_BemYJ`uY>8B*Epj!oXRLV}XK}>D*^DHQ7?NY*&LJ9VSo`Ogi9J zGa;clWI8vIQqkngv2>xKd91K>?0`Sw;E&TMg&6dcd20|FcTsnUT7Yn{oI5V4@Ow~m zz#k~8TM!A9L7T!|colrC0P2WKZW7PNj_X4MfESbt<-soq*0LzShZ}fyUx!(xIIDwx zRHt^_GAWe0-Vm~bDZ(}XG%E+`XhKpPlMBo*5q_z$BGxYef8O!ToS8aT8pmjbPq)nV z%x*PF5ZuSHRJqJ!`5<4xC*xb2vC?7u1iljB_*iUGl6+yPyjn?F?GOF2_KW&gOkJ?w z3e^qc-te;zez`H$rsUCE0<@7PKGW?7sT1SPYWId|FJ8H`uEdNu4YJjre`8F*D}6Wh z|FQ`xf7yiphHIAkU&OYCn}w^ilY@o4larl?^M7&8YI;hzBIsX|i3UrLsx{QDKwCX< zy;a>yjfJ6!sz`NcVi+a!Fqk^VE^{6G53L?@Tif|j!3QZ0fk9QeUq8CWI;OmO-Hs+F zuZ4sHLA3{}LR2Qlyo+{d@?;`tpp6YB^BMoJt?&MHFY!JQwoa0nTSD+#Ku^4b{5SZVFwU9<~APYbaLO zu~Z)nS#dxI-5lmS-Bnw!(u15by(80LlC@|ynj{TzW)XcspC*}z0~8VRZq>#Z49G`I zgl|C#H&=}n-ajxfo{=pxPV(L*7g}gHET9b*s=cGV7VFa<;Htgjk>KyW@S!|z`lR1( zGSYkEl&@-bZ*d2WQ~hw3NpP=YNHF^XC{TMG$Gn+{b6pZn+5=<()>C!N^jncl0w6BJ zdHdnmSEGK5BlMeZD!v4t5m7ct7{k~$1Ie3GLFoHjAH*b?++s<|=yTF+^I&jT#zuMx z)MLhU+;LFk8bse|_{j+d*a=&cm2}M?*arjBPnfPgLwv)86D$6L zLJ0wPul7IenMvVAK$z^q5<^!)7aI|<&GGEbOr=E;UmGOIa}yO~EIr5xWU_(ol$&fa zR5E(2vB?S3EvJglTXdU#@qfDbCYs#82Yo^aZN6`{Ex#M)easBTe_J8utXu(fY1j|R z9o(sQbj$bKU{IjyhosYahY{63>}$9_+hWxB3j}VQkJ@2$D@vpeRSldU?&7I;qd2MF zSYmJ>zA(@N_iK}m*AMPIJG#Y&1KR)6`LJ83qg~`Do3v^B0>fU&wUx(qefuTgzFED{sJ65!iw{F2}1fQ3= ziFIP{kezQxmlx-!yo+sC4PEtG#K=5VM9YIN0z9~c4XTX?*4e@m;hFM!zVo>A`#566 z>f&3g94lJ{r)QJ5m7Xe3SLau_lOpL;A($wsjHR`;xTXgIiZ#o&vt~ zGR6KdU$FFbLfZCC3AEu$b`tj!9XgOGLSV=QPIYW zjI!hSP#?8pn0@ezuenOzoka8!8~jXTbiJ6+ZuItsWW03uzASFyn*zV2kIgPFR$Yzm zE<$cZlF>R8?Nr2_i?KiripBc+TGgJvG@vRTY2o?(_Di}D30!k&CT`>+7ry2!!iC*X z<@=U0_C#16=PN7bB39w+zPwDOHX}h20Ap);dx}kjXX0-QkRk=cr};GYsjSvyLZa-t zzHONWddi*)RDUH@RTAsGB_#&O+QJaaL+H<<9LLSE+nB@eGF1fALwjVOl8X_sdOYme z0lk!X=S(@25=TZHR7LlPp}fY~yNeThMIjD}pd9+q=j<_inh0$>mIzWVY+Z9p<{D^#0Xk+b_@eNSiR8;KzSZ#7lUsk~NGMcB8C2c=m2l5paHPq`q{S(kdA7Z1a zyfk2Y;w?^t`?@yC5Pz9&pzo}Hc#}mLgDmhKV|PJ3lKOY(Km@Fi2AV~CuET*YfUi}u zfInZnqDX(<#vaS<^fszuR=l)AbqG{}9{rnyx?PbZz3Pyu!eSJK`uwkJU!ORQXy4x83r!PNgOyD33}}L=>xX_93l6njNTuqL8J{l%*3FVn3MG4&Fv*`lBXZ z?=;kn6HTT^#SrPX-N)4EZiIZI!0ByXTWy;;J-Tht{jq1mjh`DSy7yGjHxIaY%*sTx zuy9#9CqE#qi>1misx=KRWm=qx4rk|}vd+LMY3M`ow8)}m$3Ggv&)Ri*ON+}<^P%T5 z_7JPVPfdM=Pv-oH<tecoE}(0O7|YZc*d8`Uv_M*3Rzv7$yZnJE6N_W=AQ3_BgU_TjA_T?a)U1csCmJ&YqMp-lJe`y6>N zt++Bi;ZMOD%%1c&-Q;bKsYg!SmS^#J@8UFY|G3!rtyaTFb!5@e(@l?1t(87ln8rG? z--$1)YC~vWnXiW3GXm`FNSyzu!m$qT=Eldf$sMl#PEfGmzQs^oUd=GIQfj(X=}dw+ zT*oa0*oS%@cLgvB&PKIQ=Ok?>x#c#dC#sQifgMwtAG^l3D9nIg(Zqi;D%807TtUUCL3_;kjyte#cAg?S%e4S2W>9^A(uy8Ss0Tc++ZTjJw1 z&Em2g!3lo@LlDyri(P^I8BPpn$RE7n*q9Q-c^>rfOMM6Pd5671I=ZBjAvpj8oIi$! zl0exNl(>NIiQpX~FRS9UgK|0l#s@#)p4?^?XAz}Gjb1?4Qe4?j&cL$C8u}n)?A@YC zfmbSM`Hl5pQFwv$CQBF=_$Sq zxsV?BHI5bGZTk?B6B&KLdIN-40S426X3j_|ceLla*M3}3gx3(_7MVY1++4mzhH#7# zD>2gTHy*%i$~}mqc#gK83288SKp@y3wz1L_e8fF$Rb}ex+`(h)j}%~Ld^3DUZkgez zOUNy^%>>HHE|-y$V@B}-M|_{h!vXpk01xaD%{l{oQ|~+^>rR*rv9iQen5t?{BHg|% zR`;S|KtUb!X<22RTBA4AAUM6#M?=w5VY-hEV)b`!y1^mPNEoy2K)a>OyA?Q~Q*&(O zRzQI~y_W=IPi?-OJX*&&8dvY0zWM2%yXdFI!D-n@6FsG)pEYdJbuA`g4yy;qrgR?G z8Mj7gv1oiWq)+_$GqqQ$(ZM@#|0j7})=#$S&hZwdoijFI4aCFLVI3tMH5fLreZ;KD zqA`)0l~D2tuIBYOy+LGw&hJ5OyE+@cnZ0L5+;yo2pIMdt@4$r^5Y!x7nHs{@>|W(MzJjATyWGNwZ^4j+EPU0RpAl-oTM@u{lx*i0^yyWPfHt6QwPvYpk9xFMWfBFt!+Gu6TlAmr zeQ#PX71vzN*_-xh&__N`IXv6`>CgV#eA_%e@7wjgkj8jlKzO~Ic6g$cT`^W{R{606 zCDP~+NVZ6DMO$jhL~#+!g*$T!XW63#(ngDn#Qwy71yj^gazS{e;3jGRM0HedGD@pt z?(ln3pCUA(ekqAvvnKy0G@?-|-dh=eS%4Civ&c}s%wF@0K5Bltaq^2Os1n6Z3%?-Q zAlC4goQ&vK6TpgtzkHVt*1!tBYt-`|5HLV1V7*#45Vb+GACuU+QB&hZ=N_flPy0TY zR^HIrdskB#<$aU;HY(K{a3(OQa$0<9qH(oa)lg@Uf>M5g2W0U5 zk!JSlhrw8quBx9A>RJ6}=;W&wt@2E$7J=9SVHsdC?K(L(KACb#z)@C$xXD8^!7|uv zZh$6fkq)aoD}^79VqdJ!Nz-8$IrU(_-&^cHBI;4 z^$B+1aPe|LG)C55LjP;jab{dTf$0~xbXS9!!QdcmDYLbL^jvxu2y*qnx2%jbL%rB z{aP85qBJe#(&O~Prk%IJARcdEypZ)vah%ZZ%;Zk{eW(U)Bx7VlzgOi8)x z`rh4l`@l_Ada7z&yUK>ZF;i6YLGwI*Sg#Fk#Qr0Jg&VLax(nNN$u-XJ5=MsP3|(lEdIOJ7|(x3iY;ea)5#BW*mDV%^=8qOeYO&gIdJVuLLN3cFaN=xZtFB=b zH{l)PZl_j^u+qx@89}gAQW7ofb+k)QwX=aegihossZq*+@PlCpb$rpp>Cbk9UJO<~ zDjlXQ_Ig#W0zdD3&*ei(FwlN#3b%FSR%&M^ywF@Fr>d~do@-kIS$e%wkIVfJ|Ohh=zc zF&Rnic^|>@R%v?@jO}a9;nY3Qrg_!xC=ZWUcYiA5R+|2nsM*$+c$TOs6pm!}Z}dfM zGeBhMGWw3$6KZXav^>YNA=r6Es>p<6HRYcZY)z{>yasbC81A*G-le8~QoV;rtKnkx z;+os8BvEe?0A6W*a#dOudsv3aWs?d% z0oNngyVMjavLjtjiG`!007#?62ClTqqU$@kIY`=x^$2e>iqIy1>o|@Tw@)P)B8_1$r#6>DB_5 zmaOaoE~^9TolgDgooKFuEFB#klSF%9-~d2~_|kQ0Y{Ek=HH5yq9s zDq#1S551c`kSiWPZbweN^A4kWiP#Qg6er1}HcKv{fxb1*BULboD0fwfaNM_<55>qM zETZ8TJDO4V)=aPp_eQjX%||Ud<>wkIzvDlpNjqW>I}W!-j7M^TNe5JIFh#-}zAV!$ICOju8Kx)N z0vLtzDdy*rQN!7r>Xz7rLw8J-(GzQlYYVH$WK#F`i_i^qVlzTNAh>gBWKV@XC$T-` z3|kj#iCquDhiO7NKum07i|<-NuVsX}Q}mIP$jBJDMfUiaWR3c|F_kWBMw0_Sr|6h4 zk`_r5=0&rCR^*tOy$A8K;@|NqwncjZ>Y-75vlpxq%Cl3EgH`}^^~=u zoll6xxY@a>0f%Ddpi;=cY}fyG!K2N-dEyXXmUP5u){4VnyS^T4?pjN@Ot4zjL(Puw z_U#wMH2Z#8Pts{olG5Dy0tZj;N@;fHheu>YKYQU=4Bk|wcD9MbA`3O4bj$hNRHwzb zSLcG0SLV%zywdbuwl(^E_!@&)TdXge4O{MRWk2RKOt@!8E{$BU-AH(@4{gxs=YAz9LIob|Hzto0}9cWoz6Tp2x0&xi#$ zHh$dwO&UCR1Ob2w00-2eG7d4=cN(Y>0R#$q8?||q@iTi+7-w-xR%uMr&StFIthC<# zvK(aPduwuNB}oJUV8+Zl)%cnfsHI%4`;x6XW^UF^e4s3Z@S<&EV8?56Wya;HNs0E> z`$0dgRdiUz9RO9Au3RmYq>K#G=X%*_dUbSJHP`lSfBaN8t-~@F>)BL1RT*9I851A3 z<-+Gb#_QRX>~av#Ni<#zLswtu-c6{jGHR>wflhKLzC4P@b%8&~u)fosoNjk4r#GvC zlU#UU9&0Hv;d%g72Wq?Ym<&&vtA3AB##L}=ZjiTR4hh7J)e>ei} zt*u+>h%MwN`%3}b4wYpV=QwbY!jwfIj#{me)TDOG`?tI!%l=AwL2G@9I~}?_dA5g6 zCKgK(;6Q0&P&K21Tx~k=o6jwV{dI_G+Ba*Zts|Tl6q1zeC?iYJTb{hel*x>^wb|2RkHkU$!+S4OU4ZOKPZjV>9OVsqNnv5jK8TRAE$A&^yRwK zj-MJ3Pl?)KA~fq#*K~W0l4$0=8GRx^9+?w z!QT8*-)w|S^B0)ZeY5gZPI2G(QtQf?DjuK(s^$rMA!C%P22vynZY4SuOE=wX2f8$R z)A}mzJi4WJnZ`!bHG1=$lwaxm!GOnRbR15F$nRC-M*H<*VfF|pQw(;tbSfp({>9^5 zw_M1-SJ9eGF~m(0dvp*P8uaA0Yw+EkP-SWqu zqal$hK8SmM7#Mrs0@OD+%_J%H*bMyZiWAZdsIBj#lkZ!l2c&IpLu(5^T0Ge5PHzR} zn;TXs$+IQ_&;O~u=Jz+XE0wbOy`=6>m9JVG} zJ~Kp1e5m?K3x@@>!D)piw^eMIHjD4RebtR`|IlckplP1;r21wTi8v((KqNqn%2CB< zifaQc&T}*M&0i|LW^LgdjIaX|o~I$`owHolRqeH_CFrqCUCleN130&vH}dK|^kC>) z-r2P~mApHotL4dRX$25lIcRh_*kJaxi^%ZN5-GAAMOxfB!6flLPY-p&QzL9TE%ho( zRwftE3sy5<*^)qYzKkL|rE>n@hyr;xPqncY6QJ8125!MWr`UCWuC~A#G1AqF1@V$kv>@NBvN&2ygy*{QvxolkRRb%Ui zsmKROR%{*g*WjUUod@@cS^4eF^}yQ1>;WlGwOli z+Y$(8I`0(^d|w>{eaf!_BBM;NpCoeem2>J}82*!em=}}ymoXk>QEfJ>G(3LNA2-46 z5PGvjr)Xh9>aSe>vEzM*>xp{tJyZox1ZRl}QjcvX2TEgNc^(_-hir@Es>NySoa1g^ zFow_twnHdx(j?Q_3q51t3XI7YlJ4_q&(0#)&a+RUy{IcBq?)eaWo*=H2UUVIqtp&lW9JTJiP&u zw8+4vo~_IJXZIJb_U^&=GI1nSD%e;P!c{kZALNCm5c%%oF+I3DrA63_@4)(v4(t~JiddILp7jmoy+>cD~ivwoctFfEL zP*#2Rx?_&bCpX26MBgp^4G>@h`Hxc(lnqyj!*t>9sOBcXN(hTwEDpn^X{x!!gPX?1 z*uM$}cYRwHXuf+gYTB}gDTcw{TXSOUU$S?8BeP&sc!Lc{{pEv}x#ELX>6*ipI1#>8 zKes$bHjiJ1OygZge_ak^Hz#k;=od1wZ=o71ba7oClBMq>Uk6hVq|ePPt)@FM5bW$I z;d2Or@wBjbTyZj|;+iHp%Bo!Vy(X3YM-}lasMItEV_QrP-Kk_J4C>)L&I3Xxj=E?| zsAF(IfVQ4w+dRRnJ>)}o^3_012YYgFWE)5TT=l2657*L8_u1KC>Y-R{7w^S&A^X^U}h20jpS zQsdeaA#WIE*<8KG*oXc~$izYilTc#z{5xhpXmdT-YUnGh9v4c#lrHG6X82F2-t35} zB`jo$HjKe~E*W$=g|j&P>70_cI`GnOQ;Jp*JK#CT zuEGCn{8A@bC)~0%wsEv?O^hSZF*iqjO~_h|>xv>PO+?525Nw2472(yqS>(#R)D7O( zg)Zrj9n9$}=~b00=Wjf?E418qP-@8%MQ%PBiCTX=$B)e5cHFDu$LnOeJ~NC;xmOk# z>z&TbsK>Qzk)!88lNI8fOE2$Uxso^j*1fz>6Ot49y@=po)j4hbTIcVR`ePHpuJSfp zxaD^Dn3X}Na3@<_Pc>a;-|^Pon(>|ytG_+U^8j_JxP=_d>L$Hj?|0lz>_qQ#a|$+( z(x=Lipuc8p4^}1EQhI|TubffZvB~lu$zz9ao%T?%ZLyV5S9}cLeT?c} z>yCN9<04NRi~1oR)CiBakoNhY9BPnv)kw%*iv8vdr&&VgLGIs(-FbJ?d_gfbL2={- zBk4lkdPk~7+jIxd4{M(-W1AC_WcN&Oza@jZoj zaE*9Y;g83#m(OhA!w~LNfUJNUuRz*H-=$s*z+q+;snKPRm9EptejugC-@7-a-}Tz0 z@KHra#Y@OXK+KsaSN9WiGf?&jlZ!V7L||%KHP;SLksMFfjkeIMf<1e~t?!G3{n)H8 zQAlFY#QwfKuj;l@<$YDATAk;%PtD%B(0<|8>rXU< zJ66rkAVW_~Dj!7JGdGGi4NFuE?7ZafdMxIh65Sz7yQoA7fBZCE@WwysB=+`kT^LFX zz8#FlSA5)6FG9(qL3~A24mpzL@@2D#>0J7mMS1T*9UJ zvOq!!a(%IYY69+h45CE?(&v9H4FCr>gK0>mK~F}5RdOuH2{4|}k@5XpsX7+LZo^Qa4sH5`eUj>iffoBVm+ zz4Mtf`h?NW$*q1yr|}E&eNl)J``SZvTf6Qr*&S%tVv_OBpbjnA0&Vz#(;QmGiq-k! zgS0br4I&+^2mgA15*~Cd00cXLYOLA#Ep}_)eED>m+K@JTPr_|lSN}(OzFXQSBc6fM z@f-%2;1@BzhZa*LFV z-LrLmkmB%<<&jEURBEW>soaZ*rSIJNwaV%-RSaCZi4X)qYy^PxZ=oL?6N-5OGOMD2 z;q_JK?zkwQ@b3~ln&sDtT5SpW9a0q+5Gm|fpVY2|zqlNYBR}E5+ahgdj!CvK$Tlk0 z9g$5N;aar=CqMsudQV>yb4l@hN(9Jcc=1(|OHsqH6|g=K-WBd8GxZ`AkT?OO z-z_Ued-??Z*R4~L7jwJ%-`s~FK|qNAJ;EmIVDVpk{Lr7T4l{}vL)|GuUuswe9c5F| zv*5%u01hlv08?00Vpwyk*Q&&fY8k6MjOfpZfKa@F-^6d=Zv|0@&4_544RP5(s|4VPVP-f>%u(J@23BHqo2=zJ#v9g=F!cP((h zpt0|(s++ej?|$;2PE%+kc6JMmJjDW)3BXvBK!h!E`8Y&*7hS{c_Z?4SFP&Y<3evqf z9-ke+bSj$%Pk{CJlJbWwlBg^mEC^@%Ou?o>*|O)rl&`KIbHrjcpqsc$Zqt0^^F-gU2O=BusO+(Op}!jNzLMc zT;0YT%$@ClS%V+6lMTfhuzzxomoat=1H?1$5Ei7&M|gxo`~{UiV5w64Np6xV zVK^nL$)#^tjhCpTQMspXI({TW^U5h&Wi1Jl8g?P1YCV4=%ZYyjSo#5$SX&`r&1PyC zzc;uzCd)VTIih|8eNqFNeBMe#j_FS6rq81b>5?aXg+E#&$m++Gz9<+2)h=K(xtn}F ziV{rmu+Y>A)qvF}ms}4X^Isy!M&1%$E!rTO~5(p+8{U6#hWu>(Ll1}eD64Xa>~73A*538wry?v$vW z>^O#FRdbj(k0Nr&)U`Tl(4PI*%IV~;ZcI2z&rmq=(k^}zGOYZF3b2~Klpzd2eZJl> zB=MOLwI1{$RxQ7Y4e30&yOx?BvAvDkTBvWPpl4V8B7o>4SJn*+h1Ms&fHso%XLN5j z-zEwT%dTefp~)J_C8;Q6i$t!dnlh-!%haR1X_NuYUuP-)`IGWjwzAvp!9@h`kPZhf zwLwFk{m3arCdx8rD~K2`42mIN4}m%OQ|f)4kf%pL?Af5Ul<3M2fv>;nlhEPR8b)u} zIV*2-wyyD%%) zl$G@KrC#cUwoL?YdQyf9WH)@gWB{jd5w4evI& zOFF)p_D8>;3-N1z6mES!OPe>B^<;9xsh)){Cw$Vs-ez5nXS95NOr3s$IU;>VZSzKn zBvub8_J~I%(DozZW@{)Vp37-zevxMRZ8$8iRfwHmYvyjOxIOAF2FUngKj289!(uxY zaClWm!%x&teKmr^ABrvZ(ikx{{I-lEzw5&4t3P0eX%M~>$wG0ZjA4Mb&op+0$#SO_ z--R`>X!aqFu^F|a!{Up-iF(K+alKB{MNMs>e(i@Tpy+7Z-dK%IEjQFO(G+2mOb@BO zP>WHlS#fSQm0et)bG8^ZDScGnh-qRKIFz zfUdnk=m){ej0i(VBd@RLtRq3Ep=>&2zZ2%&vvf?Iex01hx1X!8U+?>ER;yJlR-2q4 z;Y@hzhEC=d+Le%=esE>OQ!Q|E%6yG3V_2*uh&_nguPcZ{q?DNq8h_2ahaP6=pP-+x zK!(ve(yfoYC+n(_+chiJ6N(ZaN+XSZ{|H{TR1J_s8x4jpis-Z-rlRvRK#U%SMJ(`C z?T2 zF(NNfO_&W%2roEC2j#v*(nRgl1X)V-USp-H|CwFNs?n@&vpRcj@W@xCJwR6@T!jt377?XjZ06=`d*MFyTdyvW!`mQm~t3luzYzvh^F zM|V}rO>IlBjZc}9Z zd$&!tthvr>5)m;5;96LWiAV0?t)7suqdh0cZis`^Pyg@?t>Ms~7{nCU;z`Xl+raSr zXpp=W1oHB*98s!Tpw=R5C)O{{Inl>9l7M*kq%#w9a$6N~v?BY2GKOVRkXYCgg*d

<5G2M1WZP5 zzqSuO91lJod(SBDDw<*sX(+F6Uq~YAeYV#2A;XQu_p=N5X+#cmu19Qk>QAnV=k!?wbk5I;tDWgFc}0NkvC*G=V+Yh1cyeJVq~9czZiDXe+S=VfL2g`LWo8om z$Y~FQc6MFjV-t1Y`^D9XMwY*U_re2R?&(O~68T&D4S{X`6JYU-pz=}ew-)V0AOUT1 zVOkHAB-8uBcRjLvz<9HS#a@X*Kc@|W)nyiSgi|u5$Md|P()%2(?olGg@ypoJwp6>m z*dnfjjWC>?_1p;%1brqZyDRR;8EntVA92EJ3ByOxj6a+bhPl z;a?m4rQAV1@QU^#M1HX)0+}A<7TCO`ZR_RzF}X9-M>cRLyN4C+lCk2)kT^3gN^`IT zNP~fAm(wyIoR+l^lQDA(e1Yv}&$I!n?&*p6?lZcQ+vGLLd~fM)qt}wsbf3r=tmVYe zl)ntf#E!P7wlakP9MXS7m0nsAmqxZ*)#j;M&0De`oNmFgi$ov#!`6^4)iQyxg5Iuj zjLAhzQ)r`^hf7`*1`Rh`X;LVBtDSz@0T?kkT1o!ijeyTGt5vc^Cd*tmNgiNo^EaWvaC8$e+nb_{W01j3%=1Y&92YacjCi>eNbwk%-gPQ@H-+4xskQ}f_c=jg^S-# zYFBDf)2?@5cy@^@FHK5$YdAK9cI;!?Jgd}25lOW%xbCJ>By3=HiK@1EM+I46A)Lsd zeT|ZH;KlCml=@;5+hfYf>QNOr^XNH%J-lvev)$Omy8MZ`!{`j>(J5cG&ZXXgv)TaF zg;cz99i$4CX_@3MIb?GL0s*8J=3`#P(jXF(_(6DXZjc@(@h&=M&JG)9&Te1?(^XMW zjjC_70|b=9hB6pKQi`S^Ls7JyJw^@P>Ko^&q8F&?>6i;#CbxUiLz1ZH4lNyd@QACd zu>{!sqjB!2Dg}pbAXD>d!3jW}=5aN0b;rw*W>*PAxm7D)aw(c*RX2@bTGEI|RRp}vw7;NR2wa;rXN{L{Q#=Fa z$x@ms6pqb>!8AuV(prv>|aU8oWV={C&$c zMa=p=CDNOC2tISZcd8~18GN5oTbKY+Vrq;3_obJlfSKRMk;Hdp1`y`&LNSOqeauR_ z^j*Ojl3Ohzb5-a49A8s|UnM*NM8tg}BJXdci5%h&;$afbmRpN0&~9rCnBA`#lG!p zc{(9Y?A0Y9yo?wSYn>iigf~KP$0*@bGZ>*YM4&D;@{<%Gg5^uUJGRrV4 z(aZOGB&{_0f*O=Oi0k{@8vN^BU>s3jJRS&CJOl3o|BE{FAA&a#2YYiX3pZz@|Go-F z|Fly;7eX2OTs>R}<`4RwpHFs9nwh)B28*o5qK1Ge=_^w0m`uJOv!=&!tzt#Save(C zgKU=Bsgql|`ui(e1KVxR`?>Dx>(rD1$iWp&m`v)3A!j5(6vBm*z|aKm*T*)mo(W;R zNGo2`KM!^SS7+*9YxTm6YMm_oSrLceqN*nDOAtagULuZl5Q<7mOnB@Hq&P|#9y{5B z!2x+2s<%Cv2Aa0+u{bjZXS);#IFPk(Ph-K7K?3i|4ro> zRbqJoiOEYo(Im^((r}U4b8nvo_>4<`)ut`24?ILnglT;Pd&U}$lV3U$F9#PD(O=yV zgNNA=GW|(E=&m_1;uaNmipQe?pon4{T=zK!N!2_CJL0E*R^XXIKf*wi!>@l}3_P9Z zF~JyMbW!+n-+>!u=A1ESxzkJy$DRuG+$oioG7(@Et|xVbJ#BCt;J43Nvj@MKvTxzy zMmjNuc#LXBxFAwIGZJk~^!q$*`FME}yKE8d1f5Mp}KHNq(@=Z8YxV}0@;YS~|SpGg$_jG7>_8WWYcVx#4SxpzlV9N4aO>K{c z$P?a_fyDzGX$Of3@ykvedGd<@-R;M^Shlj*SswJLD+j@hi_&_>6WZ}#AYLR0iWMK|A zH_NBeu(tMyG=6VO-=Pb>-Q#$F*or}KmEGg*-n?vWQREURdB#+6AvOj*I%!R-4E_2$ zU5n9m>RWs|Wr;h2DaO&mFBdDb-Z{APGQx$(L`if?C|njd*fC=rTS%{o69U|meRvu?N;Z|Y zbT|ojL>j;q*?xXmnHH#3R4O-59NV1j=uapkK7}6@Wo*^Nd#(;$iuGsb;H315xh3pl zHaJ>h-_$hdNl{+|Zb%DZH%ES;*P*v0#}g|vrKm9;j-9e1M4qX@zkl&5OiwnCz=tb6 zz<6HXD+rGIVpGtkb{Q^LIgExOm zz?I|oO9)!BOLW#krLmWvX5(k!h{i>ots*EhpvAE;06K|u_c~y{#b|UxQ*O@Ks=bca z^_F0a@61j3I(Ziv{xLb8AXQj3;R{f_l6a#H5ukg5rxwF9A$?Qp-Mo54`N-SKc}fWp z0T)-L@V$$&my;l#Ha{O@!fK4-FSA)L&3<${Hcwa7ue`=f&YsXY(NgeDU#sRlT3+9J z6;(^(sjSK@3?oMo$%L-nqy*E;3pb0nZLx6 z;h5)T$y8GXK1DS-F@bGun8|J(v-9o=42&nLJy#}M5D0T^5VWBNn$RpC zZzG6Bt66VY4_?W=PX$DMpKAI!d`INr) zkMB{XPQ<52rvWVQqgI0OL_NWxoe`xxw&X8yVftdODPj5|t}S6*VMqN$-h9)1MBe0N zYq?g0+e8fJCoAksr0af1)FYtz?Me!Cxn`gUx&|T;)695GG6HF7!Kg1zzRf_{VWv^bo81v4$?F6u2g|wxHc6eJQAg&V z#%0DnWm2Rmu71rPJ8#xFUNFC*V{+N_qqFH@gYRLZ6C?GAcVRi>^n3zQxORPG)$-B~ z%_oB?-%Zf7d*Fe;cf%tQwcGv2S?rD$Z&>QC2X^vwYjnr5pa5u#38cHCt4G3|efuci z@3z=#A13`+ztmp;%zjXwPY_aq-;isu*hecWWX_=Z8paSqq7;XYnUjK*T>c4~PR4W7 z#C*%_H&tfGx`Y$w7`dXvVhmovDnT>btmy~SLf>>~84jkoQ%cv=MMb+a{JV&t0+1`I z32g_Y@yDhKe|K^PevP~MiiVl{Ou7^Mt9{lOnXEQ`xY^6L8D$705GON{!1?1&YJEl#fTf5Z)da=yiEQ zGgtC-soFGOEBEB~ZF_{7b(76En>d}mI~XIwNw{e>=Fv)sgcw@qOsykWr?+qAOZSVrQfg}TNI ztKNG)1SRrAt6#Q?(me%)>&A_^DM`pL>J{2xu>xa$3d@90xR61TQDl@fu%_85DuUUA za9tn64?At;{`BAW6oykwntxHeDpXsV#{tmt5RqdN7LtcF4vR~_kZNT|wqyR#z^Xcd zFdymVRZvyLfTpBT>w9<)Ozv@;Yk@dOSVWbbtm^y@@C>?flP^EgQPAwsy75bveo=}T zFxl(f)s)j(0#N_>Or(xEuV(n$M+`#;Pc$1@OjXEJZumkaekVqgP_i}p`oTx;terTx zZpT+0dpUya2hqlf`SpXN{}>PfhajNk_J0`H|2<5E;U5Vh4F8er z;RxLSFgpGhkU>W?IwdW~NZTyOBrQ84H7_?gviIf71l`EETodG9a1!8e{jW?DpwjL? zGEM&eCzwoZt^P*8KHZ$B<%{I}>46IT%jJ3AnnB5P%D2E2Z_ z1M!vr#8r}1|KTqWA4%67ZdbMW2YJ81b(KF&SQ2L1Qn(y-=J${p?xLMx3W7*MK;LFQ z6Z`aU;;mTL4XrrE;HY*Rkh6N%?qviUGNAKiCB~!P}Z->IpO6E(gGd7I#eDuT7j|?nZ zK}I(EJ>$Kb&@338M~O+em9(L!+=0zBR;JAQesx|3?Ok90)D1aS9P?yTh6Poh8Cr4X zk3zc=f2rE7jj+aP7nUsr@~?^EGP>Q>h#NHS?F{Cn`g-gD<8F&dqOh-0sa%pfL`b+1 zUsF*4a~)KGb4te&K0}bE>z3yb8% zibb5Q%Sfiv7feb1r0tfmiMv z@^4XYwg@KZI=;`wC)`1jUA9Kv{HKe2t$WmRcR4y8)VAFjRi zaz&O7Y2tDmc5+SX(bj6yGHYk$dBkWc96u3u&F)2yEE~*i0F%t9Kg^L6MJSb&?wrXi zGSc;_rln$!^ybwYBeacEFRsVGq-&4uC{F)*Y;<0y7~USXswMo>j4?~5%Zm!m@i@-> zXzi82sa-vpU{6MFRktJy+E0j#w`f`>Lbog{zP|9~hg(r{RCa!uGe>Yl536cn$;ouH za#@8XMvS-kddc1`!1LVq;h57~zV`7IYR}pp3u!JtE6Q67 zq3H9ZUcWPm2V4IukS}MCHSdF0qg2@~ufNx9+VMjQP&exiG_u9TZAeAEj*jw($G)zL zq9%#v{wVyOAC4A~AF=dPX|M}MZV)s(qI9@aIK?Pe+~ch|>QYb+78lDF*Nxz2-vpRbtQ*F4$0fDbvNM#CCatgQ@z1+EZWrt z2dZfywXkiW=no5jus-92>gXn5rFQ-COvKyegmL=4+NPzw6o@a?wGE-1Bt;pCHe;34K%Z z-FnOb%!nH;)gX+!a3nCk?5(f1HaWZBMmmC@lc({dUah+E;NOros{?ui1zPC-Q0);w zEbJmdE$oU$AVGQPdm{?xxI_0CKNG$LbY*i?YRQ$(&;NiA#h@DCxC(U@AJ$Yt}}^xt-EC_ z4!;QlLkjvSOhdx!bR~W|Ezmuf6A#@T`2tsjkr>TvW*lFCMY>Na_v8+{Y|=MCu1P8y z89vPiH5+CKcG-5lzk0oY>~aJC_0+4rS@c@ZVKLAp`G-sJB$$)^4*A!B zmcf}lIw|VxV9NSoJ8Ag3CwN&d7`|@>&B|l9G8tXT^BDHOUPrtC70NgwN4${$k~d_4 zJ@eo6%YQnOgq$th?0{h`KnqYa$Nz@vlHw<%!C5du6<*j1nwquk=uY}B8r7f|lY+v7 zm|JU$US08ugor8E$h3wH$c&i~;guC|3-tqJy#T;v(g( zBZtPMSyv%jzf->435yM(-UfyHq_D=6;ouL4!ZoD+xI5uCM5ay2m)RPmm$I}h>()hS zO!0gzMxc`BPkUZ)WXaXam%1;)gedA7SM8~8yIy@6TPg!hR0=T>4$Zxd)j&P-pXeSF z9W`lg6@~YDhd19B9ETv(%er^Xp8Yj@AuFVR_8t*KS;6VHkEDKI#!@l!l3v6`W1`1~ zP{C@keuV4Q`Rjc08lx?zmT$e$!3esc9&$XZf4nRL(Z*@keUbk!GZi(2Bmyq*saOD? z3Q$V<*P-X1p2}aQmuMw9nSMbOzuASsxten7DKd6A@ftZ=NhJ(0IM|Jr<91uAul4JR zADqY^AOVT3a(NIxg|U;fyc#ZnSzw2cr}#a5lZ38>nP{05D)7~ad7JPhw!LqOwATXtRhK!w0X4HgS1i<%AxbFmGJx9?sEURV+S{k~g zGYF$IWSlQonq6}e;B(X(sIH|;52+(LYW}v_gBcp|x%rEAVB`5LXg_d5{Q5tMDu0_2 z|LOm$@K2?lrLNF=mr%YP|U-t)~9bqd+wHb4KuPmNK<}PK6e@aosGZK57=Zt+kcszVOSbe;`E^dN! ze7`ha3WUUU7(nS0{?@!}{0+-VO4A{7+nL~UOPW9_P(6^GL0h${SLtqG!} zKl~Ng5#@Sy?65wk9z*3SA`Dpd4b4T^@C8Fhd8O)k_4%0RZL5?#b~jmgU+0|DB%0Z) zql-cPC>A9HPjdOTpPC` zQwvF}uB5kG$Xr4XnaH#ruSjM*xG?_hT7y3G+8Ox`flzU^QIgb_>2&-f+XB6MDr-na zSi#S+c!ToK84<&m6sCiGTd^8pNdXo+$3^l3FL_E`0 z>8it5YIDxtTp2Tm(?}FX^w{fbfgh7>^8mtvN>9fWgFN_*a1P`Gz*dyOZF{OV7BC#j zQV=FQM5m>47xXgapI$WbPM5V`V<7J9tD)oz@d~MDoM`R^Y6-Na(lO~uvZlpu?;zw6 zVO1faor3dg#JEb5Q*gz4<W8tgC3nE2BG2jeIQs1)<{In&7hJ39x=;ih;CJDy)>0S1at*7n?Wr0ahYCpFjZ|@u91Zl7( zv;CSBRC65-6f+*JPf4p1UZ)k=XivKTX6_bWT~7V#rq0Xjas6hMO!HJN8GdpBKg_$B zwDHJF6;z?h<;GXFZan8W{XFNPpOj!(&I1`&kWO86p?Xz`a$`7qV7Xqev|7nn_lQuX ziGpU1MMYt&5dE2A62iX3;*0WzNB9*nSTzI%62A+N?f?;S>N@8M=|ef3gtQTIA*=yq zQAAjOqa!CkHOQo4?TsqrrsJLclXcP?dlAVv?v`}YUjo1Htt;6djP@NPFH+&p1I+f_ z)Y279{7OWomY8baT(4TAOlz1OyD{4P?(DGv3XyJTA2IXe=kqD)^h(@*E3{I~w;ws8 z)ZWv7E)pbEM zd3MOXRH3mQhks9 zv6{s;k0y5vrcjXaVfw8^>YyPo=oIqd5IGI{)+TZq5Z5O&hXAw%ZlL}^6FugH;-%vP zAaKFtt3i^ag226=f0YjzdPn6|4(C2sC5wHFX{7QF!tG1E-JFA`>eZ`}$ymcRJK?0c zN363o{&ir)QySOFY0vcu6)kX#;l??|7o{HBDVJN+17rt|w3;(C_1b>d;g9Gp=8YVl zYTtA52@!7AUEkTm@P&h#eg+F*lR zQ7iotZTcMR1frJ0*V@Hw__~CL>_~2H2cCtuzYIUD24=Cv!1j6s{QS!v=PzwQ(a0HS zBKx04KA}-Ue+%9d`?PG*hIij@54RDSQpA7|>qYVIrK_G6%6;#ZkR}NjUgmGju)2F`>|WJoljo)DJgZr4eo1k1i1+o z1D{>^RlpIY8OUaOEf5EBu%a&~c5aWnqM zxBpJq98f=%M^{4mm~5`CWl%)nFR64U{(chmST&2jp+-r z3675V<;Qi-kJud%oWnCLdaU-)xTnMM%rx%Jw6v@=J|Ir=4n-1Z23r-EVf91CGMGNz zb~wyv4V{H-hkr3j3WbGnComiqmS0vn?n?5v2`Vi>{Ip3OZUEPN7N8XeUtF)Ry6>y> zvn0BTLCiqGroFu|m2zG-;Xb6;W`UyLw)@v}H&(M}XCEVXZQoWF=Ykr5lX3XWwyNyF z#jHv)A*L~2BZ4lX?AlN3X#axMwOC)PoVy^6lCGse9bkGjb=qz%kDa6}MOmSwK`cVO zt(e*MW-x}XtU?GY5}9{MKhRhYOlLhJE5=ca+-RmO04^ z66z{40J=s=ey9OCdc(RCzy zd7Zr1%!y3}MG(D=wM_ebhXnJ@MLi7cImDkhm0y{d-Vm81j`0mbi4lF=eirlr)oW~a zCd?26&j^m4AeXEsIUXiTal)+SPM4)HX%%YWF1?(FV47BaA`h9m67S9x>hWMVHx~Hg z1meUYoLL(p@b3?x|9DgWeI|AJ`Ia84*P{Mb%H$ZRROouR4wZhOPX15=KiBMHl!^JnCt$Az`KiH^_d>cev&f zaG2>cWf$=A@&GP~DubsgYb|L~o)cn5h%2`i^!2)bzOTw2UR!>q5^r&2Vy}JaWFUQE04v>2;Z@ZPwXr?y&G(B^@&y zsd6kC=hHdKV>!NDLIj+3rgZJ|dF`%N$DNd;B)9BbiT9Ju^Wt%%u}SvfM^=|q-nxDG zuWCQG9e#~Q5cyf8@y76#kkR^}{c<_KnZ0QsZcAT|YLRo~&tU|N@BjxOuy`#>`X~Q< z?R?-Gsk$$!oo(BveQLlUrcL#eirhgBLh`qHEMg`+sR1`A=1QX7)ZLMRT+GBy?&mM8 zQG^z-!Oa&J-k7I(3_2#Q6Bg=NX<|@X&+YMIOzfEO2$6Mnh}YV!m!e^__{W@-CTprr zbdh3f=BeCD$gHwCrmwgM3LAv3!Mh$wM)~KWzp^w)Cu6roO7uUG5z*}i0_0j47}pK; ztN530`ScGatLOL06~zO)Qmuv`h!gq5l#wx(EliKe&rz-5qH(hb1*fB#B+q`9=jLp@ zOa2)>JTl7ovxMbrif`Xe9;+fqB1K#l=Dv!iT;xF zdkCvS>C5q|O;}ns3AgoE({Ua-zNT-9_5|P0iANmC6O76Sq_(AN?UeEQJ>#b54fi3k zFmh+P%b1x3^)0M;QxXLP!BZ^h|AhOde*{9A=f3|Xq*JAs^Y{eViF|=EBfS6L%k4ip zk+7M$gEKI3?bQg?H3zaE@;cyv9kv;cqK$VxQbFEsy^iM{XXW0@2|DOu$!-k zSFl}Y=jt-VaT>Cx*KQnHTyXt}f9XswFB9ibYh+k2J!ofO+nD?1iw@mwtrqI4_i?nE zhLkPp41ED62me}J<`3RN80#vjW;wt`pP?%oQ!oqy7`miL>d-35a=qotK$p{IzeSk# ze_$CFYp_zIkrPFVaW^s#U4xT1lI^A0IBe~Y<4uS%zSV=wcuLr%gQT=&5$&K*bwqx| zWzCMiz>7t^Et@9CRUm9E+@hy~sBpm9fri$sE1zgLU((1?Yg{N1Sars=DiW&~Zw=3I zi7y)&oTC?UWD2w97xQ&5vx zRXEBGeJ(I?Y}eR0_O{$~)bMJRTsNUPIfR!xU9PE7A>AMNr_wbrFK>&vVw=Y;RH zO$mlpmMsQ}-FQ2cSj7s7GpC+~^Q~dC?y>M}%!-3kq(F3hGWo9B-Gn02AwUgJ>Z-pKOaj zysJBQx{1>Va=*e@sLb2z&RmQ7ira;aBijM-xQ&cpR>X3wP^foXM~u1>sv9xOjzZpX z0K;EGouSYD~oQ&lAafj3~EaXfFShC+>VsRlEMa9cg9i zFxhCKO}K0ax6g4@DEA?dg{mo>s+~RPI^ybb^u--^nTF>**0l5R9pocwB?_K)BG_)S zyLb&k%XZhBVr7U$wlhMqwL)_r&&n%*N$}~qijbkfM|dIWP{MyLx}X&}ES?}7i;9bW zmTVK@zR)7kE2+L42Q`n4m0VVg5l5(W`SC9HsfrLZ=v%lpef=Gj)W59VTLe+Z$8T8i z4V%5+T0t8LnM&H>Rsm5C%qpWBFqgTwL{=_4mE{S3EnBXknM&u8n}A^IIM4$s3m(Rd z>zq=CP-!9p9es2C*)_hoL@tDYABn+o#*l;6@7;knWIyDrt5EuakO99S$}n((Fj4y} zD!VvuRzghcE{!s;jC*<_H$y6!6QpePo2A3ZbX*ZzRnQq*b%KK^NF^z96CHaWmzU@f z#j;y?X=UP&+YS3kZx7;{ zDA{9(wfz7GF`1A6iB6fnXu0?&d|^p|6)%3$aG0Uor~8o? z*e}u#qz7Ri?8Uxp4m_u{a@%bztvz-BzewR6bh*1Xp+G=tQGpcy|4V_&*aOqu|32CM zz3r*E8o8SNea2hYJpLQ-_}R&M9^%@AMx&`1H8aDx4j%-gE+baf2+9zI*+Pmt+v{39 zDZ3Ix_vPYSc;Y;yn68kW4CG>PE5RoaV0n@#eVmk?p$u&Fy&KDTy!f^Hy6&^-H*)#u zdrSCTJPJw?(hLf56%2;_3n|ujUSJOU8VPOTlDULwt0jS@j^t1WS z!n7dZIoT+|O9hFUUMbID4Ec$!cc($DuQWkocVRcYSikFeM&RZ=?BW)mG4?fh#)KVG zcJ!<=-8{&MdE)+}?C8s{k@l49I|Zwswy^ZN3;E!FKyglY~Aq?4m74P-0)sMTGXqd5(S<-(DjjM z&7dL-Mr8jhUCAG$5^mI<|%`;JI5FVUnNj!VO2?Jiqa|c2;4^n!R z`5KK0hyB*F4w%cJ@Un6GC{mY&r%g`OX|1w2$B7wxu97%<@~9>NlXYd9RMF2UM>(z0 zouu4*+u+1*k;+nFPk%ly!nuMBgH4sL5Z`@Rok&?Ef=JrTmvBAS1h?C0)ty5+yEFRz zY$G=coQtNmT@1O5uk#_MQM1&bPPnspy5#>=_7%WcEL*n$;sSAZcXxMpcXxLe;_mLA z5F_paad+bGZV*oh@8h0(|D2P!q# zTHjmiphJ=AazSeKQPkGOR-D8``LjzToyx{lfK-1CDD6M7?pMZOdLKFtjZaZMPk4}k zW)97Fh(Z+_Fqv(Q_CMH-YYi?fR5fBnz7KOt0*t^cxmDoIokc=+`o# zrud|^h_?KW=Gv%byo~(Ln@({?3gnd?DUf-j2J}|$Mk>mOB+1{ZQ8HgY#SA8END(Zw z3T+W)a&;OO54~m}ffemh^oZ!Vv;!O&yhL0~hs(p^(Yv=(3c+PzPXlS5W79Er8B1o* z`c`NyS{Zj_mKChj+q=w)B}K za*zzPhs?c^`EQ;keH{-OXdXJet1EsQ)7;{3eF!-t^4_Srg4(Ot7M*E~91gwnfhqaM zNR7dFaWm7MlDYWS*m}CH${o?+YgHiPC|4?X?`vV+ws&Hf1ZO-w@OGG^o4|`b{bLZj z&9l=aA-Y(L11!EvRjc3Zpxk7lc@yH1e$a}8$_-r$)5++`_eUr1+dTb@ zU~2P1HM#W8qiNN3b*=f+FfG1!rFxnNlGx{15}BTIHgxO>Cq4 z;#9H9YjH%>Z2frJDJ8=xq>Z@H%GxXosS@Z>cY9ppF+)e~t_hWXYlrO6)0p7NBMa`+ z^L>-#GTh;k_XnE)Cgy|0Dw;(c0* zSzW14ZXozu)|I@5mRFF1eO%JM=f~R1dkNpZM+Jh(?&Zje3NgM{2ezg1N`AQg5%+3Y z64PZ0rPq6;_)Pj-hyIOgH_Gh`1$j1!jhml7ksHA1`CH3FDKiHLz+~=^u@kUM{ilI5 z^FPiJ7mSrzBs9{HXi2{sFhl5AyqwUnU{sPcUD{3+l-ZHAQ)C;c$=g1bdoxeG(5N01 zZy=t8i{*w9m?Y>V;uE&Uy~iY{pY4AV3_N;RL_jT_QtLFx^KjcUy~q9KcLE3$QJ{!)@$@En{UGG7&}lc*5Kuc^780;7Bj;)X?1CSy*^^ zPP^M)Pr5R>mvp3_hmCtS?5;W^e@5BjE>Cs<`lHDxj<|gtOK4De?Sf0YuK5GX9G93i zMYB{8X|hw|T6HqCf7Cv&r8A$S@AcgG1cF&iJ5=%+x;3yB`!lQ}2Hr(DE8=LuNb~Vs z=FO&2pdc16nD$1QL7j+!U^XWTI?2qQKt3H8=beVTdHHa9=MiJ&tM1RRQ-=+vy!~iz zj3O{pyRhCQ+b(>jC*H)J)%Wq}p>;?@W*Eut@P&?VU+Sdw^4kE8lvX|6czf{l*~L;J zFm*V~UC;3oQY(ytD|D*%*uVrBB}BbAfjK&%S;z;7$w68(8PV_whC~yvkZmX)xD^s6 z{$1Q}q;99W?*YkD2*;)tRCS{q2s@JzlO~<8x9}X<0?hCD5vpydvOw#Z$2;$@cZkYrp83J0PsS~!CFtY%BP=yxG?<@#{7%2sy zOc&^FJxsUYN36kSY)d7W=*1-{7ghPAQAXwT7z+NlESlkUH&8ODlpc8iC*iQ^MAe(B z?*xO4i{zFz^G=^G#9MsLKIN64rRJykiuIVX5~0#vAyDWc9-=6BDNT_aggS2G{B>dD ze-B%d3b6iCfc5{@yz$>=@1kdK^tX9qh0=ocv@9$ai``a_ofxT=>X7_Y0`X}a^M?d# z%EG)4@`^Ej_=%0_J-{ga!gFtji_byY&Vk@T1c|ucNAr(JNr@)nCWj?QnCyvXg&?FW;S-VOmNL6^km_dqiVjJuIASVGSFEos@EVF7St$WE&Z%)`Q##+0 zjaZ=JI1G@0!?l|^+-ZrNd$WrHBi)DA0-Eke>dp=_XpV<%CO_Wf5kQx}5e<90dt>8k zAi00d0rQ821nA>B4JHN7U8Zz=0;9&U6LOTKOaC1FC8GgO&kc=_wHIOGycL@c*$`ce703t%>S}mvxEnD-V!;6c`2(p74V7D0No1Xxt`urE66$0(ThaAZ1YVG#QP$ zy~NN%kB*zhZ2Y!kjn826pw4bh)75*e!dse+2Db(;bN34Uq7bLpr47XTX{8UEeC?2i z*{$`3dP}32${8pF$!$2Vq^gY|#w+VA_|o(oWmQX8^iw#n_crb(K3{69*iU?<%C-%H zuKi)3M1BhJ@3VW>JA`M>L~5*_bxH@Euy@niFrI$82C1}fwR$p2E&ZYnu?jlS}u7W9AyfdXh2pM>78bIt3 z)JBh&XE@zA!kyCDfvZ1qN^np20c1u#%P6;6tU&dx0phT1l=(mw7`u!-0e=PxEjDds z9E}{E!7f9>jaCQhw)&2TtG-qiD)lD(4jQ!q{`x|8l&nmtHkdul# zy+CIF8lKbp9_w{;oR+jSLtTfE+B@tOd6h=QePP>rh4@~!8c;Hlg9m%%&?e`*Z?qz5-zLEWfi>`ord5uHF-s{^bexKAoMEV@9nU z^5nA{f{dW&g$)BAGfkq@r5D)jr%!Ven~Q58c!Kr;*Li#`4Bu_?BU0`Y`nVQGhNZk@ z!>Yr$+nB=`z#o2nR0)V3M7-eVLuY`z@6CT#OTUXKnxZn$fNLPv7w1y7eGE=Qv@Hey`n;`U=xEl|q@CCV^#l)s0ZfT+mUf z^(j5r4)L5i2jnHW4+!6Si3q_LdOLQi<^fu?6WdohIkn79=jf%Fs3JkeXwF(?_tcF? z?z#j6iXEd(wJy4|p6v?xNk-)iIf2oX5^^Y3q3ziw16p9C6B;{COXul%)`>nuUoM*q zzmr|NJ5n)+sF$!yH5zwp=iM1#ZR`O%L83tyog-qh1I z0%dcj{NUs?{myT~33H^(%0QOM>-$hGFeP;U$puxoJ>>o-%Lk*8X^rx1>j|LtH$*)>1C!Pv&gd16%`qw5LdOIUbkNhaBBTo}5iuE%K&ZV^ zAr_)kkeNKNYJRgjsR%vexa~&8qMrQYY}+RbZ)egRg9_$vkoyV|Nc&MH@8L)`&rpqd zXnVaI@~A;Z^c3+{x=xgdhnocA&OP6^rr@rTvCnhG6^tMox$ulw2U7NgUtW%|-5VeH z_qyd47}1?IbuKtqNbNx$HR`*+9o=8`%vM8&SIKbkX9&%TS++x z5|&6P<%=F$C?owUI`%uvUq^yW0>`>yz!|WjzsoB9dT;2Dx8iSuK%%_XPgy0dTD4kd zDXF@&O_vBVVKQq(9YTClUPM30Sk7B!v7nOyV`XC!BA;BIVwphh+c)?5VJ^(C;GoQ$ zvBxr7_p*k$T%I1ke}`U&)$uf}I_T~#3XTi53OX)PoXVgxEcLJgZG^i47U&>LY(l%_ z;9vVDEtuMCyu2fqZeez|RbbIE7@)UtJvgAcVwVZNLccswxm+*L&w`&t=ttT=sv6Aq z!HouSc-24Y9;0q$>jX<1DnnGmAsP))- z^F~o99gHZw`S&Aw7e4id6Lg7kMk-e)B~=tZ!kE7sGTOJ)8@q}np@j7&7Sy{2`D^FH zI7aX%06vKsfJ168QnCM2=l|i>{I{%@gcr>ExM0Dw{PX6ozEuqFYEt z087%MKC;wVsMV}kIiuu9Zz9~H!21d!;Cu#b;hMDIP7nw3xSX~#?5#SSjyyg+Y@xh| z%(~fv3`0j#5CA2D8!M2TrG=8{%>YFr(j)I0DYlcz(2~92?G*?DeuoadkcjmZszH5& zKI@Lis%;RPJ8mNsbrxH@?J8Y2LaVjUIhRUiO-oqjy<&{2X~*f|)YxnUc6OU&5iac= z*^0qwD~L%FKiPmlzi&~a*9sk2$u<7Al=_`Ox^o2*kEv?p`#G(p(&i|ot8}T;8KLk- zPVf_4A9R`5^e`Om2LV*cK59EshYXse&IoByj}4WZaBomoHAPKqxRKbPcD`lMBI)g- zeMRY{gFaUuecSD6q!+b5(?vAnf>c`Z(8@RJy%Ulf?W~xB1dFAjw?CjSn$ph>st5bc zUac1aD_m6{l|$#g_v6;=32(mwpveQDWhmjR7{|B=$oBhz`7_g7qNp)n20|^^op3 zSfTdWV#Q>cb{CMKlWk91^;mHap{mk)o?udk$^Q^^u@&jd zfZ;)saW6{e*yoL6#0}oVPb2!}r{pAUYtn4{P~ES9tTfC5hXZnM{HrC8^=Pof{G4%Bh#8 ze~?C9m*|fd8MK;{L^!+wMy>=f^8b&y?yr6KnTq28$pFMBW9Oy7!oV5z|VM$s-cZ{I|Xf@}-)1=$V&x7e;9v81eiTi4O5-vs?^5pCKy2l>q);!MA zS!}M48l$scB~+Umz}7NbwyTn=rqt@`YtuwiQSMvCMFk2$83k50Q>OK5&fe*xCddIm)3D0I6vBU<+!3=6?(OhkO|b4fE_-j zimOzyfBB_*7*p8AmZi~X2bgVhyPy>KyGLAnOpou~sx9)S9%r)5dE%ADs4v%fFybDa_w*0?+>PsEHTbhKK^G=pFz z@IxLTCROWiKy*)cV3y%0FwrDvf53Ob_XuA1#tHbyn%Ko!1D#sdhBo`;VC*e1YlhrC z?*y3rp86m#qI|qeo8)_xH*G4q@70aXN|SP+6MQ!fJQqo1kwO_v7zqvUfU=Gwx`CR@ zRFb*O8+54%_8tS(ADh}-hUJzE`s*8wLI>1c4b@$al)l}^%GuIXjzBK!EWFO8W`>F^ ze7y#qPS0NI7*aU)g$_ziF(1ft;2<}6Hfz10cR8P}67FD=+}MfhrpOkF3hFhQu;Q1y zu%=jJHTr;0;oC94Hi@LAF5quAQ(rJG(uo%BiRQ@8U;nhX)j0i?0SL2g-A*YeAqF>RVCBOTrn{0R27vu}_S zS>tX4!#&U4W;ikTE!eFH+PKw%p+B(MR2I%n#+m0{#?qRP_tR@zpgCb=4rcrL!F=;A zh%EIF8m6%JG+qb&mEfuFTLHSxUAZEvC-+kvZKyX~SA3Umt`k}}c!5dy?-sLIM{h@> z!2=C)@nx>`;c9DdwZ&zeUc(7t<21D7qBj!|1^Mp1eZ6)PuvHx+poKSDCSBMFF{bKy z;9*&EyKitD99N}%mK8431rvbT+^%|O|HV23{;RhmS{$5tf!bIPoH9RKps`-EtoW5h zo6H_!s)Dl}2gCeGF6>aZtah9iLuGd19^z0*OryPNt{70RvJSM<#Ox9?HxGg04}b^f zrVEPceD%)#0)v5$YDE?f`73bQ6TA6wV;b^x*u2Ofe|S}+q{s5gr&m~4qGd!wOu|cZ||#h_u=k*fB;R6&k?FoM+c&J;ISg70h!J7*xGus)ta4veTdW)S^@sU@ z4$OBS=a~@F*V0ECic;ht4@?Jw<9kpjBgHfr2FDPykCCz|v2)`JxTH55?b3IM={@DU z!^|9nVO-R#s{`VHypWyH0%cs;0GO3E;It6W@0gX6wZ%W|Dzz&O%m17pa19db(er}C zUId1a4#I+Ou8E1MU$g=zo%g7K(=0Pn$)Rk z<4T2u<0rD)*j+tcy2XvY+0 z0d2pqm4)4lDewsAGThQi{2Kc3&C=|OQF!vOd#WB_`4gG3@inh-4>BoL!&#ij8bw7? zqjFRDaQz!J-YGitV4}$*$hg`vv%N)@#UdzHFI2E<&_@0Uw@h_ZHf}7)G;_NUD3@18 zH5;EtugNT0*RXVK*by>WS>jaDDfe!A61Da=VpIK?mcp^W?!1S2oah^wowRnrYjl~`lgP-mv$?yb6{{S55CCu{R z$9;`dyf0Y>uM1=XSl_$01Lc1Iy68IosWN8Q9Op=~I(F<0+_kKfgC*JggjxNgK6 z-3gQm6;sm?J&;bYe&(dx4BEjvq}b`OT^RqF$J4enP1YkeBK#>l1@-K`ajbn05`0J?0daOtnzh@l3^=BkedW1EahZlRp;`j*CaT;-21&f2wU z+Nh-gc4I36Cw+;3UAc<%ySb`#+c@5y ze~en&bYV|kn?Cn|@fqmGxgfz}U!98$=drjAkMi`43I4R%&H0GKEgx-=7PF}y`+j>r zg&JF`jomnu2G{%QV~Gf_-1gx<3Ky=Md9Q3VnK=;;u0lyTBCuf^aUi?+1+`4lLE6ZK zT#(Bf`5rmr(tgTbIt?yA@y`(Ar=f>-aZ}T~>G32EM%XyFvhn&@PWCm#-<&ApLDCXT zD#(9m|V(OOo7PmE@`vD4$S5;+9IQm19dd zvMEU`)E1_F+0o0-z>YCWqg0u8ciIknU#{q02{~YX)gc_u;8;i233D66pf(IkTDxeN zL=4z2)?S$TV9=ORVr&AkZMl<4tTh(v;Ix1{`pPVqI3n2ci&4Dg+W|N8TBUfZ*WeLF zqCH_1Q0W&f9T$lx3CFJ$o@Lz$99 zW!G&@zFHxTaP!o#z^~xgF|(vrHz8R_r9eo;TX9}2ZyjslrtH=%6O)?1?cL&BT(Amp zTGFU1%%#xl&6sH-UIJk_PGk_McFn7=%yd6tAjm|lnmr8bE2le3I~L{0(ffo}TQjyo zHZZI{-}{E4ohYTlZaS$blB!h$Jq^Rf#(ch}@S+Ww&$b);8+>g84IJcLU%B-W?+IY& zslcZIR>+U4v3O9RFEW;8NpCM0w1ROG84=WpKxQ^R`{=0MZCubg3st z48AyJNEvyxn-jCPTlTwp4EKvyEwD3e%kpdY?^BH0!3n6Eb57_L%J1=a*3>|k68A}v zaW`*4YitylfD}ua8V)vb79)N_Ixw_mpp}yJGbNu+5YYOP9K-7nf*jA1#<^rb4#AcS zKg%zCI)7cotx}L&J8Bqo8O1b0q;B1J#B5N5Z$Zq=wX~nQFgUfAE{@u0+EnmK{1hg> zC{vMfFLD;L8b4L+B51&LCm|scVLPe6h02rws@kGv@R+#IqE8>Xn8i|vRq_Z`V;x6F zNeot$1Zsu`lLS92QlLWF54za6vOEKGYQMdX($0JN*cjG7HP&qZ#3+bEN$8O_PfeAb z0R5;=zXac2IZ?fxu59?Nka;1lKm|;0)6|#RxkD05P5qz;*AL@ig!+f=lW5^Jbag%2 z%9@iM0ph$WFlxS!`p31t92z~TB}P-*CS+1Oo_g;7`6k(Jyj8m8U|Q3Sh7o-Icp4kV zK}%qri5>?%IPfamXIZ8pXbm-#{ytiam<{a5A+3dVP^xz!Pvirsq7Btv?*d7eYgx7q zWFxrzb3-%^lDgMc=Vl7^={=VDEKabTG?VWqOngE`Kt7hs236QKidsoeeUQ_^FzsXjprCDd@pW25rNx#6x&L6ZEpoX9Ffzv@olnH3rGOSW( zG-D|cV0Q~qJ>-L}NIyT?T-+x+wU%;+_GY{>t(l9dI%Ximm+Kmwhee;FK$%{dnF;C% zFjM2&$W68Sz#d*wtfX?*WIOXwT;P6NUw}IHdk|)fw*YnGa0rHx#paG!m=Y6GkS4VX zX`T$4eW9k1W!=q8!(#8A9h67fw))k_G)Q9~Q1e3f`aV@kbcSv7!priDUN}gX(iXTy zr$|kU0Vn%*ylmyDCO&G0Z3g>%JeEPFAW!5*H2Ydl>39w3W+gEUjL&vrRs(xGP{(ze zy7EMWF14@Qh>X>st8_029||TP0>7SG9on_xxeR2Iam3G~Em$}aGsNt$iES9zFa<3W zxtOF*!G@=PhfHO!=9pVPXMUVi30WmkPoy$02w}&6A7mF)G6-`~EVq5CwD2`9Zu`kd)52``#V zNSb`9dG~8(dooi1*-aSMf!fun7Sc`-C$-E(3BoSC$2kKrVcI!&yC*+ff2+C-@!AT_ zsvlAIV+%bRDfd{R*TMF><1&_a%@yZ0G0lg2K;F>7b+7A6pv3-S7qWIgx+Z?dt8}|S z>Qbb6x(+^aoV7FQ!Ph8|RUA6vXWQH*1$GJC+wXLXizNIc9p2yLzw9 z0=MdQ!{NnOwIICJc8!+Jp!zG}**r#E!<}&Te&}|B4q;U57$+pQI^}{qj669zMMe_I z&z0uUCqG%YwtUc8HVN7?0GHpu=bL7&{C>hcd5d(iFV{I5c~jpX&!(a{yS*4MEoYXh z*X4|Y@RVfn;piRm-C%b@{0R;aXrjBtvx^HO;6(>i*RnoG0Rtcd25BT6edxTNOgUAOjn zJ2)l{ipj8IP$KID2}*#F=M%^n&=bA0tY98@+2I+7~A&T-tw%W#3GV>GTmkHaqftl)#+E zMU*P(Rjo>8%P@_@#UNq(_L{}j(&-@1iY0TRizhiATJrnvwSH0v>lYfCI2ex^><3$q znzZgpW0JlQx?JB#0^^s-Js1}}wKh6f>(e%NrMwS`Q(FhazkZb|uyB@d%_9)_xb$6T zS*#-Bn)9gmobhAtvBmL+9H-+0_0US?g6^TOvE8f3v=z3o%NcPjOaf{5EMRnn(_z8- z$|m0D$FTU zDy;21v-#0i)9%_bZ7eo6B9@Q@&XprR&oKl4m>zIj-fiRy4Dqy@VVVs?rscG| zmzaDQ%>AQTi<^vYCmv#KOTd@l7#2VIpsj?nm_WfRZzJako`^uU%Nt3e;cU*y*|$7W zLm%fX#i_*HoUXu!NI$ey>BA<5HQB=|nRAwK!$L#n-Qz;~`zACig0PhAq#^5QS<8L2 zS3A+8%vbVMa7LOtTEM?55apt(DcWh#L}R^P2AY*c8B}Cx=6OFAdMPj1f>k3#^#+Hk z6uW1WJW&RlBRh*1DLb7mJ+KO>!t^t8hX1#_Wk`gjDio9)9IGbyCAGI4DJ~orK+YRv znjxRMtshZQHc$#Y-<-JOV6g^Cr@odj&Xw5B(FmI)*qJ9NHmIz_r{t)TxyB`L-%q5l ztzHgD;S6cw?7Atg*6E1!c6*gPRCb%t7D%z<(xm+K{%EJNiI2N0l8ud0Ch@_av_RW? zIr!nO4dL5466WslE6MsfMss7<)-S!e)2@r2o=7_W)OO`~CwklRWzHTfpB)_HYwgz=BzLhgZ9S<{nLBOwOIgJU=94uj6r!m>Xyn9>&xP+=5!zG_*yEoRgM0`aYts z^)&8(>z5C-QQ*o_s(8E4*?AX#S^0)aqB)OTyX>4BMy8h(cHjA8ji1PRlox@jB*1n? zDIfyDjzeg91Ao(;Q;KE@zei$}>EnrF6I}q&Xd=~&$WdDsyH0H7fJX|E+O~%LS*7^Q zYzZ4`pBdY{b7u72gZm6^5~O-57HwzwAz{)NvVaowo`X02tL3PpgLjwA`^i9F^vSpN zAqH3mRjG8VeJNHZ(1{%!XqC+)Z%D}58Qel{_weSEHoygT9pN@i zi=G;!Vj6XQk2tuJC>lza%ywz|`f7TIz*EN2Gdt!s199Dr4Tfd_%~fu8gXo~|ogt5Q zlEy_CXEe^BgsYM^o@L?s33WM14}7^T(kqohOX_iN@U?u;$l|rAvn{rwy>!yfZw13U zB@X9)qt&4;(C6dP?yRsoTMI!j-f1KC!<%~i1}u7yLXYn)(#a;Z6~r>hp~kfP));mi zcG%kdaB9H)z9M=H!f>kM->fTjRVOELNwh1amgKQT=I8J66kI)u_?0@$$~5f`u%;zl zC?pkr^p2Fe=J~WK%4ItSzKA+QHqJ@~m|Cduv=Q&-P8I5rQ-#G@bYH}YJr zUS(~(w|vKyU(T(*py}jTUp%I%{2!W!K(i$uvotcPjVddW z8_5HKY!oBCwGZcs-q`4Yt`Zk~>K?mcxg51wkZlX5e#B08I75F7#dgn5yf&Hrp`*%$ zQ;_Qg>TYRzBe$x=T(@WI9SC!ReSas9vDm(yslQjBJZde5z8GDU``r|N(MHcxNopGr z_}u39W_zwWDL*XYYt>#Xo!9kL#97|EAGyGBcRXtLTd59x%m=3i zL^9joWYA)HfL15l9%H?q`$mY27!<9$7GH(kxb%MV>`}hR4a?+*LH6aR{dzrX@?6X4 z3e`9L;cjqYb`cJmophbm(OX0b)!AFG?5`c#zLagzMW~o)?-!@e80lvk!p#&CD8u5_r&wp4O0zQ>y!k5U$h_K;rWGk=U)zX!#@Q%|9g*A zWx)qS1?fq6X<$mQTB$#3g;;5tHOYuAh;YKSBz%il3Ui6fPRv#v62SsrCdMRTav)Sg zTq1WOu&@v$Ey;@^+_!)cf|w_X<@RC>!=~+A1-65O0bOFYiH-)abINwZvFB;hJjL_$ z(9iScmUdMp2O$WW!520Hd0Q^Yj?DK%YgJD^ez$Z^?@9@Ab-=KgW@n8nC&88)TDC+E zlJM)L3r+ZJfZW_T$;Imq*#2<(j+FIk8ls7)WJ6CjUu#r5PoXxQs4b)mZza<8=v{o)VlLRM<9yw^0En#tXAj`Sylxvki{<1DPe^ zhjHwx^;c8tb?Vr$6ZB;$Ff$+3(*oinbwpN-#F)bTsXq@Sm?43MC#jQ~`F|twI=7oC zH4TJtu#;ngRA|Y~w5N=UfMZi?s0%ZmKUFTAye&6Y*y-%c1oD3yQ%IF2q2385Zl+=> zfz=o`Bedy|U;oxbyb^rB9ixG{Gb-{h$U0hVe`J;{ql!s_OJ_>>eoQn(G6h7+b^P48 zG<=Wg2;xGD-+d@UMZ!c;0>#3nws$9kIDkK13IfloGT@s14AY>&>>^#>`PT7GV$2Hp zN<{bN*ztlZu_%W=&3+=#3bE(mka6VoHEs~0BjZ$+=0`a@R$iaW)6>wp2w)=v2@|2d z%?34!+iOc5S@;AAC4hELWLH56RGxo4jw8MDMU0Wk2k_G}=Vo(>eRFo(g3@HjG|`H3 zm8b*dK=moM*oB<)*A$M9!!5o~4U``e)wxavm@O_R(`P|u%9^LGi(_%IF<6o;NLp*0 zKsfZ0#24GT8(G`i4UvoMh$^;kOhl?`0yNiyrC#HJH=tqOH^T_d<2Z+ zeN>Y9Zn!X4*DMCK^o75Zk2621bdmV7Rx@AX^alBG4%~;G_vUoxhfhFRlR&+3WwF^T zaL)8xPq|wCZoNT^>3J0K?e{J-kl+hu2rZI>CUv#-z&u@`hjeb+bBZ>bcciQVZ{SbW zez04s9oFEgc8Z+Kp{XFX`MVf-s&w9*dx7wLen(_@y34}Qz@&`$2+osqfxz4&d}{Ql z*g1ag00Gu+$C`0avds{Q65BfGsu9`_`dML*rX~hyWIe$T>CsPRoLIr%MTk3pJ^2zH1qub1MBzPG}PO;Wmav9w%F7?%l=xIf#LlP`! z_Nw;xBQY9anH5-c8A4mME}?{iewjz(Sq-29r{fV;Fc>fv%0!W@(+{={Xl-sJ6aMoc z)9Q+$bchoTGTyWU_oI19!)bD=IG&OImfy;VxNXoIO2hYEfO~MkE#IXTK(~?Z&!ae! zl8z{D&2PC$Q*OBC(rS~-*-GHNJ6AC$@eve>LB@Iq;jbBZj`wk4|LGogE||Ie=M5g= z9d`uYQ1^Sr_q2wmZE>w2WG)!F%^KiqyaDtIAct?}D~JP4shTJy5Bg+-(EA8aXaxbd~BKMtTf2iQ69jD1o* zZF9*S3!v-TdqwK$%&?91Sh2=e63;X0Lci@n7y3XOu2ofyL9^-I767eHESAq{m+@*r zbVDx!FQ|AjT;!bYsXv8ilQjy~Chiu&HNhFXt3R_6kMC8~ChEFqG@MWu#1Q1#=~#ix zrkHpJre_?#r=N0wv`-7cHHqU`phJX2M_^{H0~{VP79Dv{6YP)oA1&TSfKPEPZn2)G z9o{U1huZBLL;Tp_0OYw@+9z(jkrwIGdUrOhKJUbwy?WBt zlIK)*K0lQCY0qZ!$%1?3A#-S70F#YyUnmJF*`xx?aH5;gE5pe-15w)EB#nuf6B*c~ z8Z25NtY%6Wlb)bUA$w%HKs5$!Z*W?YKV-lE0@w^{4vw;J>=rn?u!rv$&eM+rpU6rc=j9>N2Op+C{D^mospMCjF2ZGhe4eADA#skp2EA26%p3Ex9wHW8l&Y@HX z$Qv)mHM}4*@M*#*ll5^hE9M^=q~eyWEai*P;4z<9ZYy!SlNE5nlc7gm;M&Q zKhKE4d*%A>^m0R?{N}y|i6i^k>^n4(wzKvlQeHq{l&JuFD~sTsdhs`(?lFK@Q{pU~ zb!M3c@*3IwN1RUOVjY5>uT+s-2QLWY z4T2>fiSn>>Fob+%B868-v9D@AfWr#M8eM6w#eAlhc#zk6jkLxGBGk`E3$!A@*am!R zy>29&ptYK6>cvP`b!syNp)Q$0UOW|-O@)8!?94GOYF_}+zlW%fCEl|Tep_zx05g6q z>tp47e-&R*hSNe{6{H!mL?+j$c^TXT{C&@T-xIaesNCl05 z9SLb@q&mSb)I{VXMaiWa3PWj=Ed!>*GwUe;^|uk=Pz$njNnfFY^MM>E?zqhf6^{}0 zx&~~dA5#}1ig~7HvOQ#;d9JZBeEQ+}-~v$at`m!(ai z$w(H&mWCC~;PQ1$%iuz3`>dWeb3_p}X>L2LK%2l59Tyc}4m0>9A!8rhoU3m>i2+hl zx?*qs*c^j}+WPs>&v1%1Ko8_ivAGIn@QK7A`hDz-Emkcgv2@wTbYhkiwX2l=xz*XG zaiNg+j4F-I>9v+LjosI-QECrtKjp&0T@xIMKVr+&)gyb4@b3y?2CA?=ooN zT#;rU86WLh(e@#mF*rk(NV-qSIZyr z$6!ZUmzD)%yO-ot`rw3rp6?*_l*@Z*IB0xn4|BGPWHNc-1ZUnNSMWmDh=EzWJRP`) zl%d%J613oXzh5;VY^XWJi{lB`f#u+ThvtP7 zq(HK<4>tw(=yzSBWtYO}XI`S1pMBe3!jFxBHIuwJ(@%zdQFi1Q_hU2eDuHqXte7Ki zOV55H2D6u#4oTfr7|u*3p75KF&jaLEDpxk!4*bhPc%mpfj)Us3XIG3 zIKMX^s^1wt8YK7Ky^UOG=w!o5e7W-<&c|fw2{;Q11vm@J{)@N3-p1U>!0~sKWHaL= zWV(0}1IIyt1p%=_-Fe5Kfzc71wg}`RDDntVZv;4!=&XXF-$48jS0Sc;eDy@Sg;+{A zFStc{dXT}kcIjMXb4F7MbX~2%i;UrBxm%qmLKb|2=?uPr00-$MEUIGR5+JG2l2Nq` zkM{{1RO_R)+8oQ6x&-^kCj)W8Z}TJjS*Wm4>hf+4#VJP)OBaDF%3pms7DclusBUw} z{ND#!*I6h85g6DzNvdAmnwWY{&+!KZM4DGzeHI?MR@+~|su0{y-5-nICz_MIT_#FE zm<5f3zlaKq!XyvY3H`9s&T};z!cK}G%;~!rpzk9-6L}4Rg7vXtKFsl}@sT#U#7)x- z7UWue5sa$R>N&b{J61&gvKcKlozH*;OjoDR+elkh|4bJ!_3AZNMOu?n9&|L>OTD78 z^i->ah_Mqc|Ev)KNDzfu1P3grBIM#%`QZqj5W{qu(HocQhjyS;UINoP`{J+DvV?|1 z_sw6Yr3z6%e7JKVDY<$P=M)dbk@~Yw9|2!Cw!io3%j92wTD!c^e9Vj+7VqXo3>u#= zv#M{HHJ=e$X5vQ>>ML?E8#UlmvJgTnb73{PSPTf*0)mcj6C z{KsfUbDK|F$E(k;ER%8HMdDi`=BfpZzP3cl5yJHu;v^o2FkHNk;cXc17tL8T!CsYI zfeZ6sw@;8ia|mY_AXjCS?kUfxdjDB28)~Tz1dGE|{VfBS9`0m2!m1yG?hR})er^pl4c@9Aq+|}ZlDaHL)K$O| z%9Jp-imI-Id0|(d5{v~w6mx)tUKfbuVD`xNt04Mry%M+jXzE>4(TBsx#&=@wT2Vh) z1yeEY&~17>0%P(eHP0HB^|7C+WJxQBTG$uyOWY@iDloRIb-Cf!p<{WQHR!422#F34 zG`v|#CJ^G}y9U*7jgTlD{D&y$Iv{6&PYG>{Ixg$pGk?lWrE#PJ8KunQC@}^6OP!|< zS;}p3to{S|uZz%kKe|;A0bL0XxPB&Q{J(9PyX`+Kr`k~r2}yP^ND{8!v7Q1&vtk& z2Y}l@J@{|2`oA%sxvM9i0V+8IXrZ4;tey)d;LZI70Kbim<4=WoTPZy=Yd|34v#$Kh zx|#YJ8s`J>W&jt#GcMpx84w2Z3ur-rK7gf-p5cE)=w1R2*|0mj12hvapuUWM0b~dG zMg9p8FmAZI@i{q~0@QuY44&mMUNXd7z>U58shA3o`p5eVLpq>+{(<3->DWuSFVZwC zxd50Uz(w~LxC4}bgag#q#NNokK@yNc+Q|Ap!u>Ddy+df>v;j@I12CDNN9do+0^n8p zMQs7X#+FVF0C5muGfN{r0|Nkql%BQT|K(DDNdR2pzM=_ea5+GO|J67`05AV92t@4l z0Qno0078PIHdaQGHZ~Scw!dzgqjK~3B7kf>BcP__&lLyU(cu3B^uLo%{j|Mb0NR)tkeT7Hcwp4O# z)yzu>cvG(d9~0a^)eZ;;%3ksk@F&1eEBje~ zW+-_s)&RgiweQc!otF>4%vbXKaOU41{!hw?|2`Ld3I8$&#WOsq>EG)1ANb!{N4z9@ zsU!bPG-~-bqCeIDzo^Q;gnucB{tRzm{ZH^Orphm2U+REA!*<*J6YQV83@&xoDl%#wnl5qcBqCcAF-vX5{30}(oJrnSH z{RY85hylK2dMOh2%oO1J8%)0?8TOL%rS8)+CsDv}aQ>4D)Jv+DLK)9gI^n-T^$)Tc zFPUD75qJm!Y-KBqj;JP4dV4 z`X{lGmn<)1IGz330}s}Jrjtf{(lnuuNHe5(ezA(pYa=1|Ff-LhPFK8 zyJh_b{yzu0yll6ZkpRzRjezyYivjyjW7QwO;@6X`m;2Apn2EK2!~7S}-*=;5*7K$B z`x(=!^?zgj(-`&ApZJXI09aDLXaT@<;CH=?fBOY5d|b~wBA@@p^K#nxr`)?i?SqTupI_PJ(A3cx`z~9mX_*)>L F{|7XC?P&l2 diff --git a/client/android/gradle/wrapper/gradle-wrapper.properties b/client/android/gradle/wrapper/gradle-wrapper.properties index 669386b87..e411586a5 100644 --- a/client/android/gradle/wrapper/gradle-wrapper.properties +++ b/client/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/client/android/gradlew b/client/android/gradlew index cccdd3d51..1aa94a426 100755 --- a/client/android/gradlew +++ b/client/android/gradlew @@ -1,78 +1,127 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,92 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/client/android/gradlew.bat b/client/android/gradlew.bat index f9553162f..93e3f59f1 100644 --- a/client/android/gradlew.bat +++ b/client/android/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -9,19 +25,23 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,38 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From e1eec55f627ee93bd56cf1d41e2dfecdb16be754 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 14 Nov 2023 22:58:47 +0300 Subject: [PATCH 036/144] Refactoring build Move to gradle kotlin DSL Use gradle version catalog All android build parameters are set via cmake files Use gradle abi split to build APKs Improve local development in the android project folder --- .github/workflows/deploy.yml | 104 ++++++++---- CMakeLists.txt | 1 + client/android/build.gradle | 156 +----------------- client/android/build.gradle.kts | 92 +++++++++++ client/android/gradle.properties | 63 ++++--- client/android/gradle/libs.versions.toml | 35 ++++ .../android/gradle/plugins/build.gradle.kts | 33 ++++ .../src/main/kotlin/PropertyDelegate.kt | 49 ++++++ client/android/settings.gradle | 21 --- client/android/settings.gradle.kts | 58 +++++++ client/cmake/android.cmake | 49 ++---- deploy/build_android.sh | 91 ++++++---- 12 files changed, 461 insertions(+), 291 deletions(-) create mode 100644 client/android/build.gradle.kts create mode 100644 client/android/gradle/libs.versions.toml create mode 100644 client/android/gradle/plugins/build.gradle.kts create mode 100644 client/android/gradle/plugins/src/main/kotlin/PropertyDelegate.kt delete mode 100644 client/android/settings.gradle create mode 100644 client/android/settings.gradle.kts diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 719fcd723..a9cd4441e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -273,21 +273,10 @@ jobs: name: 'Build-Android' runs-on: ubuntu-latest - strategy: - matrix: - include: - - abi: 'x86_64' - qt_arch: 'android_x86_64' - - abi: 'x86' - qt_arch: 'android_x86' - - abi: 'armeabi-v7a' - qt_arch: 'android_armv7' - - abi: 'arm64-v8a' - qt_arch: 'android_arm64_v8a' - env: - QT_VERSION: 6.5.2 - ANDROID_BUILD_PLATFORM: android-33 + ANDROID_BUILD_PLATFORM: android-34 + QT_VERSION: 6.5.3 + QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' steps: - name: 'Install desktop Qt' @@ -297,29 +286,58 @@ jobs: host: 'linux' target: 'desktop' arch: 'gcc_64' - modules: 'qtremoteobjects qt5compat qtimageformats qtshadertools' + modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} - setup-python: 'true' - set-env: 'true' extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install android Qt' + - name: 'Install android_x86_64 Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'android' - arch: ${{ matrix.qt_arch }} - modules: 'qtremoteobjects qt5compat qtimageformats qtshadertools' + arch: 'android_x86_64' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' + + - name: 'Install android_x86 Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_x86' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' + + - name: 'Install android_armv7 Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_armv7' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' + + - name: 'Install android_arm64_v8a Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_arm64_v8a' + modules: ${{ env.QT_MODULES }} dir: ${{ runner.temp }} - setup-python: 'true' - set-env: 'true' extra: '--external 7z --base ${{ env.QT_MIRROR }}' - name: 'Grant execute permission for qt-cmake' shell: bash run: | - chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/${{ matrix.qt_arch }}/bin/qt-cmake + chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64/bin/qt-cmake - name: 'Get sources' uses: actions/checkout@v3 @@ -333,14 +351,14 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '11' + java-version: '17' cache: 'gradle' - name: 'Setup Android NDK' id: setup-ndk uses: nttld/setup-ndk@v1 with: - ndk-version: 'r25c' + ndk-version: 'r26b' local-cache: 'true' - name: 'Decode keystore secret to file' @@ -354,16 +372,36 @@ jobs: env: ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} QT_HOST_PATH: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64 - QT_ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore - QT_ANDROID_KEYSTORE_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} - QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} - QT_ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} + ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore + ANDROID_KEYSTORE_KEY_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} + ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} shell: bash - run: ./deploy/build_android.sh --apk ${{ matrix.abi }} --platform ${{ env.ANDROID_BUILD_PLATFORM }} + run: ./deploy/build_android.sh --apk all --build-platform ${{ env.ANDROID_BUILD_PLATFORM }} + + - name: 'Upload x86_64 apk' + uses: actions/upload-artifact@v3 + with: + name: AmneziaVPN-android-x86_64 + path: deploy/build/AmneziaVPN-x86_64-release.apk + retention-days: 7 + + - name: 'Upload x86 apk' + uses: actions/upload-artifact@v3 + with: + name: AmneziaVPN-android-x86 + path: deploy/build/AmneziaVPN-x86-release.apk + retention-days: 7 + + - name: 'Upload arm64-v8a apk' + uses: actions/upload-artifact@v3 + with: + name: AmneziaVPN-android-arm64-v8a + path: deploy/build/AmneziaVPN-arm64-v8a-release.apk + retention-days: 7 - - name: 'Upload apk' + - name: 'Upload armeabi-v7a apk' uses: actions/upload-artifact@v3 with: - name: AmneziaVPN-android-${{ matrix.abi }} - path: deploy/build/AmneziaVPN-${{ matrix.abi }}-release-signed.apk + name: AmneziaVPN-android-armeabi-v7a + path: deploy/build/AmneziaVPN-armeabi-v7a-release.apk retention-days: 7 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d38a422e..084ff3d0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") set(RELEASE_DATE "${CURRENT_DATE}") set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) +set(APP_ANDROID_VERSION_CODE 39) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/android/build.gradle b/client/android/build.gradle index 3819a4fe9..d768000e5 100644 --- a/client/android/build.gradle +++ b/client/android/build.gradle @@ -1,153 +1,5 @@ -apply plugin: 'com.github.ben-manes.versions' - -buildscript { - ext{ - kotlin_version = "1.7.22" - // for libwg - appcompatVersion = '1.1.0' - annotationsVersion = '1.0.1' - databindingVersion = '3.3.1' - jsr305Version = '3.0.2' - streamsupportVersion = '1.7.0' - threetenabpVersion = '1.1.1' - groupName = 'org.amnezia.vpn' - minSdkVer = '24' - cmakeMinVersion = "3.25.0+" - } - - repositories { - google() - jcenter() - mavenCentral() - maven { url = uri("https://jitpack.io") } - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.2.1' - classpath 'com.github.ben-manes:gradle-versions-plugin:0.21.0' - classpath 'com.vanniktech:gradle-maven-publish-plugin:0.8.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - } -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' -apply plugin: 'kotlinx-serialization' -apply plugin: 'kotlin-kapt' - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) - implementation group: 'org.json', name: 'json', version: '20220924' - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.4.1' - - implementation "androidx.security:security-crypto:1.1.0-alpha03" - implementation "androidx.security:security-identity-credential:1.0.0-alpha02" - - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" - - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" - - implementation project(path: ':shadowsocks') - - // CameraX core library using the camera2 implementation - def camerax_version = "1.2.1" - implementation("androidx.camera:camera-core:${camerax_version}") - implementation("androidx.camera:camera-camera2:${camerax_version}") - implementation("androidx.camera:camera-lifecycle:${camerax_version}") - implementation("androidx.camera:camera-view:${camerax_version}") - implementation("androidx.camera:camera-extensions:${camerax_version}") - - def camerax_ml_version = "1.2.0-beta02" - def ml_kit_version = "17.0.3" - implementation("androidx.camera:camera-mlkit-vision:${camerax_ml_version}") - implementation("com.google.mlkit:barcode-scanning:${ml_kit_version}") -} - -androidExtensions { - experimental = true -} - -android { - /******************************************************* - * The following variables: - * - androidBuildToolsVersion, - * - androidCompileSdkVersion - * - qtAndroidDir - holds the path to qt android files - * needed to build any Qt application - * on Android. - * - * are defined in gradle.properties file. This file is - * updated by QtCreator and androiddeployqt tools. - * Changing them manually might break the compilation! - *******************************************************/ - - compileSdkVersion androidCompileSdkVersion.toInteger() - - buildToolsVersion androidBuildToolsVersion - ndkVersion androidNdkVersion - - // Extract native libraries from the APK - packagingOptions.jniLibs.useLegacyPackaging true - - dexOptions { - javaMaxHeapSize "3g" - } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = [qtAndroidDir + '/src', 'src', 'java'] - aidl.srcDirs = [qtAndroidDir + '/src', 'src', 'aidl'] - res.srcDirs = [qtAndroidDir + '/res', 'res'] - resources.srcDirs = ['resources'] - renderscript.srcDirs = ['src'] - assets.srcDirs = ['assets'] - jniLibs.srcDirs = ['libs'] - androidTest.assets.srcDirs += files("${qtAndroidDir}/schemas".toString()) - } - } - - tasks.withType(JavaCompile) { - options.incremental = true - } - - compileOptions { - // Flag to enable support for the new language APIs - coreLibraryDesugaringEnabled true - - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8 - - lintOptions { - abortOnError false - } - - // Do not compress Qt binary resources file - aaptOptions { - noCompress 'rcc' - } - - defaultConfig { - resConfig "en" - minSdkVersion = 24 - targetSdkVersion = 34 - versionCode 39 // Change to a higher number - versionName "4.1.0" // Change to a higher number - - javaCompileOptions.annotationProcessorOptions.arguments = [ - "room.schemaLocation": "${qtAndroidDir}/schemas".toString() - ] - } - - -} - - +// dummy file for androiddeployqt +// android.bundle.enableUncompressedNativeLibs is deprecated +// disable adding gradle property android.bundle.enableUncompressedNativeLibs by androiddeployqt +useLegacyPackaging diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts new file mode 100644 index 000000000..e7786620d --- /dev/null +++ b/client/android/build.gradle.kts @@ -0,0 +1,92 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + id("property-delegate") +} + +kotlin { + jvmToolchain(17) +} + +// get values from gradle or local properties +val qtTargetSdkVersion: String by gradleProperties +val qtTargetAbiList: String by gradleProperties +val qtAndroidDir: String by gradleProperties + +android { + namespace = "org.amnezia.vpn" + + buildFeatures { + buildConfig = true + viewBinding = true + } + + androidResources { + // don't compress Qt binary resources file + noCompress += "rcc" + } + + packaging { + // compress .so binary libraries + jniLibs.useLegacyPackaging = true + } + + defaultConfig { + applicationId = "org.amnezia.vpn" + targetSdk = qtTargetSdkVersion.toInt() + + // keeps language resources for only the locales specified below + resourceConfigurations += listOf("en", "ru", "b+zh+Hans") + } + + sourceSets { + getByName("main") { + manifest.srcFile("AndroidManifest.xml") + java.setSrcDirs(listOf("$qtAndroidDir/src", "src")) + res.setSrcDirs(listOf("$qtAndroidDir/res", "res")) + assets.setSrcDirs(listOf("assets")) + jniLibs.setSrcDirs(listOf("libs")) + } + } + + signingConfigs { + register("release") { + storeFile = providers.environmentVariable("ANDROID_KEYSTORE_PATH").orNull?.let { file(it) } + storePassword = providers.environmentVariable("ANDROID_KEYSTORE_KEY_PASS").orNull + keyAlias = providers.environmentVariable("ANDROID_KEYSTORE_KEY_ALIAS").orNull + keyPassword = providers.environmentVariable("ANDROID_KEYSTORE_KEY_PASS").orNull + } + } + + buildTypes { + release { + // exclude coroutine debug resource from release build + packaging { + resources.excludes += "DebugProbesKt.bin" + } + signingConfig = signingConfigs["release"] + } + } + + splits { + abi { + isEnable = true + reset() + include(*qtTargetAbiList.split(',').toTypedArray()) + isUniversalApk = false + } + } +} + +dependencies { + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) + implementation(libs.androidx.core) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.security.crypto) + implementation(libs.kotlinx.coroutines) + implementation(libs.bundles.androidx.camera) + implementation(libs.google.mlkit) + implementation(project(":shadowsocks")) + // todo: remove after finish refactoring + implementation(libs.androidx.constraintlayout) +} diff --git a/client/android/gradle.properties b/client/android/gradle.properties index fd9155bcf..5a27838c3 100644 --- a/client/android/gradle.properties +++ b/client/android/gradle.properties @@ -1,27 +1,46 @@ -# Project-wide Gradle settings. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# Gradle caching allows reusing the build artifacts from a previous -# build with the same inputs. However, over time, the cache size will -# grow. Uncomment the following line to enable it. -#org.gradle.caching=true +# Specifies the JVM arguments used for the daemon process +org.gradle.jvmargs=-Xms512m -Xmx4g -XX:+UseParallelGC -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError \ + -Dfile.encoding=UTF-8 +org.gradle.caching=true +org.gradle.parallel=true +org.gradle.configureondemand=true +# Use AndroidX library instead of a Support Library android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true +# Disable adding android:testOnly attribute to the manifest +android.injected.testOnly=false # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -android.bundle.enableUncompressedNativeLibs=false -androidBuildToolsVersion=30.0.2 -androidCompileSdkVersion=30 -org.gradle.caching=true -org.gradle.parallel=true -android.enableJetifier=true -android.injected.testOnly=false -kapt.use.worker.api=false -kapt.incremental.apt=false +# Disable providing custom values to resources from buildscript by default +android.defaults.buildfeatures.resvalues=false +# Disable compileShaders tasks by default +android.defaults.buildfeatures.shaders=false +# Disable Android resource processing for libraries by default +android.library.defaults.buildfeatures.androidresources=false + +# Qt variables +# At build time androiddeployqt replaces these values with: +# androidCompileSdkVersion - androiddeployqt --android-platform parameter +# androidBuildToolsVersion - QT_ANDROID_SDK_BUILD_TOOLS_REVISION cmake target parameter +# qtMinSdkVersion - QT_ANDROID_MIN_SDK_VERSION cmake target parameter +# qtTargetSdkVersion - QT_ANDROID_TARGET_SDK_VERSION cmake target parameter +# androidNdkVersion - version from ANDROID_NDK_ROOT environment variable +# qtTargetAbiList - qt-cmake QT_ANDROID_ABIS parameter +# qtAndroidDir - path to qt binding java source code +# buildDir - hardcoded "build" value in androiddeployqt + +# For development copy and set local values for these parameters in local.properties +#androidCompileSdkVersion=android-34 +#androidBuildToolsVersion=34.0.0 +#qtMinSdkVersion=24 +#qtTargetSdkVersion=34 +#androidNdkVersion=26.1.10909125 +#qtTargetAbiList=x86_64 +#qtAndroidDir=/QT_BASE/android_ABI/src/android/java +#buildDir=build + +# Note about qtAndroidDir: +# Some IDEs (for example, IntelliJ IDEA) may index all data from a common root of the project and qtAndroidDir. +# Therefore, it's recommended to copy qt android files to a directory inside the project +# and specify the path to that directory in qtAndroidDir. diff --git a/client/android/gradle/libs.versions.toml b/client/android/gradle/libs.versions.toml new file mode 100644 index 000000000..d806b393e --- /dev/null +++ b/client/android/gradle/libs.versions.toml @@ -0,0 +1,35 @@ +[versions] +agp = "8.1.3" +kotlin = "1.9.20" +androidx-core = "1.12.0" +androidx-appcompat = "1.6.1" +androidx-camera = "1.2.3" +androidx-security-crypto = "1.1.0-alpha06" +kotlinx-coroutines = "1.7.3" +google-mlkit = "17.2.0" + +[libraries] +androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } +androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "androidx-camera" } +androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "androidx-camera" } +androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "androidx-camera" } +androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "androidx-camera" } +androidx-security-crypto = { module = "androidx.security:security-crypto-ktx", version.ref = "androidx-security-crypto" } +kotlinx-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } +google-mlkit = { module = "com.google.mlkit:barcode-scanning", version.ref = "google-mlkit" } +# todo: remove after finish refactoring +androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version = "2.1.4" } + +[bundles] +androidx-camera = [ + "androidx-camera-core", + "androidx-camera-lifecycle", + "androidx-camera-view", + "androidx-camera-camera2" +] + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } diff --git a/client/android/gradle/plugins/build.gradle.kts b/client/android/gradle/plugins/build.gradle.kts new file mode 100644 index 000000000..24dcb1ff5 --- /dev/null +++ b/client/android/gradle/plugins/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} + +kotlin { + jvmToolchain(17) +} + +gradlePlugin { + plugins { + register("settingsGradlePropertyDelegate") { + id = "settings-property-delegate" + implementationClass = "SettingsPropertyDelegate" + } + + register("projectGradlePropertyDelegate") { + id = "property-delegate" + implementationClass = "ProjectPropertyDelegate" + } + } +} + +// stop Gradle running by androiddeployqt +gradle.taskGraph.whenReady { + if (providers.environmentVariable("ANDROIDDEPLOYQT_RUN").isPresent + && !providers.systemProperty("explicitRun").isPresent) { + tasks.forEach { it.enabled = false } + } +} diff --git a/client/android/gradle/plugins/src/main/kotlin/PropertyDelegate.kt b/client/android/gradle/plugins/src/main/kotlin/PropertyDelegate.kt new file mode 100644 index 000000000..c5e721d51 --- /dev/null +++ b/client/android/gradle/plugins/src/main/kotlin/PropertyDelegate.kt @@ -0,0 +1,49 @@ +import java.io.File +import java.io.FileInputStream +import java.io.InputStreamReader +import java.util.Properties +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.initialization.Settings +import org.gradle.api.provider.ProviderFactory + +private fun localProperties(rootDir: File) = Properties().apply { + val localProperties = File(rootDir, "local.properties") + if (localProperties.isFile) { + InputStreamReader(FileInputStream(localProperties), Charsets.UTF_8).use { + load(it) + } + } +} + +private class PropertyDelegate( + rootDir: File, + private val providers: ProviderFactory, + private val localProperties: Properties = localProperties(rootDir) +) : ReadOnlyProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): String = + providers.gradleProperty(property.name).orNull ?: localProperties.getProperty(property.name) +} + +private lateinit var settingsPropertyDelegate: ReadOnlyProperty +private lateinit var projectPropertyDelegate: ReadOnlyProperty + +class SettingsPropertyDelegate : Plugin { + override fun apply(settings: Settings) { + settingsPropertyDelegate = PropertyDelegate(settings.rootDir, settings.providers) + } +} + +class ProjectPropertyDelegate : Plugin { + override fun apply(project: Project) { + projectPropertyDelegate = PropertyDelegate(project.rootDir, project.providers) + } +} + +val Settings.gradleProperties: ReadOnlyProperty + get() = settingsPropertyDelegate + +val Project.gradleProperties: ReadOnlyProperty + get() = projectPropertyDelegate diff --git a/client/android/settings.gradle b/client/android/settings.gradle deleted file mode 100644 index d672e2963..000000000 --- a/client/android/settings.gradle +++ /dev/null @@ -1,21 +0,0 @@ -pluginManagement { - repositories { - google() - mavenCentral() - jcenter() - gradlePluginPortal() - maven { url 'https://jitpack.io' } - } -} - -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - jcenter() - maven { url 'https://jitpack.io' } - } -} - -include ':shadowsocks' diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts new file mode 100644 index 000000000..ace266a17 --- /dev/null +++ b/client/android/settings.gradle.kts @@ -0,0 +1,58 @@ +import com.android.build.api.dsl.SettingsExtension + +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + // for jsocks todo: remove after finish refactoring + maven("https://jitpack.io") + } + + includeBuild("./gradle/plugins") +} + +@Suppress("UnstableApiUsage") +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + // for jsocks todo: remove after finish refactoring + maven("https://jitpack.io") + } +} + +includeBuild("./gradle/plugins") + +plugins { + id("com.android.settings") version "8.1.3" + id("settings-property-delegate") +} + +rootProject.name = "AmneziaVPN" +rootProject.buildFileName = "build.gradle.kts" + +include(":shadowsocks") + +// get values from gradle or local properties +val androidBuildToolsVersion: String by gradleProperties +val androidCompileSdkVersion: String by gradleProperties +val androidNdkVersion: String by gradleProperties +val qtMinSdkVersion: String by gradleProperties + +// set default values for all modules +configure { + buildToolsVersion = androidBuildToolsVersion + compileSdk = androidCompileSdkVersion.substringAfter('-').toInt() + minSdk = qtMinSdkVersion.toInt() + ndkVersion = androidNdkVersion +} + +// stop Gradle running by androiddeployqt +gradle.taskGraph.whenReady { + if (providers.environmentVariable("ANDROIDDEPLOYQT_RUN").isPresent + && !providers.systemProperty("explicitRun").isPresent) { + allTasks.forEach { it.enabled = false } + } +} diff --git a/client/cmake/android.cmake b/client/cmake/android.cmake index 9440ad10b..7511690d1 100644 --- a/client/cmake/android.cmake +++ b/client/cmake/android.cmake @@ -1,4 +1,20 @@ message("Client android ${CMAKE_ANDROID_ARCH_ABI} build") + +set(APP_ANDROID_MIN_SDK 24) +set(ANDROID_PLATFORM "android-${APP_ANDROID_MIN_SDK}" CACHE STRING + "The minimum API level supported by the application or library" FORCE) + +set_target_properties(${PROJECT} PROPERTIES + QT_ANDROID_VERSION_NAME ${CMAKE_PROJECT_VERSION} + QT_ANDROID_VERSION_CODE ${APP_ANDROID_VERSION_CODE} + QT_ANDROID_MIN_SDK_VERSION ${APP_ANDROID_MIN_SDK} + QT_ANDROID_TARGET_SDK_VERSION 34 + QT_ANDROID_SDK_BUILD_TOOLS_REVISION 34.0.0 + QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android +) + +set(QT_ANDROID_MULTI_ABI_FORWARD_VARS "QT_NO_GLOBAL_APK_TARGET_PART_OF_ALL;CMAKE_BUILD_TYPE") + # We need to include qtprivate api's # As QAndroidBinder is not yet implemented with a public api set(LIBS ${LIBS} Qt6::CorePrivate) @@ -23,39 +39,6 @@ set(SOURCES ${SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/protocols/android_vpnprotocol.cpp ) -add_custom_command( - TARGET ${PROJECT} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml - ${CMAKE_CURRENT_SOURCE_DIR}/android/build.gradle - ${CMAKE_CURRENT_SOURCE_DIR}/android/gradle/wrapper/gradle-wrapper.jar - ${CMAKE_CURRENT_SOURCE_DIR}/android/gradle/wrapper/gradle-wrapper.properties - ${CMAKE_CURRENT_SOURCE_DIR}/android/gradlew - ${CMAKE_CURRENT_SOURCE_DIR}/android/gradlew.bat - ${CMAKE_CURRENT_SOURCE_DIR}/android/gradle.properties - ${CMAKE_CURRENT_SOURCE_DIR}/android/res/values/libs.xml - ${CMAKE_CURRENT_SOURCE_DIR}/android/res/xml/fileprovider.xml - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/AuthHelper.java - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/IPCContract.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/NotificationUtil.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/Prefs.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/VPNLogger.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/VPNService.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/VPNServiceBinder.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/qt/AmneziaApp.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/qt/PackageManagerHelper.java - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/qt/VPNActivity.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/qt/VPNClientBinder.kt - ${CMAKE_CURRENT_SOURCE_DIR}/android/src/org/amnezia/vpn/qt/VPNPermissionHelper.kt - ${CMAKE_CURRENT_BINARY_DIR} -) - -set_property(TARGET ${PROJECT} PROPERTY - QT_ANDROID_PACKAGE_SOURCE_DIR - ${CMAKE_CURRENT_SOURCE_DIR}/android -) - foreach(abi IN ITEMS ${QT_ANDROID_ABIS}) set_property(TARGET ${PROJECT} PROPERTY QT_ANDROID_EXTRA_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/android/${abi}/libwg.so diff --git a/deploy/build_android.sh b/deploy/build_android.sh index 55da33f10..0c5a80c8d 100755 --- a/deploy/build_android.sh +++ b/deploy/build_android.sh @@ -12,13 +12,14 @@ Usage: Build AmneziaVPN android client. By default, a signed Android App Bundle (AAB) is built. Options: - -d, --debug Build debug version - -a, --apk Build APK for the specified ABI - Available ABIs: 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' - -p, --platform The SDK platform used for building the Java code of the application - By default, the latest available platform is used - -m, --move Move the build result to the root of the build directory - -h, --help Display this help + -d, --debug Build debug version + -a, --apk ( | all) Build APKs for the specified ABIs or for all available ABIs + Available ABIs: 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' + - list of ABIs delimited by ';' + -b, --build-platform The SDK platform used for building the Java code of the application + By default, the latest available platform is used + -m, --move Move the build result to the root of the build directory + -h, --help Display this help EOT } @@ -26,21 +27,25 @@ EOT BUILD_TYPE="release" AAB=1 -opts=$(getopt -l debug,apk:,platform:,move,help -o "da:p:mh" -- "$@") +opts=$(getopt -l debug,apk:,build-platform:,move,help -o "da:b:mh" -- "$@") eval set -- "$opts" while true; do case "$1" in -d | --debug) BUILD_TYPE="debug"; shift;; - -a | --apk) ABI=$2; unset AAB; shift 2;; - -p | --platform) ANDROID_PLATFORM=$2; shift 2;; + -a | --apk) ABIS=$2; unset AAB; shift 2;; + -b | --build-platform) ANDROID_BUILD_PLATFORM=$2; shift 2;; -m | --move) MOVE_RESULT=1; shift;; -h | --help) usage; exit 0;; --) shift; break;; esac done -if [[ -v ABI && ! "$ABI" =~ ^(x86|x86_64|armeabi-v7a|arm64-v8a)$ ]]; then - echo "The 'abi' option must be one of ['x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'], but is '$ABI'" +# Validate ABIS parameter +if [[ -v ABIS && \ + ! "$ABIS" = "all" && \ + ! "$ABIS" =~ ^((x86|x86_64|armeabi-v7a|arm64-v8a);)*(x86|x86_64|armeabi-v7a|arm64-v8a)$ ]]; then + echo "The 'apk' option must be a list of ['x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a']" \ + "delimited by ';' or 'all', but is '$ABIS'" exit 1 fi @@ -56,13 +61,19 @@ OUT_APP_DIR=$BUILD_DIR/client echo "Project dir: $PROJECT_DIR" echo "Build dir: $BUILD_DIR" -if [ -v AAB ]; then +# Determine path to qt bin folder with qt-cmake +if [[ -v AAB || "$ABIS" = "all" ]]; then qt_bin_dir_suffix="x86_64" else - case $ABI in + if [[ $ABIS = *";"* ]]; then + oneOf=$(echo $ABIS | cut -d';' -f 1) + else + oneOf=$ABIS + fi + case $oneOf in "armeabi-v7a") qt_bin_dir_suffix="armv7";; "arm64-v8a") qt_bin_dir_suffix="arm64_v8a";; - *) qt_bin_dir_suffix=$ABI;; + *) qt_bin_dir_suffix=$oneOf;; esac fi # get real path @@ -79,10 +90,10 @@ echo "Using Android NDK in $ANDROID_NDK_ROOT" # Run qt-cmake to configure build qt_cmake_opts=() -if [ -v AAB ]; then +if [[ -v AAB || "$ABIS" = "all" ]]; then qt_cmake_opts+=(-DQT_ANDROID_BUILD_ALL_ABIS=ON) else - qt_cmake_opts+=(-DQT_ANDROID_ABIS="$ABI") + qt_cmake_opts+=(-DQT_ANDROID_ABIS="$ABIS") fi # QT_NO_GLOBAL_APK_TARGET_PART_OF_ALL=ON - Skip building apks as part of the default 'ALL' target @@ -95,7 +106,7 @@ $QT_BIN_DIR/qt-cmake -S $PROJECT_DIR -B $BUILD_DIR \ # Build app cmake --build $BUILD_DIR --config $BUILD_TYPE -# Build and package APK or AAB. If this is a release, then additionally sign the result. +# Build and package APK or AAB echo "Building APK/AAB..." deployqt_opts=() @@ -104,32 +115,52 @@ if [ -v AAB ]; then deployqt_opts+=(--aab) fi -if [ -v ANDROID_PLATFORM ]; then - deployqt_opts+=(--android-platform "$ANDROID_PLATFORM") +if [ -v ANDROID_BUILD_PLATFORM ]; then + deployqt_opts+=(--android-platform "$ANDROID_BUILD_PLATFORM") fi if [ "$BUILD_TYPE" = "release" ]; then - deployqt_opts+=(--release --sign) + deployqt_opts+=(--release) fi +# for gradle to skip all tasks when it is executed by androiddeployqt +# gradle is started later explicitly +export ANDROIDDEPLOYQT_RUN=1 + $QT_HOST_PATH/bin/androiddeployqt \ --input $OUT_APP_DIR/android-AmneziaVPN-deployment-settings.json \ --output $OUT_APP_DIR/android-build \ - --gradle \ "${deployqt_opts[@]}" +# run gradle +gradle_opts=() + +if [ -v AAB ]; then + gradle_opts+=(bundle"${BUILD_TYPE^}") +else + gradle_opts+=(assemble"${BUILD_TYPE^}") +fi + +$OUT_APP_DIR/android-build/gradlew \ + --project-dir $OUT_APP_DIR/android-build \ + -DexplicitRun=1 \ + "${gradle_opts[@]}" + if [[ -v CI || -v MOVE_RESULT ]]; then echo "Moving APK/AAB..." if [ -v AAB ]; then - mv -u $OUT_APP_DIR/android-build/build/outputs/bundle/$BUILD_TYPE/android-build-$BUILD_TYPE.aab \ - $PROJECT_DIR/deploy/build/AmneziaVPN-$BUILD_TYPE.aab + mv -u $OUT_APP_DIR/android-build/build/outputs/bundle/$BUILD_TYPE/AmneziaVPN-$BUILD_TYPE.aab \ + $PROJECT_DIR/deploy/build/ else - if [ "$BUILD_TYPE" = "release" ]; then - build_suffix="release-signed" - else - build_suffix=$BUILD_TYPE + if [ "$ABIS" = "all" ]; then + ABIS="x86;x86_64;armeabi-v7a;arm64-v8a" fi - mv -u $OUT_APP_DIR/android-build/build/outputs/apk/$BUILD_TYPE/android-build-$build_suffix.apk \ - $PROJECT_DIR/deploy/build/AmneziaVPN-$ABI-$build_suffix.apk + + IFS=';' read -r -a abi_array <<< "$ABIS" + for ABI in "${abi_array[@]}" + do + mv -u $OUT_APP_DIR/android-build/build/outputs/apk/$BUILD_TYPE/AmneziaVPN-$ABI-$BUILD_TYPE.apk \ + $PROJECT_DIR/deploy/build/ + done fi fi From 06776ebe8ff062dc72b998f14d5bbbdb8f856f16 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 14 Nov 2023 23:09:20 +0300 Subject: [PATCH 037/144] Fix errors --- client/android/AndroidManifest.xml | 191 +++++++++--------- client/android/shadowsocks/build.gradle | 22 +- .../shadowsocks/src/main/AndroidManifest.xml | 1 - .../shadowsocks/core/VpnRequestActivity.kt | 1 + .../shadowsocks/core/net/ChannelMonitor.kt | 5 +- .../core/net/LocalSocketListener.kt | 3 +- .../com/wireguard/config/InetEndpoint.java | 6 +- .../src/org/amnezia/vpn/NotificationUtil.kt | 3 +- .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 17 +- 9 files changed, 122 insertions(+), 127 deletions(-) diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 1115b74d3..7671cecb8 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -1,60 +1,52 @@ - + - - - - - - - + + + - - - - - + - + + + + + + + + + + + + - + android:roundIcon="@drawable/icon_round" + android:theme="@style/Theme.AppCompat.NoActionBar"> + - - - + - - + + - + @@ -62,73 +54,70 @@ - + android:value="-- %%INSERT_APP_LIB_NAME%% --" /> + - - - - - - + - + - + android:exported="true"> + - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -136,30 +125,32 @@ android:name=".VPNService" android:process=":QtOnlyProcess" android:permission="android.permission.BIND_VPN_SERVICE" - android:foregroundServiceType="connectedDevice" + android:foregroundServiceType="specialUse" android:exported="true"> - - - - - + + + + + + - + - + + - + - + diff --git a/client/android/shadowsocks/build.gradle b/client/android/shadowsocks/build.gradle index 03737020b..9c05307b9 100644 --- a/client/android/shadowsocks/build.gradle +++ b/client/android/shadowsocks/build.gradle @@ -1,14 +1,17 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-parcelize' //apply plugin: 'com.novoda.bintray-release' android { - compileSdkVersion 30 + buildFeatures { + aidl true + androidResources true + } + defaultConfig { - minSdkVersion 24 - targetSdkVersion 30 + namespace "org.amnezia.vpn.shadowsocks.core" versionCode 1 versionName "1.0.0" @@ -30,10 +33,6 @@ android { } } -androidExtensions { - experimental = true -} - //def lifecycleVersion = '2.0.0' def roomVersion = "2.4.3" //def preferencexVersion = '1.0.0' @@ -46,10 +45,9 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" implementation "androidx.core:core-ktx:1.2.0" - implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" - implementation "androidx.lifecycle:lifecycle-livedata-core-ktx:2.4.0" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-livedata-core-ktx:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.room:room-runtime:$roomVersion" // runtime implementation "androidx.preference:preference:1.1.0" implementation "androidx.work:work-runtime-ktx:2.7.1" diff --git a/client/android/shadowsocks/src/main/AndroidManifest.xml b/client/android/shadowsocks/src/main/AndroidManifest.xml index ee498ab80..b1c76391d 100644 --- a/client/android/shadowsocks/src/main/AndroidManifest.xml +++ b/client/android/shadowsocks/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ 0) { - pendingRegistrations.poll()!!.apply { + pendingRegistrations.tryReceive().getOrNull()!!.apply { try { result.complete(registerInternal(channel, ops, listener)) } catch (e: Exception) { @@ -112,7 +113,7 @@ class ChannelMonitor : Thread("ChannelMonitor") { (key.attachment() as (SelectionKey) -> Unit)(key) } } - closeChannel.sendBlocking(Unit) + closeChannel.trySendBlocking(Unit) } fun close(scope: CoroutineScope) { diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt index e6b06297c..600e8e026 100644 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt +++ b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt @@ -33,6 +33,7 @@ import kotlinx.coroutines.channels.sendBlocking import kotlinx.coroutines.launch import java.io.File import java.io.IOException +import kotlinx.coroutines.channels.trySendBlocking abstract class LocalSocketListener(name: String, socketFile: File) : Thread(name) { private val localSocket = LocalSocket().apply { @@ -60,7 +61,7 @@ abstract class LocalSocketListener(name: String, socketFile: File) : Thread(name } } } - closeChannel.sendBlocking(Unit) + closeChannel.trySendBlocking(Unit) } open fun shutdown(scope: CoroutineScope) { diff --git a/client/android/src/com/wireguard/config/InetEndpoint.java b/client/android/src/com/wireguard/config/InetEndpoint.java index 655835fbd..d7802204f 100644 --- a/client/android/src/com/wireguard/config/InetEndpoint.java +++ b/client/android/src/com/wireguard/config/InetEndpoint.java @@ -31,7 +31,7 @@ public final class InetEndpoint { private final boolean isResolved; private final Object lock = new Object(); private final int port; - private Instant lastResolution = Instant.EPOCH; + private long lastResolution; @Nullable private InetEndpoint resolved; private InetEndpoint(final String host, final boolean isResolved, final int port) { @@ -89,7 +89,7 @@ public Optional getResolved() { return Optional.of(this); synchronized (lock) { // TODO(zx2c4): Implement a real timeout mechanism using DNS TTL - if (Duration.between(lastResolution, Instant.now()).toMinutes() > 1) { + if (System.currentTimeMillis() - lastResolution > 60000L) { try { // Prefer v4 endpoints over v6 to work around DNS64 and IPv6 NAT issues. final InetAddress[] candidates = InetAddress.getAllByName(host); @@ -101,7 +101,7 @@ public Optional getResolved() { } } resolved = new InetEndpoint(address.getHostAddress(), true, port); - lastResolution = Instant.now(); + lastResolution = System.currentTimeMillis(); } catch (final UnknownHostException e) { resolved = null; } diff --git a/client/android/src/org/amnezia/vpn/NotificationUtil.kt b/client/android/src/org/amnezia/vpn/NotificationUtil.kt index ee679f658..efa7fb747 100644 --- a/client/android/src/org/amnezia/vpn/NotificationUtil.kt +++ b/client/android/src/org/amnezia/vpn/NotificationUtil.kt @@ -12,6 +12,7 @@ import android.content.Intent import android.os.Build import android.os.Parcel import androidx.core.app.NotificationCompat +import org.amnezia.vpn.shadowsocks.core.R import org.json.JSONObject object NotificationUtil { @@ -102,7 +103,7 @@ object NotificationUtil { val pendingIntent = PendingIntent.getActivity(service, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) // Build our notification sNotificationBuilder?.let { - it.setSmallIcon(org.amnezia.vpn.R.drawable.ic_amnezia_round) + it.setSmallIcon(R.drawable.ic_amnezia_round) .setContentTitle(header) .setContentText(message) .setOnlyAlertOnce(true) diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index b35face48..ad38c5216 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -83,29 +83,32 @@ class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runna if (jsonVpnConfig.getString("protocol") == "cloak") { val cloakConfigJson: JSONObject = jsonVpnConfig.getJSONObject("cloak_config_data") - if (cloakConfigJson.keySet().contains("NumConn")) { + if (cloakConfigJson.has("NumConn")) { cloakConfigJson.put("NumConn", 1) } - if (cloakConfigJson.keySet().contains("ProxyMethod")) { + if (cloakConfigJson.has("ProxyMethod")) { cloakConfigJson.put("ProxyMethod", "openvpn") } - if (cloakConfigJson.keySet().contains("port")) { + if (cloakConfigJson.has("port")) { val portValue = cloakConfigJson.get("port") cloakConfigJson.remove("port") cloakConfigJson.put("RemotePort", portValue) } - if (cloakConfigJson.keySet().contains("remote")) { + if (cloakConfigJson.has("remote")) { val hostValue = cloakConfigJson.get("remote") cloakConfigJson.remove("remote") cloakConfigJson.put("RemoteHost", hostValue) } - val cloakConfig = Base64.getEncoder().encodeToString( - jsonVpnConfig.getJSONObject("cloak_config_data").toString().toByteArray() - ) + val cloakConfigData = jsonVpnConfig.getJSONObject("cloak_config_data").toString().toByteArray() + val cloakConfig = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Base64.getEncoder().encodeToString(cloakConfigData) + } else { + android.util.Base64.encodeToString(cloakConfigData, android.util.Base64.DEFAULT) + } resultingConfig.append("\n\n") resultingConfig.append(cloakConfig) From d77f3ecee899bcc9e75d0f92b1e5013c6b466713 Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 15 Nov 2023 15:27:56 +0300 Subject: [PATCH 038/144] Fix build error --- .github/workflows/deploy.yml | 1 - client/android/gradle/plugins/build.gradle.kts | 8 -------- 2 files changed, 9 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a9cd4441e..be570a064 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -359,7 +359,6 @@ jobs: uses: nttld/setup-ndk@v1 with: ndk-version: 'r26b' - local-cache: 'true' - name: 'Decode keystore secret to file' env: diff --git a/client/android/gradle/plugins/build.gradle.kts b/client/android/gradle/plugins/build.gradle.kts index 24dcb1ff5..7c4829149 100644 --- a/client/android/gradle/plugins/build.gradle.kts +++ b/client/android/gradle/plugins/build.gradle.kts @@ -23,11 +23,3 @@ gradlePlugin { } } } - -// stop Gradle running by androiddeployqt -gradle.taskGraph.whenReady { - if (providers.environmentVariable("ANDROIDDEPLOYQT_RUN").isPresent - && !providers.systemProperty("explicitRun").isPresent) { - tasks.forEach { it.enabled = false } - } -} From e8a2e54d059d02b6487eae4e9cb9d355464dc1bd Mon Sep 17 00:00:00 2001 From: pokamest Date: Wed, 15 Nov 2023 12:51:39 +0000 Subject: [PATCH 039/144] Typo fix --- client/core/defs.h | 2 +- client/core/errorstrings.cpp | 2 +- client/core/sshclient.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/core/defs.h b/client/core/defs.h index 35515103e..9547dd928 100644 --- a/client/core/defs.h +++ b/client/core/defs.h @@ -36,7 +36,7 @@ enum ErrorCode ServerPacketManagerError, // Ssh connection errors - SshRequsetDeniedError, SshInterruptedError, SshInternalError, + SshRequestDeniedError, SshInterruptedError, SshInternalError, SshPrivateKeyError, SshPrivateKeyFormatError, SshTimeoutError, // Ssh sftp errors diff --git a/client/core/errorstrings.cpp b/client/core/errorstrings.cpp index cd66186d1..b17a5a9e2 100644 --- a/client/core/errorstrings.cpp +++ b/client/core/errorstrings.cpp @@ -19,7 +19,7 @@ QString errorString(ErrorCode code){ case(ServerUserNotInSudo): return QObject::tr("The user does not have permission to use sudo"); // Libssh errors - case(SshRequsetDeniedError): return QObject::tr("Ssh request was denied"); + case(SshRequestDeniedError): return QObject::tr("Ssh request was denied"); case(SshInterruptedError): return QObject::tr("Ssh request was interrupted"); case(SshInternalError): return QObject::tr("Ssh internal error"); case(SshPrivateKeyError): return QObject::tr("Invalid private key or invalid passphrase entered"); diff --git a/client/core/sshclient.cpp b/client/core/sshclient.cpp index 797bdc6f9..0ac95662d 100644 --- a/client/core/sshclient.cpp +++ b/client/core/sshclient.cpp @@ -333,7 +333,7 @@ namespace libssh { switch (errorCode) { case(SSH_NO_ERROR): return ErrorCode::NoError; - case(SSH_REQUEST_DENIED): return ErrorCode::SshRequsetDeniedError; + case(SSH_REQUEST_DENIED): return ErrorCode::SshRequestDeniedError; case(SSH_EINTR): return ErrorCode::SshInterruptedError; case(SSH_FATAL): return ErrorCode::SshInternalError; default: return ErrorCode::SshInternalError; From 4e5f2f44b65d8310744345cbc94f826c97b3840f Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 15 Nov 2023 21:56:26 +0300 Subject: [PATCH 040/144] Detach shadowsocks module --- client/android/assets/acl/bypass-china.acl | 10377 --------------- .../android/assets/acl/bypass-lan-china.acl | 10391 ---------------- client/android/assets/acl/bypass-lan.acl | 17 - client/android/assets/acl/china-list.acl | 5245 -------- client/android/assets/acl/gfwlist.acl | 5492 -------- client/android/build.gradle.kts | 1 - .../res/drawable/ic_amnezia_round.xml | 0 client/android/settings.gradle.kts | 2 - .../src/org/amnezia/vpn/NotificationUtil.kt | 1 - .../android/src/org/amnezia/vpn/VPNService.kt | 82 +- .../src/org/amnezia/vpn/qt/AmneziaApp.kt | 10 +- 11 files changed, 46 insertions(+), 31572 deletions(-) delete mode 100644 client/android/assets/acl/bypass-china.acl delete mode 100644 client/android/assets/acl/bypass-lan-china.acl delete mode 100644 client/android/assets/acl/bypass-lan.acl delete mode 100644 client/android/assets/acl/china-list.acl delete mode 100644 client/android/assets/acl/gfwlist.acl rename client/android/{shadowsocks/src/main => }/res/drawable/ic_amnezia_round.xml (100%) diff --git a/client/android/assets/acl/bypass-china.acl b/client/android/assets/acl/bypass-china.acl deleted file mode 100644 index b75a76ed2..000000000 --- a/client/android/assets/acl/bypass-china.acl +++ /dev/null @@ -1,10377 +0,0 @@ -[proxy_all] - -[bypass_list] -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.32.0/19 -8.208.64.0/18 -8.208.128.0/17 -8.209.0.0/16 -8.210.0.0/15 -8.212.0.0/14 -8.216.0.0/13 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.251.240.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -65.55.60.184/30 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.119.224.0/22 -103.120.52.0/22 -103.120.72.0/22 -103.120.76.0/24 -103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 -103.121.52.0/22 -103.121.92.0/22 -103.121.160.0/21 -103.121.250.0/24 -103.121.252.0/22 -103.129.52.0/22 -103.129.148.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.197.104.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -130.214.218.0/23 -131.228.96.0/24 -131.253.12.0/29 -131.253.12.80/28 -131.253.12.240/29 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -147.243.13.32/27 -147.243.13.64/27 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.158.0.0/16 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.32.136.0/21 -152.32.144.0/20 -152.32.160.0/19 -152.32.192.0/18 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -188.65.16.0/22 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.1.0/24 -202.95.2.0/23 -202.95.4.0/22 -202.95.8.0/21 -202.95.16.0/20 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 - -[proxy_list] -# Telegram IPs$ -91.108.4.0/22 -91.108.8.0/21 -91.108.16.0/21 -91.108.36.0/22 -91.108.56.0/22 -109.239.140.0/24 -149.154.160.0/20 -14.102.250.18 -14.102.250.19 -174.142.105.153 -50.7.31.230 -67.220.91.15 -67.220.91.18 -67.220.91.23 -69.65.19.160 -72.52.81.22 -85.17.73.31 -(^|\.)030buy\.com$ -(^|\.)0rz\.tw$ -(^|\.)1-apple\.com\.tw$ -(^|\.)10\.tt$ -(^|\.)1000giri\.net$ -(^|\.)100ke\.org$ -(^|\.)10conditionsoflove\.com$ -(^|\.)10musume\.com$ -(^|\.)123rf\.com$ -(^|\.)12bet\.com$ -(^|\.)12vpn\.com$ -(^|\.)12vpn\.net$ -(^|\.)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$ -(^|\.)1984bbs\.com$ -(^|\.)1984bbs\.org$ -(^|\.)1989report\.hkja\.org\.hk$ -(^|\.)1991way\.com$ -(^|\.)1998cdp\.org$ -(^|\.)1bao\.org$ -(^|\.)1dumb\.com$ -(^|\.)1e100\.net$ -(^|\.)1eew\.com$ -(^|\.)1mobile\.com$ -(^|\.)1pondo\.tv$ -(^|\.)2-hand\.info$ -(^|\.)2000fun\.com$ -(^|\.)2008xianzhang\.info$ -(^|\.)2017\.hk$ -(^|\.)21andy\.com$ -(^|\.)21pron\.com$ -(^|\.)21sextury\.com$ -(^|\.)228\.net\.tw$ -(^|\.)233abc\.com$ -(^|\.)24hrs\.ca$ -(^|\.)24smile\.org$ -(^|\.)25u\.com$ -(^|\.)2dbook\.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$ -(^|\.)466453\.com$ -(^|\.)4bluestones\.biz$ -(^|\.)4chan\.com$ -(^|\.)4dq\.com$ -(^|\.)4everproxy\.com$ -(^|\.)4irc\.com$ -(^|\.)4mydomain\.com$ -(^|\.)4pu\.com$ -(^|\.)4rbtv\.com$ -(^|\.)4shared\.com$ -(^|\.)4tern\.com$ -(^|\.)51\.ca$ -(^|\.)51jav\.org$ -(^|\.)51luoben\.com$ -(^|\.)5278\.cc$ -(^|\.)56cun04\.jigsy\.com$ -(^|\.)5aimiku\.com$ -(^|\.)5i01\.com$ -(^|\.)5isotoi5\.org$ -(^|\.)5maodang\.com$ -(^|\.)63i\.com$ -(^|\.)64memo$ -(^|\.)64museum\.org$ -(^|\.)64tianwang\.com$ -(^|\.)64wiki\.com$ -(^|\.)66\.ca$ -(^|\.)666kb\.com$ -(^|\.)6park\.com$ -(^|\.)6parker\.com$ -(^|\.)7capture\.com$ -(^|\.)7cow\.com$ -(^|\.)8-d\.com$ -(^|\.)85cc\.net$ -(^|\.)85cc\.us$ -(^|\.)85st\.com$ -(^|\.)881903\.com$ -(^|\.)888\.com$ -(^|\.)888poker\.com$ -(^|\.)89-64\.org$ -(^|\.)89\.64\.charter\.constitutionalism\.solutions$ -(^|\.)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$ -(^|\.)a-normal-day\.com$ -(^|\.)a248\.e\.akamai\.net$ -(^|\.)a5\.com\.ru$ -(^|\.)aamacau\.com$ -(^|\.)abc\.com$ -(^|\.)abc\.pp\.ru$ -(^|\.)abc\.xyz$ -(^|\.)abchinese\.com$ -(^|\.)abclite\.net$ -(^|\.)abitno\.linpie\.com$ -(^|\.)ablwang\.com$ -(^|\.)aboluowang\.com$ -(^|\.)aboutgfw\.com$ -(^|\.)abs\.edu$ -(^|\.)ac\.jiruan\.net$ -(^|\.)accim\.org$ -(^|\.)aceros-de-hispania\.com$ -(^|\.)acevpn\.com$ -(^|\.)acg18\.me$ -(^|\.)acgkj\.com$ -(^|\.)acmedia365\.com$ -(^|\.)acmetoy\.com$ -(^|\.)acnw\.com\.au$ -(^|\.)actfortibet\.org$ -(^|\.)actimes\.com\.au$ -(^|\.)activpn\.com$ -(^|\.)aculo\.us$ -(^|\.)addictedtocoffee\.de$ -(^|\.)adelaidebbs\.com$ -(^|\.)admob\.com$ -(^|\.)adorama\.com$ -(^|\.)adpl\.org\.hk$ -(^|\.)ads-twitter\.com$ -(^|\.)adsense\.com$ -(^|\.)adult-sex-games\.com$ -(^|\.)adult\.friendfinder\.com$ -(^|\.)adultfriendfinder\.com$ -(^|\.)adultkeep\.net$ -(^|\.)advanscene\.com$ -(^|\.)advertfan\.com$ -(^|\.)ae\.hao123\.com$ -(^|\.)ae\.org$ -(^|\.)aenhancers\.com$ -(^|\.)af\.mil$ -(^|\.)afantibbs\.com$ -(^|\.)agnesb\.fr$ -(^|\.)agoogleaday\.com$ -(^|\.)agro\.hk$ -(^|\.)ahr0chm6ly95zwnslm5lda$ -(^|\.)ai-kan\.net$ -(^|\.)ai-wen\.net$ -(^|\.)ai\.binwang\.me$ -(^|\.)aiph\.net$ -(^|\.)airasia\.com$ -(^|\.)airconsole\.com$ -(^|\.)airvpn\.org$ -(^|\.)aisex\.com$ -(^|\.)ait\.org\.tw$ -(^|\.)aiweiwei\.com$ -(^|\.)aiweiweiblog\.com$ -(^|\.)akademiye\.org$ -(^|\.)akiba-online\.com$ -(^|\.)akiba-web\.com$ -(^|\.)al-islam\.com$ -(^|\.)al-qimmah\.net$ -(^|\.)alabout\.com$ -(^|\.)alanhou\.com$ -(^|\.)alarab\.qa$ -(^|\.)alasbarricadas\.org$ -(^|\.)alexlur\.org$ -(^|\.)alforattv\.net$ -(^|\.)alhayat\.com$ -(^|\.)alicejapan\.co\.jp$ -(^|\.)alien-ufos\.com$ -(^|\.)aliengu\.com$ -(^|\.)alkasir\.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\.com$ -(^|\.)ameblo\.jp$ -(^|\.)americangreencard\.com$ -(^|\.)americanunfinished\.com$ -(^|\.)amiblockedornot\.com$ -(^|\.)amigobbs\.net$ -(^|\.)amitabhafoundation\.us$ -(^|\.)amnesty\.org$ -(^|\.)amnesty\.org\.hk$ -(^|\.)amnesty\.tw$ -(^|\.)amnestyusa\.org$ -(^|\.)amnyemachen\.org$ -(^|\.)amoiist\.com$ -(^|\.)ampproject\.org$ -(^|\.)amtb-taipei\.org$ -(^|\.)anchorfree\.com$ -(^|\.)ancsconf\.org$ -(^|\.)andfaraway\.net$ -(^|\.)android-x86\.org$ -(^|\.)android\.com$ -(^|\.)androidify\.com$ -(^|\.)androidplus\.co$ -(^|\.)andygod\.com$ -(^|\.)angelfire\.com$ -(^|\.)angularjs\.org$ -(^|\.)animecrazy\.net$ -(^|\.)animeshippuuden\.com$ -(^|\.)aniscartujo\.com$ -(^|\.)annatam\.com$ -(^|\.)anobii\.com$ -(^|\.)anontext\.com$ -(^|\.)anonymise\.us$ -(^|\.)anonymitynetwork\.com$ -(^|\.)anonymizer\.com$ -(^|\.)anpopo\.com$ -(^|\.)answering-islam\.org$ -(^|\.)anthonycalzadilla\.com$ -(^|\.)anti1984\.com$ -(^|\.)antichristendom\.com$ -(^|\.)antiwave\.net$ -(^|\.)anyporn\.com$ -(^|\.)anysex\.com$ -(^|\.)aobo\.com\.au$ -(^|\.)aofriend\.com$ -(^|\.)aofriend\.com\.au$ -(^|\.)aojiao\.org$ -(^|\.)aolchannels\.aol\.com$ -(^|\.)aomiwang\.com$ -(^|\.)apetube\.com$ -(^|\.)api-secure\.recaptcha\.net$ -(^|\.)api-verify\.recaptcha\.net$ -(^|\.)api\.ai$ -(^|\.)api\.dropboxapi\.com$ -(^|\.)api\.linksalpha\.com$ -(^|\.)api\.proxlet\.com$ -(^|\.)api\.recaptcha\.net$ -(^|\.)apiary\.io$ -(^|\.)apidocs\.linksalpha\.com$ -(^|\.)apigee\.com$ -(^|\.)apk-dl\.com$ -(^|\.)apkdler\.com$ -(^|\.)apkmirror\.com$ -(^|\.)apkmonk\.com$ -(^|\.)apkplz\.com$ -(^|\.)apkpure\.com$ -(^|\.)aplusvpn\.com$ -(^|\.)app\.box\.com$ -(^|\.)app\.heywire\.com$ -(^|\.)app\.tutanota\.com$ -(^|\.)appdownloader\.net$ -(^|\.)appledaily\.com$ -(^|\.)appshopper\.com$ -(^|\.)appsocks\.net$ -(^|\.)appspot\.com$ -(^|\.)appsto\.re$ -(^|\.)ar\.hao123\.com$ -(^|\.)archive\.fo$ -(^|\.)archive\.is$ -(^|\.)archive\.org$ -(^|\.)archives\.gov$ -(^|\.)archives\.gov\.tw$ -(^|\.)arctosia\.com$ -(^|\.)areca-backup\.org$ -(^|\.)arena\.taipei$ -(^|\.)arethusa\.su$ -(^|\.)arlingtoncemetery\.mil$ -(^|\.)army\.mil$ -(^|\.)art4tibet1998\.org$ -(^|\.)artofpeacefoundation\.org$ -(^|\.)artsy\.net$ -(^|\.)asacp\.org$ -(^|\.)asahichinese\.com$ -(^|\.)asdfg\.jp$ -(^|\.)asg\.to$ -(^|\.)asia-gaming\.com$ -(^|\.)asiaharvest\.org$ -(^|\.)asianews\.it$ -(^|\.)asiansexdiary\.com$ -(^|\.)asianspiss\.com$ -(^|\.)asianwomensfilm\.de$ -(^|\.)asiatgp\.com$ -(^|\.)asiatoday\.us$ -(^|\.)askstudent\.com$ -(^|\.)askynz\.net$ -(^|\.)assembla\.com$ -(^|\.)assimp\.org$ -(^|\.)astrill\.com$ -(^|\.)atc\.org\.au$ -(^|\.)atchinese\.com$ -(^|\.)atdmt\.com$ -(^|\.)atgfw\.org$ -(^|\.)athenaeizou\.com$ -(^|\.)atlanta168\.com$ -(^|\.)atlaspost\.com$ -(^|\.)atnext\.com$ -(^|\.)authorizeddns\.net$ -(^|\.)authorizeddns\.org$ -(^|\.)authorizeddns\.us$ -(^|\.)autodraw\.com$ -(^|\.)av\.com$ -(^|\.)av\.movie$ -(^|\.)av\.nightlife141\.com$ -(^|\.)avaaz\.org$ -(^|\.)avbody\.tv$ -(^|\.)avcity\.tv$ -(^|\.)avcool\.com$ -(^|\.)avdb\.in$ -(^|\.)avdb\.tv$ -(^|\.)avfantasy\.com$ -(^|\.)avidemux\.org$ -(^|\.)avmo\.pw$ -(^|\.)avmoo\.com$ -(^|\.)avmoo\.net$ -(^|\.)avmoo\.pw$ -(^|\.)avoision\.com$ -(^|\.)avyahoo\.com$ -(^|\.)axureformac\.com$ -(^|\.)azerbaycan\.tv$ -(^|\.)azerimix\.com$ -(^|\.)azubu\.tv$ -(^|\.)b0ne\.com$ -(^|\.)babynet\.com\.hk$ -(^|\.)backchina\.com$ -(^|\.)backpackers\.com\.tw$ -(^|\.)backtotiananmen\.com$ -(^|\.)badjojo\.com$ -(^|\.)badoo\.com$ -(^|\.)baidu\.jp$ -(^|\.)bailandaily\.com$ -(^|\.)baixing\.me$ -(^|\.)bakgeekhome\.tk$ -(^|\.)banana-vpn\.com$ -(^|\.)bandwagonhost\.com$ -(^|\.)bangbrosnetwork\.com$ -(^|\.)bangchen\.net$ -(^|\.)bangyoulater\.com$ -(^|\.)bannedbook\.org$ -(^|\.)bannednews\.org$ -(^|\.)banorte\.com$ -(^|\.)baramangaonline\.com$ -(^|\.)barenakedislam\.com$ -(^|\.)barnabu\.co\.uk$ -(^|\.)bartvpn\.com$ -(^|\.)bash-hackers\.org$ -(^|\.)bastillepost\.com$ -(^|\.)bayvoice\.net$ -(^|\.)bb-chat\.tv$ -(^|\.)bb\.ttv\.com\.tw$ -(^|\.)bbc\.co\.uk$ -(^|\.)bbc\.com$ -(^|\.)bbc\.com%2fzhongwen$ -(^|\.)bbc\.in$ -(^|\.)bbcchinese\.com$ -(^|\.)bbchat\.tv$ -(^|\.)bbg\.gov$ -(^|\.)bbkz\.com$ -(^|\.)bbnradio\.org$ -(^|\.)bbs-tw\.com$ -(^|\.)bbs\.brockbbs\.com$ -(^|\.)bbs\.cantonese\.asia$ -(^|\.)bbs\.ecstart\.com$ -(^|\.)bbs\.hanminzu\.org$ -(^|\.)bbs\.hasi\.wang$ -(^|\.)bbs\.huasing\.org$ -(^|\.)bbs\.junglobal\.net$ -(^|\.)bbs\.kimy\.com\.tw$ -(^|\.)bbs\.morbell\.com$ -(^|\.)bbs\.mychat\.to$ -(^|\.)bbs\.netbig\.com$ -(^|\.)bbs\.ozchinese\.com$ -(^|\.)bbs\.qmzdd\.com$ -(^|\.)bbs\.sina\.com$ -(^|\.)bbs\.sina\.com%2f$ -(^|\.)bbs\.skykiwi\.com$ -(^|\.)bbs\.sou-tong\.org$ -(^|\.)bbs\.tuitui\.info$ -(^|\.)bbsdigest\.com$ -(^|\.)bbsfeed\.com$ -(^|\.)bbsland\.com$ -(^|\.)bbsmo\.com$ -(^|\.)bbsone\.com$ -(^|\.)bbtoystore\.com$ -(^|\.)bcast\.co\.nz$ -(^|\.)bcc\.com\.tw$ -(^|\.)bcchinese\.net$ -(^|\.)bcmorning\.com$ -(^|\.)bdsmvideos\.net$ -(^|\.)beaconevents\.com$ -(^|\.)bebo\.com$ -(^|\.)beeg\.com$ -(^|\.)beevpn\.com$ -(^|\.)behindkink\.com$ -(^|\.)beijing1989\.com$ -(^|\.)beijingspring\.com$ -(^|\.)beijingzx\.org$ -(^|\.)belamionline\.com$ -(^|\.)bell\.wiki$ -(^|\.)bemywife\.cc$ -(^|\.)beric\.me$ -(^|\.)berlintwitterwall\.com$ -(^|\.)berm\.co\.nz$ -(^|\.)bestforchina\.org$ -(^|\.)bestgore\.com$ -(^|\.)bestpornstardb\.com$ -(^|\.)bestvpn\.com$ -(^|\.)bestvpnanalysis\.com$ -(^|\.)bestvpnserver\.com$ -(^|\.)bestvpnservice\.com$ -(^|\.)bestvpnusa\.com$ -(^|\.)bet365\.com$ -(^|\.)beta\.usejump\.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$ -(^|\.)bic2011\.org$ -(^|\.)bigfools\.com$ -(^|\.)bigjapanesesex\.com$ -(^|\.)bigmoney\.biz$ -(^|\.)bignews\.org$ -(^|\.)bigsound\.org$ -(^|\.)biliworld\.com$ -(^|\.)billypan\.com$ -(^|\.)binux\.me$ -(^|\.)bipic\.net$ -(^|\.)bit\.do$ -(^|\.)bit\.ly$ -(^|\.)bitc\.bme\.emory\.edu$ -(^|\.)bitcointalk\.org$ -(^|\.)bitmex\.com$ -(^|\.)bitshare\.com$ -(^|\.)bitsnoop\.com$ -(^|\.)bitvise\.com$ -(^|\.)bizhat\.com$ -(^|\.)bjnewlife\.org$ -(^|\.)bjs\.org$ -(^|\.)bjzc\.org$ -(^|\.)bl-doujinsouko\.com$ -(^|\.)blacklogic\.com$ -(^|\.)blackvpn\.com$ -(^|\.)blewpass\.com$ -(^|\.)blinkx\.com$ -(^|\.)blinw\.com$ -(^|\.)blip\.tv$ -(^|\.)blockcn\.com$ -(^|\.)blockless\.com$ -(^|\.)blog\.calibre-ebook\.com$ -(^|\.)blog\.cnyes\.com$ -(^|\.)blog\.daum\.net$ -(^|\.)blog\.de$ -(^|\.)blog\.exblog\.co\.jp$ -(^|\.)blog\.excite\.co\.jp$ -(^|\.)blog\.expofutures\.com$ -(^|\.)blog\.fizzik\.com$ -(^|\.)blog\.foolsmountain\.com$ -(^|\.)blog\.fuckgfw233\.org$ -(^|\.)blog\.goo\.ne\.jp$ -(^|\.)blog\.google$ -(^|\.)blog\.inoreader\.com$ -(^|\.)blog\.istef\.info$ -(^|\.)blog\.jackjia\.com$ -(^|\.)blog\.jp$ -(^|\.)blog\.kangye\.org$ -(^|\.)blog\.lester850\.info$ -(^|\.)blog\.martinoei\.com$ -(^|\.)blog\.pathtosharepoint\.com$ -(^|\.)blog\.pentalogic\.net$ -(^|\.)blog\.qooza\.hk$ -(^|\.)blog\.ranxiang\.com$ -(^|\.)blog\.sina\.com\.tw$ -(^|\.)blog\.sogoo\.org$ -(^|\.)blog\.soylent\.com$ -(^|\.)blog\.syx86\.cn$ -(^|\.)blog\.syx86\.com$ -(^|\.)blog\.taragana\.com$ -(^|\.)blog\.tiney\.com$ -(^|\.)blog\.xuite\.net$ -(^|\.)blog\.youthwant\.com\.tw$ -(^|\.)blog\.youxu\.info$ -(^|\.)blogblog\.com$ -(^|\.)blogcatalog\.com$ -(^|\.)blogcity\.me$ -(^|\.)blogdns\.org$ -(^|\.)blogger\.com$ -(^|\.)blogimg\.jp$ -(^|\.)bloglines\.com$ -(^|\.)bloglovin\.com$ -(^|\.)blogs\.icerocket\.com$ -(^|\.)blogs\.libraryinformationtechnology\.com$ -(^|\.)blogs\.tampabay\.com$ -(^|\.)blogs\.yahoo\.co\.jp$ -(^|\.)blogspot(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)blogtd\.net$ -(^|\.)blogtd\.org$ -(^|\.)bloodshed\.net$ -(^|\.)bloomberg\.cn$ -(^|\.)bloomberg\.com$ -(^|\.)bloomberg\.de$ -(^|\.)bloombergview\.com$ -(^|\.)bloomfortune\.com$ -(^|\.)blueangellive\.com$ -(^|\.)bmfinn\.com$ -(^|\.)bnews\.co$ -(^|\.)bnrmetal\.com$ -(^|\.)boardreader\.com$ -(^|\.)bod\.asia$ -(^|\.)bodog88\.com$ -(^|\.)bolehvpn\.net$ -(^|\.)bolin\.netfirms\.com$ -(^|\.)bonbonme\.com$ -(^|\.)bonbonsex\.com$ -(^|\.)bonfoundation\.org$ -(^|\.)bongacams\.com$ -(^|\.)boobstagram\.com$ -(^|\.)book\.com\.tw$ -(^|\.)book\.zi5\.me$ -(^|\.)bookepub\.com$ -(^|\.)books\.com\.tw$ -(^|\.)boomssr\.com$ -(^|\.)bot\.nu$ -(^|\.)botanwang\.com$ -(^|\.)bowenpress\.com$ -(^|\.)boxpn\.com$ -(^|\.)boxun$ -(^|\.)boxun\.com$ -(^|\.)boxun\.tv$ -(^|\.)boxunblog\.com$ -(^|\.)boxunclub\.com$ -(^|\.)boyangu\.com$ -(^|\.)boyfriendtv\.com$ -(^|\.)boysfood\.com$ -(^|\.)boysmaster\.com$ -(^|\.)br\.hao123\.com$ -(^|\.)br\.st$ -(^|\.)brainyquote\.com$ -(^|\.)brandonhutchinson\.com$ -(^|\.)braumeister\.org$ -(^|\.)bravotube\.net$ -(^|\.)brazzers\.com$ -(^|\.)break\.com$ -(^|\.)breakgfw\.com$ -(^|\.)breaking911\.com$ -(^|\.)breakingtweets\.com$ -(^|\.)breakwall\.net$ -(^|\.)briefdream\.com$ -(^|\.)briian\.com$ -(^|\.)brizzly\.com$ -(^|\.)brkmd\.com$ -(^|\.)broadbook\.com$ -(^|\.)broadpressinc\.com$ -(^|\.)brucewang\.net$ -(^|\.)brutaltgp\.com$ -(^|\.)bt2mag\.com$ -(^|\.)bt95\.com$ -(^|\.)btaia\.com$ -(^|\.)btbtav\.com$ -(^|\.)btdigg\.org$ -(^|\.)btku\.me$ -(^|\.)btku\.org$ -(^|\.)btspread\.com$ -(^|\.)budaedu\.org$ -(^|\.)buddhanet\.com\.tw$ -(^|\.)buddhistchannel\.tv$ -(^|\.)buffered\.com$ -(^|\.)bullog\.org$ -(^|\.)bullogger\.com$ -(^|\.)bunbunhk\.com$ -(^|\.)busayari\.com$ -(^|\.)businessinsider\.com$ -(^|\.)businessweek\.com$ -(^|\.)busu\.org$ -(^|\.)busytrade\.com$ -(^|\.)buugaa\.com$ -(^|\.)buy\.yahoo\.com\.tw$ -(^|\.)buzzhand\.com$ -(^|\.)buzzhand\.net$ -(^|\.)buzzorange\.com$ -(^|\.)bvpn\.com$ -(^|\.)bwsj\.hk$ -(^|\.)bx\.tl$ -(^|\.)bynet\.co\.il$ -(^|\.)c-est-simple\.com$ -(^|\.)c-spanvideo\.org$ -(^|\.)c100tibet\.org$ -(^|\.)c1522\.mooo\.com$ -(^|\.)cablegatesearch\.net$ -(^|\.)cachinese\.com$ -(^|\.)cacnw\.com$ -(^|\.)cactusvpn\.com$ -(^|\.)cafepress\.com$ -(^|\.)cahr\.org\.tw$ -(^|\.)calameo\.com$ -(^|\.)calebelston\.com$ -(^|\.)calgarychinese\.ca$ -(^|\.)calgarychinese\.com$ -(^|\.)calgarychinese\.net$ -(^|\.)cam4\.com$ -(^|\.)cam4\.jp$ -(^|\.)cam4\.sg$ -(^|\.)camfrog\.com$ -(^|\.)cams\.com$ -(^|\.)cams\.org\.sg$ -(^|\.)canadameet\.com$ -(^|\.)canalporno\.com$ -(^|\.)canyu\.org$ -(^|\.)cao\.im$ -(^|\.)caobian\.info$ -(^|\.)caochangqing\.com$ -(^|\.)cap\.org\.hk$ -(^|\.)carabinasypistolas\.com$ -(^|\.)cardinalkungfoundation\.org$ -(^|\.)carfax\.com$ -(^|\.)cari\.com\.my$ -(^|\.)caribbeancom\.com$ -(^|\.)carmotorshow\.com$ -(^|\.)cartoonmovement\.com$ -(^|\.)casadeltibetbcn\.org$ -(^|\.)casatibet\.org\.mx$ -(^|\.)casino\.williamhill\.com$ -(^|\.)casinobellini\.com$ -(^|\.)casinoking\.com$ -(^|\.)casinoriva\.com$ -(^|\.)castbox\.fm$ -(^|\.)catch22\.net$ -(^|\.)catfightpayperview\.xxx$ -(^|\.)catholic\.org\.hk$ -(^|\.)catholic\.org\.tw$ -(^|\.)cathvoice\.org\.tw$ -(^|\.)cattt\.com$ -(^|\.)cbc\.ca$ -(^|\.)cbs\.ntu\.edu\.tw$ -(^|\.)cbsnews\.com$ -(^|\.)cbtc\.org\.hk$ -(^|\.)cccat\.cc$ -(^|\.)cccat\.co$ -(^|\.)ccdtr\.org$ -(^|\.)cchere\.com$ -(^|\.)ccim\.org$ -(^|\.)cclife\.ca$ -(^|\.)cclife\.org$ -(^|\.)cclifefl\.org$ -(^|\.)ccthere\.com$ -(^|\.)cctmweb\.net$ -(^|\.)cctongbao\.com$ -(^|\.)ccue\.ca$ -(^|\.)ccue\.com$ -(^|\.)ccvoice\.ca$ -(^|\.)ccw\.org\.tw$ -(^|\.)cdbook\.org$ -(^|\.)cdcparty\.com$ -(^|\.)cdef\.org$ -(^|\.)cdig\.info$ -(^|\.)cdjp\.org$ -(^|\.)cdn$ -(^|\.)cdn-apple\.com$ -(^|\.)cdn-images\.mailchimp\.com$ -(^|\.)cdn\.assets\.lfpcontent\.com$ -(^|\.)cdn\.helixstudios\.net$ -(^|\.)cdn\.printfriendly\.com$ -(^|\.)cdn\.softlayer\.net$ -(^|\.)cdn1\.lp\.saboom\.com$ -(^|\.)cdnews\.com\.tw$ -(^|\.)cdninstagram\.com$ -(^|\.)cdp1989\.org$ -(^|\.)cdp1998\.org$ -(^|\.)cdp2006\.org$ -(^|\.)cdpa\.url\.tw$ -(^|\.)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$ -(^|\.)certificate\.revocationcheck\.com$ -(^|\.)cfhks\.org\.hk$ -(^|\.)cftfc\.com$ -(^|\.)cgdepot\.org$ -(^|\.)cgst\.edu$ -(^|\.)ch\.shvoong\.com$ -(^|\.)change\.org$ -(^|\.)changeip\.name$ -(^|\.)changeip\.net$ -(^|\.)changeip\.org$ -(^|\.)changp\.com$ -(^|\.)changsa\.net$ -(^|\.)channel8news\.sg$ -(^|\.)chapm25\.com$ -(^|\.)chatnook\.com$ -(^|\.)chaturbate\.com$ -(^|\.)chengmingmag\.com$ -(^|\.)chenguangcheng\.com$ -(^|\.)chenpokong\.com$ -(^|\.)chenpokong\.net$ -(^|\.)chenshan20042005\.wordpress\.com$ -(^|\.)cherrysave\.com$ -(^|\.)chhongbi\.org$ -(^|\.)chicagoncmtv\.com$ -(^|\.)china-mmm\.jp\.net$ -(^|\.)china-mmm\.net$ -(^|\.)china-mmm\.sa\.com$ -(^|\.)china-review\.com\.ua$ -(^|\.)china-week\.com$ -(^|\.)china\.hket\.com$ -(^|\.)china\.ucanews\.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$ -(^|\.)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$ -(^|\.)chinese\.donga\.com$ -(^|\.)chinese\.engadget\.com$ -(^|\.)chinese\.irib\.ir$ -(^|\.)chinese\.soifind\.com$ -(^|\.)chinesedaily\.com$ -(^|\.)chinesedailynews\.com$ -(^|\.)chinesedemocracy\.com$ -(^|\.)chinesegay\.org$ -(^|\.)chinesen\.de$ -(^|\.)chinesepen\.org$ -(^|\.)chinesetalks\.net$ -(^|\.)chineseupress\.com$ -(^|\.)chingcheong\.com$ -(^|\.)chinman\.net$ -(^|\.)chithu\.org$ -(^|\.)chn\.chosun\.com$ -(^|\.)chrdnet\.com$ -(^|\.)christianfreedom\.org$ -(^|\.)christianstudy\.com$ -(^|\.)christiantimes\.org\.hk$ -(^|\.)christusrex\.org$ -(^|\.)chrlawyers\.hk$ -(^|\.)chrome\.com$ -(^|\.)chromecast\.com$ -(^|\.)chromeexperiments\.com$ -(^|\.)chromercise\.com$ -(^|\.)chromestatus\.com$ -(^|\.)chromium\.org$ -(^|\.)chuang-yen\.org$ -(^|\.)chubold\.com$ -(^|\.)chubun\.com$ -(^|\.)chuizi\.net$ -(^|\.)churchinhongkong\.org$ -(^|\.)chushigangdrug\.ch$ -(^|\.)cienen\.com$ -(^|\.)cineastentreff\.de$ -(^|\.)cipfg\.org$ -(^|\.)circlethebayfortibet\.org$ -(^|\.)citizencn\.com$ -(^|\.)citizenlab\.org$ -(^|\.)citizenscommission\.hk$ -(^|\.)citizensradio\.org$ -(^|\.)city365\.ca$ -(^|\.)city9x\.com$ -(^|\.)citypopulation\.de$ -(^|\.)citytalk\.tw$ -(^|\.)civicparty\.hk$ -(^|\.)civildisobediencemovement\.org$ -(^|\.)civilhrfront\.org$ -(^|\.)civiliangunner\.com$ -(^|\.)civilmedia\.tw$ -(^|\.)ck101\.com$ -(^|\.)cl\.d0z\.net$ -(^|\.)clarionproject\.org$ -(^|\.)classicalguitarblog\.net$ -(^|\.)clb\.org\.hk$ -(^|\.)cldr\.unicode\.org$ -(^|\.)cleansite\.biz$ -(^|\.)cleansite\.info$ -(^|\.)cleansite\.us$ -(^|\.)clearharmony\.net$ -(^|\.)clearwisdom\.net$ -(^|\.)clementine-player\.org$ -(^|\.)cling\.omy\.sg$ -(^|\.)clinica-tibet\.ru$ -(^|\.)clipfish\.de$ -(^|\.)cloakpoint\.com$ -(^|\.)cloud\.mail\.ru$ -(^|\.)club1069\.com$ -(^|\.)cmi\.org\.tw$ -(^|\.)cmp\.hku\.hk$ -(^|\.)cms\.gov$ -(^|\.)cmule\.com$ -(^|\.)cmule\.org$ -(^|\.)cn-proxy\.com$ -(^|\.)cn\.calameo\.com$ -(^|\.)cn\.dayabook\.com$ -(^|\.)cn\.fmnnow\.com$ -(^|\.)cn\.freeones\.com$ -(^|\.)cn\.giganews\.com$ -(^|\.)cn\.ibtimes\.com$ -(^|\.)cn\.nytstyle\.com$ -(^|\.)cn\.sandscotaicentral\.com$ -(^|\.)cn\.shafaqna\.com$ -(^|\.)cn\.streetvoice\.com$ -(^|\.)cn\.uncyclopedia\.wikia\.com$ -(^|\.)cn\.uptodown\.com$ -(^|\.)cn\.voa\.mobi$ -(^|\.)cn2\.streetvoice\.com$ -(^|\.)cn6\.eu$ -(^|\.)cna\.com\.tw$ -(^|\.)cnabc\.com$ -(^|\.)cnbbnews\.wordpress\.com$ -(^|\.)cnd\.org$ -(^|\.)cnex\.org\.cn$ -(^|\.)cnineu\.com$ -(^|\.)cnn\.com$ -(^|\.)cnnews\.chosun\.com$ -(^|\.)cnpolitics\.org$ -(^|\.)cnproxy\.com$ -(^|\.)co\.ng\.mil$ -(^|\.)coat\.co\.jp$ -(^|\.)cochina\.co$ -(^|\.)cochina\.org$ -(^|\.)code1984\.com$ -(^|\.)codeshare\.io$ -(^|\.)codeskulptor\.org$ -(^|\.)collateralmurder\.com$ -(^|\.)collateralmurder\.org$ -(^|\.)com\.google$ -(^|\.)comefromchina\.com$ -(^|\.)comic-mega\.me$ -(^|\.)commandarms\.com$ -(^|\.)commentshk\.com$ -(^|\.)communistcrimes\.org$ -(^|\.)community\.windy\.com$ -(^|\.)communitychoicecu\.com$ -(^|\.)compileheart\.com$ -(^|\.)compress\.to$ -(^|\.)connect\.facebook\.net$ -(^|\.)conoha\.jp$ -(^|\.)contactmagazine\.net$ -(^|\.)contests\.twilio\.com$ -(^|\.)convio\.net$ -(^|\.)coobay\.com$ -(^|\.)coolaler\.com$ -(^|\.)coolder\.com$ -(^|\.)coolloud\.org\.tw$ -(^|\.)coolncute\.com$ -(^|\.)corumcollege\.com$ -(^|\.)cos-moe\.com$ -(^|\.)cosmic\.monar\.ch$ -(^|\.)cosplayjav\.pl$ -(^|\.)cotweet\.com$ -(^|\.)coursehero\.com$ -(^|\.)cpj\.org$ -(^|\.)cq99\.us$ -(^|\.)crackle\.com$ -(^|\.)crazys\.cc$ -(^|\.)crchina\.org$ -(^|\.)crd-net\.org$ -(^|\.)creaders\.net$ -(^|\.)creadersnet\.com$ -(^|\.)creativelab5\.com$ -(^|\.)cristyli\.com$ -(^|\.)crocotube\.com$ -(^|\.)crossfire\.co\.kr$ -(^|\.)crossthewall\.net$ -(^|\.)crossvpn\.net$ -(^|\.)crrev\.com$ -(^|\.)crucial\.com$ -(^|\.)csdparty\.com$ -(^|\.)css\.pixnet\.in$ -(^|\.)csuchen\.de$ -(^|\.)csw\.org\.uk$ -(^|\.)ct\.org\.tw$ -(^|\.)ctao\.org$ -(^|\.)ctfriend\.net$ -(^|\.)cthlo\.github\.io$ -(^|\.)ctitv\.com\.tw$ -(^|\.)cts\.com\.tw$ -(^|\.)cuhkacs\.org$ -(^|\.)cuihua\.org$ -(^|\.)cuiweiping\.net$ -(^|\.)culture\.tw$ -(^|\.)cumlouder\.com$ -(^|\.)curvefish\.com$ -(^|\.)cusu\.hk$ -(^|\.)cw\.com\.tw$ -(^|\.)cyberghost\.natado\.com$ -(^|\.)cyberghostvpn\.com$ -(^|\.)cynscribe\.com$ -(^|\.)cytode\.us$ -(^|\.)d-fukyu\.com$ -(^|\.)d100\.net$ -(^|\.)d1b183sg0nvnuh\.cloudfront\.net$ -(^|\.)d1c37gjwa26taa\.cloudfront\.net$ -(^|\.)d2bay\.com$ -(^|\.)d2pass\.com$ -(^|\.)d3c33hcgiwev3\.cloudfront\.net$ -(^|\.)d3rhr7kgmtrq1v\.cloudfront\.net$ -(^|\.)dabr\.co\.uk$ -(^|\.)dabr\.eu$ -(^|\.)dabr\.me$ -(^|\.)dabr\.mobi$ -(^|\.)dadazim\.com$ -(^|\.)dadi360\.com$ -(^|\.)dafagood\.com$ -(^|\.)dafahao\.com$ -(^|\.)dafoh\.org$ -(^|\.)dagelijksestandaard\.nl$ -(^|\.)daidostup\.ru$ -(^|\.)dailidaili\.com$ -(^|\.)dailymotion\.com$ -(^|\.)dailynews\.sina\.com$ -(^|\.)dailynews\.sina\.com%2f$ -(^|\.)daiphapinfo\.net$ -(^|\.)dajiyuan\.com$ -(^|\.)dajiyuan\.de$ -(^|\.)dajiyuan\.eu$ -(^|\.)dajusha\.baywords\.com$ -(^|\.)dalailama-archives\.org$ -(^|\.)dalailama\.com$ -(^|\.)dalailama\.mn$ -(^|\.)dalailama\.ru$ -(^|\.)dalailama\.usc\.edu$ -(^|\.)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$ -(^|\.)danbooru\.donmai\.us$ -(^|\.)danke4china\.net$ -(^|\.)danwei\.org$ -(^|\.)daodu14\.jigsy\.com$ -(^|\.)daolan\.net$ -(^|\.)daozhongxing\.org$ -(^|\.)darktech\.org$ -(^|\.)darktoy\.net$ -(^|\.)darpa\.mil$ -(^|\.)dastrassi\.org$ -(^|\.)data-vocabulary\.org$ -(^|\.)data\.flurry\.com$ -(^|\.)data\.gov\.tw$ -(^|\.)david-kilgour\.com$ -(^|\.)dawangidc\.com$ -(^|\.)daxa\.cn$ -(^|\.)daylife\.com$ -(^|\.)db\.tt$ -(^|\.)dbc\.hk$ -(^|\.)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$ -(^|\.)deaftone\.com$ -(^|\.)debug\.com$ -(^|\.)deck\.ly$ -(^|\.)decodet\.co$ -(^|\.)deepmind\.com$ -(^|\.)deezer\.com$ -(^|\.)definebabe\.com$ -(^|\.)deja\.com$ -(^|\.)delcamp\.net$ -(^|\.)delicious\.com$ -(^|\.)demo\.opera-mini\.net$ -(^|\.)democrats\.org$ -(^|\.)depositphotos\.com$ -(^|\.)derekhsu\.homeip\.net$ -(^|\.)desc\.se$ -(^|\.)design\.google$ -(^|\.)desipro\.de$ -(^|\.)dessci\.com$ -(^|\.)destiny\.xfiles\.to$ -(^|\.)destroy-china\.jp$ -(^|\.)deutsche-welle\.de$ -(^|\.)developers\.box\.net$ -(^|\.)devio\.us$ -(^|\.)devpn\.com$ -(^|\.)dfas\.mil$ -(^|\.)dfn\.org$ -(^|\.)dharamsalanet\.com$ -(^|\.)dharmakara\.net$ -(^|\.)dhcp\.biz$ -(^|\.)diaoyuislands\.org$ -(^|\.)dictionary\.goo\.ne\.jp$ -(^|\.)digiland\.tw$ -(^|\.)digisfera\.com$ -(^|\.)digitalnomadsproject\.org$ -(^|\.)diigo\.com$ -(^|\.)dilber\.se$ -(^|\.)dingchin\.com\.tw$ -(^|\.)dipity\.com$ -(^|\.)directcreative\.com$ -(^|\.)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$ -(^|\.)dl\.box\.net$ -(^|\.)dlsite\.com$ -(^|\.)dlyoutube\.com$ -(^|\.)dm530\.net$ -(^|\.)dmcdn\.net$ -(^|\.)dmm\.co\.jp$ -(^|\.)dns-dns\.com$ -(^|\.)dns-stuff\.com$ -(^|\.)dns04\.com$ -(^|\.)dns05\.com$ -(^|\.)dns1\.us$ -(^|\.)dns2\.us$ -(^|\.)dns2go\.com$ -(^|\.)dnscrypt\.org$ -(^|\.)dnset\.com$ -(^|\.)dnsrd\.com$ -(^|\.)dnssec\.net$ -(^|\.)dnvod\.tv$ -(^|\.)doctorvoice\.org$ -(^|\.)dogfartnetwork\.com$ -(^|\.)dojin\.com$ -(^|\.)dok-forum\.net$ -(^|\.)dolc\.de$ -(^|\.)dolf\.org\.hk$ -(^|\.)dollf\.com$ -(^|\.)domain\.club\.tw$ -(^|\.)domainhelp\.search\.com$ -(^|\.)domains\.google$ -(^|\.)domaintoday\.com\.au$ -(^|\.)dongtaiwang\.com$ -(^|\.)dongtaiwang\.net$ -(^|\.)dongyangjing\.com$ -(^|\.)dontfilter\.us$ -(^|\.)dontmovetochina\.com$ -(^|\.)dorjeshugden\.com$ -(^|\.)dotplane\.com$ -(^|\.)dotsub\.com$ -(^|\.)dotvpn\.com$ -(^|\.)doub\.io$ -(^|\.)dougscripts\.com$ -(^|\.)douhokanko\.net$ -(^|\.)doujincafe\.com$ -(^|\.)dowei\.org$ -(^|\.)download\.aircrack-ng\.org$ -(^|\.)download\.cnet\.com$ -(^|\.)download\.ithome\.com\.tw$ -(^|\.)dphk\.org$ -(^|\.)dpp\.org\.tw$ -(^|\.)dpr\.info$ -(^|\.)dragonsprings\.org$ -(^|\.)dreamamateurs\.com$ -(^|\.)drepung\.org$ -(^|\.)drgan\.net$ -(^|\.)drmingxia\.org$ -(^|\.)dropbooks\.tv$ -(^|\.)dropbox\.com$ -(^|\.)dropboxusercontent\.com$ -(^|\.)drsunacademy\.com$ -(^|\.)drtuber\.com$ -(^|\.)dscn\.info$ -(^|\.)dsmtp\.com$ -(^|\.)dstk\.dk$ -(^|\.)dtdns\.net$ -(^|\.)dtiblog\.com$ -(^|\.)dtic\.mil$ -(^|\.)dtwang\.org$ -(^|\.)duanzhihu\.com$ -(^|\.)duck\.com$ -(^|\.)duckdns\.org$ -(^|\.)duckduckgo-owned-server\.yahoo\.net$ -(^|\.)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$ -(^|\.)dvorak\.org$ -(^|\.)dw-world\.com$ -(^|\.)dw-world\.de$ -(^|\.)dw\.com$ -(^|\.)dw\.de$ -(^|\.)dwnews\.com$ -(^|\.)dwnews\.net$ -(^|\.)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$ -(^|\.)dynupdate\.no-ip\.com$ -(^|\.)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$ -(^|\.)eastturkistancc\.org$ -(^|\.)eastturkistangovernmentinexile\.us$ -(^|\.)easyca\.ca$ -(^|\.)easypic\.com$ -(^|\.)ebony-beauty\.com$ -(^|\.)ebook\.hyread\.com\.tw$ -(^|\.)ebookbrowse\.com$ -(^|\.)ebookee\.com$ -(^|\.)ecfa\.org\.tw$ -(^|\.)echofon\.com$ -(^|\.)ecimg\.tw$ -(^|\.)ecministry\.net$ -(^|\.)economist\.com$ -(^|\.)ecsm\.vs\.com$ -(^|\.)edgecastcdn\.net$ -(^|\.)edicypages\.com$ -(^|\.)edmontonchina\.cn$ -(^|\.)edmontonservice\.com$ -(^|\.)edns\.biz$ -(^|\.)edoors\.com$ -(^|\.)edubridge\.com$ -(^|\.)edupro\.org$ -(^|\.)eeas\.europa\.eu$ -(^|\.)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$ -(^|\.)elpais\.com$ -(^|\.)eltondisney\.com$ -(^|\.)emaga\.com$ -(^|\.)emanna\.com$ -(^|\.)embr\.in$ -(^|\.)emilylau\.org\.hk$ -(^|\.)empfil\.com$ -(^|\.)emule-ed2k\.com$ -(^|\.)emulefans\.com$ -(^|\.)emuparadise\.me$ -(^|\.)en\.favotter\.net$ -(^|\.)en\.hao123\.com$ -(^|\.)enanyang\.my$ -(^|\.)enewstree\.com$ -(^|\.)enfal\.de$ -(^|\.)engagedaily\.org$ -(^|\.)englishforeveryone\.org$ -(^|\.)englishfromengland\.co\.uk$ -(^|\.)englishpen\.org$ -(^|\.)enlighten\.org\.tw$ -(^|\.)entermap\.com$ -(^|\.)entnt\.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$ -(^|\.)etaa\.org\.au$ -(^|\.)etadult\.com$ -(^|\.)etaiwannews\.com$ -(^|\.)etizer\.org$ -(^|\.)etokki\.com$ -(^|\.)etools\.ncol\.com$ -(^|\.)etowns\.net$ -(^|\.)etowns\.org$ -(^|\.)ettoday\.net$ -(^|\.)etvonline\.hk$ -(^|\.)eu\.org$ -(^|\.)eucasino\.com$ -(^|\.)eulam\.com$ -(^|\.)eurekavpt\.com$ -(^|\.)evchk\.wikia\.com$ -(^|\.)evschool\.net$ -(^|\.)exblog\.jp$ -(^|\.)exchristian\.hk$ -(^|\.)exmormon\.org$ -(^|\.)expatshield\.com$ -(^|\.)expecthim\.com$ -(^|\.)expekt\.com$ -(^|\.)experts-univers\.com$ -(^|\.)exploader\.net$ -(^|\.)expressvpn\.com$ -(^|\.)extmatrix\.com$ -(^|\.)extremetube\.com$ -(^|\.)eyevio\.jp$ -(^|\.)eyny\.com$ -(^|\.)ezpc\.tk$ -(^|\.)ezpeer\.com$ -(^|\.)ezua\.com$ -(^|\.)fa\.gov\.tw$ -(^|\.)facebook\.br$ -(^|\.)facebook\.com$ -(^|\.)facebook\.design$ -(^|\.)facebook\.hu$ -(^|\.)facebook\.in$ -(^|\.)facebook\.nl$ -(^|\.)facebook\.se$ -(^|\.)facebookquotes4u\.com$ -(^|\.)faceless\.me$ -(^|\.)facesofnyfw\.com$ -(^|\.)facesoftibetanselfimmolators\.info$ -(^|\.)fail\.hk$ -(^|\.)faith100\.org$ -(^|\.)faithfuleye\.com$ -(^|\.)faiththedog\.info$ -(^|\.)fakku\.net$ -(^|\.)falsefire\.com$ -(^|\.)falun-co\.org$ -(^|\.)falun-ny\.net$ -(^|\.)falun\.caltech\.edu$ -(^|\.)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$ -(^|\.)fangbinxing\.com$ -(^|\.)fangeming\.com$ -(^|\.)fangeqiang\.com$ -(^|\.)fanglizhi\.info$ -(^|\.)fangmincn\.org$ -(^|\.)fangong\.forums-free\.com$ -(^|\.)fangong\.org$ -(^|\.)fangongheike\.com$ -(^|\.)fanhaodang\.com$ -(^|\.)fanqiang\.tk$ -(^|\.)fanqianghou\.com$ -(^|\.)fanqiangyakexi\.net$ -(^|\.)fanqiangzhe\.com$ -(^|\.)fanswong\.com$ -(^|\.)fanyue\.info$ -(^|\.)fapdu\.com$ -(^|\.)faproxy\.com$ -(^|\.)faqserv\.com$ -(^|\.)fartit\.com$ -(^|\.)farwestchina\.com$ -(^|\.)fast\.wistia\.com$ -(^|\.)fastpic\.ru$ -(^|\.)fastssh\.com$ -(^|\.)faststone\.org$ -(^|\.)favstar\.fm$ -(^|\.)fawanghuihui\.org$ -(^|\.)faydao\.com$ -(^|\.)fb\.com$ -(^|\.)fb\.me$ -(^|\.)fbcdn\.net$ -(^|\.)fbsbx\.com$ -(^|\.)fc2\.com$ -(^|\.)fc2blog\.net$ -(^|\.)fc2china\.com$ -(^|\.)fc2cn\.com$ -(^|\.)fda\.gov\.tw$ -(^|\.)fdc64\.de$ -(^|\.)fdc64\.org$ -(^|\.)fdc89\.jp$ -(^|\.)feedburner\.com$ -(^|\.)feeds\.fileforum\.com$ -(^|\.)feelssh\.com$ -(^|\.)feer\.com$ -(^|\.)feifeiss\.com$ -(^|\.)feitian-california\.org$ -(^|\.)feitianacademy\.org$ -(^|\.)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$ -(^|\.)files2me\.com$ -(^|\.)fileserve\.com$ -(^|\.)filesor\.com$ -(^|\.)fillthesquare\.org$ -(^|\.)filmingfortibet\.org$ -(^|\.)filmy\.olabloga\.pl$ -(^|\.)filthdump\.com$ -(^|\.)financetwitter\.com$ -(^|\.)finchvpn\.com$ -(^|\.)findmespot\.com$ -(^|\.)findyoutube\.com$ -(^|\.)fingerdaily\.com$ -(^|\.)finler\.net$ -(^|\.)firearmsworld\.net$ -(^|\.)firebaseio\.com$ -(^|\.)fireofliberty\.org$ -(^|\.)firetweet\.io$ -(^|\.)firstfivefollowers\.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$ -(^|\.)fochk\.org$ -(^|\.)focustaiwan\.tw$ -(^|\.)focusvpn\.com$ -(^|\.)fofg-europe\.net$ -(^|\.)fofg\.org$ -(^|\.)fofldfradio\.org$ -(^|\.)fooooo\.com$ -(^|\.)footwiball\.com$ -(^|\.)forum\.baby-kingdom\.com$ -(^|\.)forum\.cyberctm\.com$ -(^|\.)forum\.idsam\.com$ -(^|\.)forum\.my903\.com$ -(^|\.)forum\.mymaji\.com$ -(^|\.)forum\.omy\.sg$ -(^|\.)forum\.palmislife\.com$ -(^|\.)forum\.setty\.com\.tw$ -(^|\.)forum\.sina\.com\.hk$ -(^|\.)forum\.slime\.com\.tw$ -(^|\.)forum\.tvb\.com$ -(^|\.)forum\.xinbao\.de$ -(^|\.)forum4hk\.com$ -(^|\.)fotile\.me$ -(^|\.)fourface\.nodesnoop\.com$ -(^|\.)fourthinternational\.org$ -(^|\.)foxdie\.us$ -(^|\.)foxgay\.com$ -(^|\.)foxsub\.com$ -(^|\.)foxtang\.com$ -(^|\.)fpmt-osel\.org$ -(^|\.)fpmt\.org$ -(^|\.)fpmt\.tw$ -(^|\.)fpmtmexico\.org$ -(^|\.)fq\.wikia\.com$ -(^|\.)fqok\.org$ -(^|\.)fqrouter\.com$ -(^|\.)franklc\.com$ -(^|\.)freakshare\.com$ -(^|\.)free-gate\.org$ -(^|\.)free-hada-now\.org$ -(^|\.)free-proxy\.cz$ -(^|\.)free-ssh\.com$ -(^|\.)free\.fr$ -(^|\.)free4u\.com\.ar$ -(^|\.)freealim\.com$ -(^|\.)freebrowser\.org$ -(^|\.)freechal\.com$ -(^|\.)freechina\.net$ -(^|\.)freechina\.news$ -(^|\.)freechinaforum\.org$ -(^|\.)freeddns\.com$ -(^|\.)freeddns\.org$ -(^|\.)freedomchina\.info$ -(^|\.)freedomcollection\.org$ -(^|\.)freedomhouse\.org$ -(^|\.)freedominfonetweb\.wordpress\.com$ -(^|\.)freedomsherald\.org$ -(^|\.)freeforums\.org$ -(^|\.)freefq\.com$ -(^|\.)freefuckvids\.com$ -(^|\.)freegao\.com$ -(^|\.)freeilhamtohti\.org$ -(^|\.)freekwonpyong\.org$ -(^|\.)freelotto\.com$ -(^|\.)freeman2\.com$ -(^|\.)freemoren\.com$ -(^|\.)freemorenews\.com$ -(^|\.)freemuse\.org$ -(^|\.)freenet$ -(^|\.)freenet-china\.org$ -(^|\.)freenetproject\.org$ -(^|\.)freenewscn\.com$ -(^|\.)freeopenvpn\.com$ -(^|\.)freeoz\.org$ -(^|\.)freessh\.us$ -(^|\.)freetcp\.com$ -(^|\.)freetibet\.net$ -(^|\.)freetibet\.org$ -(^|\.)freetibetanheroes\.org$ -(^|\.)freeviewmovies\.com$ -(^|\.)freevpn\.me$ -(^|\.)freevpn\.nl$ -(^|\.)freewallpaper4\.me$ -(^|\.)freewebs\.com$ -(^|\.)freewechat\.com$ -(^|\.)freeweibo\.com$ -(^|\.)freewww\.biz$ -(^|\.)freewww\.info$ -(^|\.)freexinwen\.com$ -(^|\.)freeyellow\.com$ -(^|\.)freeyoutubeproxy\.net$ -(^|\.)friendfeed-media\.com$ -(^|\.)friendfeed\.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$ -(^|\.)fucd\.com$ -(^|\.)fuckcnnic\.net$ -(^|\.)fuckgfw\.org$ -(^|\.)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$ -(^|\.)g6hentai\.com$ -(^|\.)gabocorp\.com$ -(^|\.)gaeproxy\.com$ -(^|\.)gaforum\.org$ -(^|\.)galaxymacau\.com$ -(^|\.)galenwu\.com$ -(^|\.)galstars\.net$ -(^|\.)game735\.com$ -(^|\.)gamebase\.com\.tw$ -(^|\.)gamejolt\.com$ -(^|\.)gamer\.com\.tw$ -(^|\.)gamez\.com\.tw$ -(^|\.)gamousa\.com$ -(^|\.)ganges\.com$ -(^|\.)gaoming\.net$ -(^|\.)gaopi\.net$ -(^|\.)gaozhisheng\.net$ -(^|\.)gaozhisheng\.org$ -(^|\.)gardennetworks\.com$ -(^|\.)gardennetworks\.org$ -(^|\.)gartlive\.com$ -(^|\.)gate-project\.com$ -(^|\.)gather\.com$ -(^|\.)gatherproxy\.com$ -(^|\.)gati\.org\.tw$ -(^|\.)gaybubble\.com$ -(^|\.)gaycn\.net$ -(^|\.)gayhub\.com$ -(^|\.)gaymap\.cc$ -(^|\.)gaytube\.com$ -(^|\.)gaywatch\.com$ -(^|\.)gazotube\.com$ -(^|\.)gcc\.org\.hk$ -(^|\.)gclooney\.com$ -(^|\.)gcpnews\.com$ -(^|\.)gcr\.io$ -(^|\.)gdbt\.net$ -(^|\.)gdzf\.org$ -(^|\.)geek-art\.net$ -(^|\.)geekerhome\.com$ -(^|\.)geekheart\.info$ -(^|\.)gekikame\.com$ -(^|\.)gelbooru\.com$ -(^|\.)geocities\.co\.jp$ -(^|\.)geocities\.com$ -(^|\.)geocities\.jp$ -(^|\.)gerefoundation\.org$ -(^|\.)get\.how$ -(^|\.)getastrill\.com$ -(^|\.)getchu\.com$ -(^|\.)getcloak\.com$ -(^|\.)getfoxyproxy\.org$ -(^|\.)getfreedur\.com$ -(^|\.)getgom\.com$ -(^|\.)geti2p\.net$ -(^|\.)getiton\.com$ -(^|\.)getjetso\.com$ -(^|\.)getlantern\.org$ -(^|\.)getmdl\.io$ -(^|\.)getsocialscope\.com$ -(^|\.)getsync\.com$ -(^|\.)gettrials\.com$ -(^|\.)gettyimages\.com$ -(^|\.)getuploader\.com$ -(^|\.)gfbv\.de$ -(^|\.)gfgold\.com\.hk$ -(^|\.)gfsale\.com$ -(^|\.)gfw\.org\.ua$ -(^|\.)gfw\.press$ -(^|\.)ggpht\.com$ -(^|\.)ggssl\.com$ -(^|\.)ghost\.org$ -(^|\.)ghostpath\.com$ -(^|\.)ghut\.org$ -(^|\.)giantessnight\.com$ -(^|\.)gifree\.com$ -(^|\.)giga-web\.jp$ -(^|\.)gigporno\.ru$ -(^|\.)girlbanker\.com$ -(^|\.)git\.io$ -(^|\.)gizlen\.net$ -(^|\.)gjczz\.com$ -(^|\.)glass8\.eu$ -(^|\.)global\.bing\.com$ -(^|\.)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$ -(^|\.)gmbd\.cn$ -(^|\.)gmhz\.org$ -(^|\.)gmll\.org$ -(^|\.)gmodules\.com$ -(^|\.)gmozomg\.izihost\.org$ -(^|\.)gnci\.org\.hk$ -(^|\.)go-pki\.com$ -(^|\.)go\.nesnode\.com$ -(^|\.)go141\.com$ -(^|\.)goagent\.biz$ -(^|\.)goagent\.codeplex\.com$ -(^|\.)goagentplus\.com$ -(^|\.)gobet\.cc$ -(^|\.)godfootsteps\.org$ -(^|\.)godns\.work$ -(^|\.)godoc\.org$ -(^|\.)godsdirectcontact\.co\.uk$ -(^|\.)godsdirectcontact\.org$ -(^|\.)godsdirectcontact\.org\.tw$ -(^|\.)godsimmediatecontact\.com$ -(^|\.)gogotunnel\.com$ -(^|\.)gohappy\.com\.tw$ -(^|\.)gojet\.krtco\.com\.tw$ -(^|\.)gokbayrak\.com$ -(^|\.)golang\.org$ -(^|\.)goldbet\.com$ -(^|\.)goldbetsports\.com$ -(^|\.)goldeneyevault\.com$ -(^|\.)goldenfrog\.com$ -(^|\.)goldjizz\.com$ -(^|\.)goldstep\.net$ -(^|\.)goldwave\.com$ -(^|\.)gongm\.in$ -(^|\.)gongmeng\.info$ -(^|\.)gongminliliang\.com$ -(^|\.)gongwt\.com$ -(^|\.)goo\.gl$ -(^|\.)gooday\.xyz$ -(^|\.)gooddns\.info$ -(^|\.)goodreaders\.com$ -(^|\.)goodreads\.com$ -(^|\.)goodtv\.com\.tw$ -(^|\.)goodtv\.tv$ -(^|\.)goofind\.com$ -(^|\.)google(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapis(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapps\.com$ -(^|\.)googlearth\.com$ -(^|\.)googleartproject\.com$ -(^|\.)googleblog\.com$ -(^|\.)googlebot\.com$ -(^|\.)googlechinawebmaster\.com$ -(^|\.)googlecode\.com$ -(^|\.)googlecommerce\.com$ -(^|\.)googledomains\.com$ -(^|\.)googledrive\.com$ -(^|\.)googleearth\.com$ -(^|\.)googlegroups\.com$ -(^|\.)googlehosted\.com$ -(^|\.)googleideas\.com$ -(^|\.)googleinsidesearch\.com$ -(^|\.)googlelabs\.com$ -(^|\.)googlemail\.com$ -(^|\.)googlemashups\.com$ -(^|\.)googlepagecreator\.com$ -(^|\.)googleplay\.com$ -(^|\.)googleplus\.com$ -(^|\.)googlescholar\.com$ -(^|\.)googlesile\.com$ -(^|\.)googlesource\.com$ -(^|\.)googleusercontent\.com$ -(^|\.)googlevideo\.com$ -(^|\.)googleweblight\.com$ -(^|\.)googlezip\.net$ -(^|\.)gopetition\.com$ -(^|\.)goproxing\.net$ -(^|\.)gospelherald\.com$ -(^|\.)got-game\.org$ -(^|\.)gotdns\.ch$ -(^|\.)gotgeeks\.com$ -(^|\.)gotrusted\.com$ -(^|\.)gotw\.ca$ -(^|\.)gov\.taipei$ -(^|\.)gov\.tw$ -(^|\.)gr8domain\.biz$ -(^|\.)gr8name\.biz$ -(^|\.)grammaly\.com$ -(^|\.)grandtrial\.org$ -(^|\.)grangorz\.org$ -(^|\.)graphis\.ne\.jp$ -(^|\.)graphql\.org$ -(^|\.)greasespot\.net$ -(^|\.)great-firewall\.com$ -(^|\.)great-roc\.org$ -(^|\.)greatfire\.org$ -(^|\.)greatfire\.us7\.list-manage\.com$ -(^|\.)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$ -(^|\.)groups\.google\.cn$ -(^|\.)gs-discuss\.com$ -(^|\.)gstatic\.com$ -(^|\.)gtricks\.com$ -(^|\.)gts-vpn\.com$ -(^|\.)gu-chu-sum\.org$ -(^|\.)guaguass\.com$ -(^|\.)guaguass\.org$ -(^|\.)guancha\.org$ -(^|\.)guangming\.com\.my$ -(^|\.)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$ -(^|\.)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$ -(^|\.)hackthatphone\.net$ -(^|\.)hahlo\.com$ -(^|\.)hakkatv\.org\.tw$ -(^|\.)handcraftedsoftware\.org$ -(^|\.)hanunyi\.com$ -(^|\.)hao\.news$ -(^|\.)haoel\.github\.io$ -(^|\.)happy-vpn\.com$ -(^|\.)haproxy\.org$ -(^|\.)hardsextube\.com$ -(^|\.)harunyahya\.com$ -(^|\.)hautelook\.com$ -(^|\.)hautelookcdn\.com$ -(^|\.)have8\.com$ -(^|\.)hclips\.com$ -(^|\.)hd\.stheadline\.com$ -(^|\.)hdlt\.me$ -(^|\.)hdtvb\.net$ -(^|\.)hdzog\.com$ -(^|\.)heartyit\.com$ -(^|\.)hec\.su$ -(^|\.)hecaitou\.net$ -(^|\.)hechaji\.com$ -(^|\.)heeact\.edu\.tw$ -(^|\.)hegre-art\.com$ -(^|\.)heix\.pp\.ru$ -(^|\.)helloandroid\.com$ -(^|\.)helloqueer\.com$ -(^|\.)helloss\.pw$ -(^|\.)hellotxt\.com$ -(^|\.)hellouk\.org$ -(^|\.)help\.linksalpha\.com$ -(^|\.)helpeachpeople\.com$ -(^|\.)helplinfen\.com$ -(^|\.)helpster\.de$ -(^|\.)helpzhuling\.org$ -(^|\.)hentai\.to$ -(^|\.)hentaitube\.tv$ -(^|\.)hentaivideoworld\.com$ -(^|\.)heqinglian\.net$ -(^|\.)heungkongdiscuss\.com$ -(^|\.)hexieshe\.com$ -(^|\.)hexieshe\.xyz$ -(^|\.)hexxeh\.net$ -(^|\.)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$ -(^|\.)hihiforum\.com$ -(^|\.)hihistory\.net$ -(^|\.)hiitch\.com$ -(^|\.)hikinggfw\.org$ -(^|\.)hilive\.tv$ -(^|\.)himalayan-foundation\.org$ -(^|\.)himalayanglacier\.com$ -(^|\.)himemix\.com$ -(^|\.)himemix\.net$ -(^|\.)hitomi\.la$ -(^|\.)hiwifi\.com$ -(^|\.)hizb-ut-tahrir\.info$ -(^|\.)hizb-ut-tahrir\.org$ -(^|\.)hizbuttahrir\.org$ -(^|\.)hjclub\.info$ -(^|\.)hk-pub\.com$ -(^|\.)hk\.frienddy\.com$ -(^|\.)hk\.geocities\.com$ -(^|\.)hk\.gradconnection\.com$ -(^|\.)hk\.hao123img\.com$ -(^|\.)hk\.jiepang\.com$ -(^|\.)hk\.knowledge\.yahoo\.com$ -(^|\.)hk\.myblog\.yahoo\.com$ -(^|\.)hk\.news\.yahoo\.com$ -(^|\.)hk\.rd\.yahoo\.com$ -(^|\.)hk\.search\.yahoo\.com$ -(^|\.)hk\.video\.news\.yahoo\.com$ -(^|\.)hk\.yahoo\.com$ -(^|\.)hk01\.com$ -(^|\.)hk32168\.com$ -(^|\.)hka8964\.wordpress\.com$ -(^|\.)hkacg\.com$ -(^|\.)hkacg\.net$ -(^|\.)hkanews\.wordpress\.com$ -(^|\.)hkatvnews\.com$ -(^|\.)hkbc\.net$ -(^|\.)hkbf\.org$ -(^|\.)hkbookcity\.com$ -(^|\.)hkchurch\.org$ -(^|\.)hkci\.org\.hk$ -(^|\.)hkcmi\.edu$ -(^|\.)hkcnews\.com$ -(^|\.)hkcoc\.com$ -(^|\.)hkcoc\.weather\.com\.hk$ -(^|\.)hkdailynews\.com\.hk$ -(^|\.)hkday\.net$ -(^|\.)hkdf\.org$ -(^|\.)hkej\.com$ -(^|\.)hkepc\.com$ -(^|\.)hkfaa\.com$ -(^|\.)hkfreezone\.com$ -(^|\.)hkfront\.org$ -(^|\.)hkgolden\.com$ -(^|\.)hkgreenradio\.org$ -(^|\.)hkheadline\.com$ -(^|\.)hkhkhk\.com$ -(^|\.)hkhrc\.org\.hk$ -(^|\.)hkhrm\.org\.hk$ -(^|\.)hkip\.org\.uk$ -(^|\.)hkjc\.com$ -(^|\.)hkjp\.org$ -(^|\.)hklft\.com$ -(^|\.)hklts\.org\.hk$ -(^|\.)hkptu\.org$ -(^|\.)hkreporter\.com$ -(^|\.)hkreporter\.loved\.hk$ -(^|\.)hkupop\.hku\.hk$ -(^|\.)hkusu\.net$ -(^|\.)hkvwet\.com$ -(^|\.)hkwcc\.org\.hk$ -(^|\.)hkzone\.org$ -(^|\.)hmonghot\.com$ -(^|\.)hmvdigital\.ca$ -(^|\.)hmvdigital\.com$ -(^|\.)hnjhj\.com$ -(^|\.)hnntube\.com$ -(^|\.)hola\.com$ -(^|\.)hola\.org$ -(^|\.)holymountaincn\.com$ -(^|\.)holyspiritspeaks\.org$ -(^|\.)home\.sina\.com$ -(^|\.)home\.so-net\.net\.tw$ -(^|\.)homedepot\.com$ -(^|\.)homeperversion\.com$ -(^|\.)homeservershow\.com$ -(^|\.)hongkongfp\.com$ -(^|\.)hongmeimei\.com$ -(^|\.)hongzhi\.li$ -(^|\.)hootsuite\.com$ -(^|\.)hoovers\.com$ -(^|\.)hopedialogue\.org$ -(^|\.)hopto\.org$ -(^|\.)hornygamer\.com$ -(^|\.)hornytrip\.com$ -(^|\.)hotav\.tv$ -(^|\.)hotels\.cn$ -(^|\.)hotfrog\.com\.tw$ -(^|\.)hotgoo\.com$ -(^|\.)hotpornshow\.com$ -(^|\.)hotpot\.hk$ -(^|\.)hotshame\.com$ -(^|\.)hotspotshield\.com$ -(^|\.)hotvpn\.com$ -(^|\.)hougaige\.com$ -(^|\.)howtoforge\.com$ -(^|\.)hpa\.gov\.tw$ -(^|\.)hqcdp\.org$ -(^|\.)hqjapanesesex\.com$ -(^|\.)hqmovies\.com$ -(^|\.)hqsbnet\.wordpress\.com$ -(^|\.)hqsbonline\.wordpress\.com$ -(^|\.)hrcchina\.org$ -(^|\.)hrcir\.com$ -(^|\.)hrea\.org$ -(^|\.)hrichina\.org$ -(^|\.)hrw\.org$ -(^|\.)hrweb\.org$ -(^|\.)hsjp\.net$ -(^|\.)hsselite\.com$ -(^|\.)hst\.net\.tw$ -(^|\.)hstern\.net$ -(^|\.)hstt\.net$ -(^|\.)ht\.ly$ -(^|\.)htkou\.net$ -(^|\.)htl\.li$ -(^|\.)html5rocks\.com$ -(^|\.)https$ -(^|\.)https443\.net$ -(^|\.)https443\.org$ -(^|\.)hua-yue\.net$ -(^|\.)huaglad\.com$ -(^|\.)huanghuagang\.org$ -(^|\.)huangyiyu\.com$ -(^|\.)huaren\.us$ -(^|\.)huaren4us\.com$ -(^|\.)huashangnews\.com$ -(^|\.)huaxia-news\.com$ -(^|\.)huaxiabao\.org$ -(^|\.)huaxin\.ph$ -(^|\.)huayuworld\.org$ -(^|\.)hudatoriq\.web\.id$ -(^|\.)huffingtonpost\.com$ -(^|\.)hugoroy\.eu$ -(^|\.)huhaitai\.com$ -(^|\.)huhamhire\.com$ -(^|\.)huiyi\.in$ -(^|\.)hulkshare\.com$ -(^|\.)hulu\.com$ -(^|\.)huluim\.com$ -(^|\.)hum$ -(^|\.)humanrightsbriefing\.org$ -(^|\.)hung-ya\.com$ -(^|\.)hungerstrikeforaids\.org$ -(^|\.)huobi\.com$ -(^|\.)huobi\.pro$ -(^|\.)huobipro\.com$ -(^|\.)huping\.net$ -(^|\.)hurgokbayrak\.com$ -(^|\.)hurriyet\.com\.tr$ -(^|\.)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$ -(^|\.)i-cable\.com$ -(^|\.)i-part\.com\.tw$ -(^|\.)i\.lithium\.com$ -(^|\.)i1\.hk$ -(^|\.)i2p2\.de$ -(^|\.)i2runner\.com$ -(^|\.)i818hk\.com$ -(^|\.)iam\.soy$ -(^|\.)iamtopone\.com$ -(^|\.)iask\.bz$ -(^|\.)iask\.ca$ -(^|\.)iav19\.com$ -(^|\.)ibiblio\.org$ -(^|\.)iblist\.com$ -(^|\.)iblogserv-f\.net$ -(^|\.)ibros\.org$ -(^|\.)ibvpn\.com$ -(^|\.)icams\.com$ -(^|\.)ice\.audionow\.com$ -(^|\.)icij\.org$ -(^|\.)icl-fi\.org$ -(^|\.)icoco\.com$ -(^|\.)iconpaper\.org$ -(^|\.)icu-project\.org$ -(^|\.)id\.hao123\.com$ -(^|\.)id\.heroku\.com$ -(^|\.)iddddg\.com$ -(^|\.)idemocracy\.asia$ -(^|\.)identi\.ca$ -(^|\.)idiomconnection\.com$ -(^|\.)idouga\.com$ -(^|\.)idreamx\.com$ -(^|\.)idv\.tw$ -(^|\.)ieasy5\.com$ -(^|\.)ied2k\.net$ -(^|\.)ienergy1\.com$ -(^|\.)if\.ttt$ -(^|\.)ifan\.cz\.cc$ -(^|\.)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$ -(^|\.)illusionfactory\.com$ -(^|\.)ilove80\.be$ -(^|\.)ilovelongtoes\.com$ -(^|\.)im\.tv$ -(^|\.)im88\.tw$ -(^|\.)imageab\.com$ -(^|\.)imagefap\.com$ -(^|\.)imageflea\.com$ -(^|\.)images-gaytube\.com$ -(^|\.)images\.comico\.tw$ -(^|\.)imageshack\.us$ -(^|\.)imagevenue\.com$ -(^|\.)imagezilla\.net$ -(^|\.)imb\.org$ -(^|\.)imdb\.com$ -(^|\.)img$ -(^|\.)img\.dlsite\.jp$ -(^|\.)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$ -(^|\.)in99\.org$ -(^|\.)incapdns\.net$ -(^|\.)incloak\.com$ -(^|\.)incredibox\.fr$ -(^|\.)indiandefensenews\.in$ -(^|\.)indiemerch\.com$ -(^|\.)info-graf\.fr$ -(^|\.)initiativesforchina\.org$ -(^|\.)inkui\.com$ -(^|\.)inmediahk\.net$ -(^|\.)innermongolia\.org$ -(^|\.)inote\.tw$ -(^|\.)insecam\.org$ -(^|\.)insidevoa\.com$ -(^|\.)instagram\.com$ -(^|\.)instanthq\.com$ -(^|\.)institut-tibetain\.org$ -(^|\.)internet\.org$ -(^|\.)internetdefenseleague\.org$ -(^|\.)internetfreedom\.org$ -(^|\.)internetpopculture\.com$ -(^|\.)investigating\.wordpress\.com$ -(^|\.)inxian\.com$ -(^|\.)iownyour\.biz$ -(^|\.)iownyour\.org$ -(^|\.)ipalter\.com$ -(^|\.)ipfire\.org$ -(^|\.)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$ -(^|\.)iredmail\.org$ -(^|\.)ironbigfools\.compython\.net$ -(^|\.)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$ -(^|\.)istiqlalhewer\.com$ -(^|\.)istockphoto\.com$ -(^|\.)isunaffairs\.com$ -(^|\.)isuntv\.com$ -(^|\.)itaboo\.info$ -(^|\.)itaiwan\.gov\.tw$ -(^|\.)italiatibet\.org$ -(^|\.)itasoftware\.com$ -(^|\.)itemdb\.com$ -(^|\.)ithelp\.ithome\.com\.tw$ -(^|\.)its\.caltech\.edu$ -(^|\.)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$ -(^|\.)izaobao\.us$ -(^|\.)izles\.net$ -(^|\.)izlesem\.org$ -(^|\.)j\.mp$ -(^|\.)ja\.wikipedia\.org$ -(^|\.)jamaat\.org$ -(^|\.)jamyangnorbu\.com$ -(^|\.)jandyx\.com$ -(^|\.)janwongphoto\.com$ -(^|\.)japan-whores\.com$ -(^|\.)japanfirst\.asianfreeforum\.com$ -(^|\.)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$ -(^|\.)jfqu36\.club$ -(^|\.)jfqu37\.xyz$ -(^|\.)jgoodies\.com$ -(^|\.)jiangweiping\.com$ -(^|\.)jiaoyou8\.com$ -(^|\.)jiehua\.cz$ -(^|\.)jieshibaobao\.com$ -(^|\.)jigglegifs\.com$ -(^|\.)jigong1024\.com$ -(^|\.)jihadintel\.meforum\.org$ -(^|\.)jihadology\.net$ -(^|\.)jiji\.com$ -(^|\.)jims\.net$ -(^|\.)jinbushe\.org$ -(^|\.)jingpin\.org$ -(^|\.)jingsim\.org$ -(^|\.)jinpianwang\.com$ -(^|\.)jinroukong\.com$ -(^|\.)jitouch\.com$ -(^|\.)jizzthis\.com$ -(^|\.)jjgirls\.com$ -(^|\.)jkb\.cc$ -(^|\.)jkforum\.net$ -(^|\.)jkub\.com$ -(^|\.)jma\.go\.jp$ -(^|\.)jmscult\.com$ -(^|\.)joachims\.org$ -(^|\.)jobnewera\.wordpress\.com$ -(^|\.)jobso\.tv$ -(^|\.)journalchretien\.net$ -(^|\.)journalofdemocracy\.org$ -(^|\.)joymiihub\.com$ -(^|\.)joyourself\.com$ -(^|\.)jp\.hao123\.com$ -(^|\.)jpl\.nasa\.gov$ -(^|\.)jpopforum\.net$ -(^|\.)jubushoushen\.com$ -(^|\.)juhuaren\.com$ -(^|\.)jukujo-club\.com$ -(^|\.)juliepost\.com$ -(^|\.)juliereyc\.com$ -(^|\.)junauza\.com$ -(^|\.)june4commemoration\.org$ -(^|\.)junefourth-20\.net$ -(^|\.)jungleheart\.com$ -(^|\.)juoaa\.com$ -(^|\.)justdied\.com$ -(^|\.)justfreevpn\.com$ -(^|\.)justicefortenzin\.org$ -(^|\.)justpaste\.it$ -(^|\.)justtristan\.com$ -(^|\.)juyuange\.org$ -(^|\.)juziyue\.com$ -(^|\.)jwmusic\.org$ -(^|\.)jyxf\.net$ -(^|\.)k-doujin\.net$ -(^|\.)ka-wai\.com$ -(^|\.)kagyu\.org$ -(^|\.)kagyu\.org\.za$ -(^|\.)kagyumonlam\.org$ -(^|\.)kagyunews\.com\.hk$ -(^|\.)kagyuoffice\.org$ -(^|\.)kagyuoffice\.org\.tw$ -(^|\.)kaiyuan\.de$ -(^|\.)kakao\.com$ -(^|\.)kalachakralugano\.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$ -(^|\.)kb\.monitorware\.com$ -(^|\.)kba-tx\.org$ -(^|\.)kcoolonline\.com$ -(^|\.)kebrum\.com$ -(^|\.)kechara\.com$ -(^|\.)keepandshare\.com$ -(^|\.)keezmovies\.com$ -(^|\.)kendatire\.com$ -(^|\.)kendincos\.net$ -(^|\.)kenengba\.com$ -(^|\.)keontech\.net$ -(^|\.)kepard\.com$ -(^|\.)keycdn\.com$ -(^|\.)khabdha\.org$ -(^|\.)khatrimaza\.org$ -(^|\.)khmusic\.com\.tw$ -(^|\.)kichiku-doujinko\.com$ -(^|\.)kik\.com$ -(^|\.)killwall\.com$ -(^|\.)kindleren\.com$ -(^|\.)kineox\.free\.fr$ -(^|\.)kingdomsalvation\.org$ -(^|\.)kinghost\.com$ -(^|\.)kingstone\.com\.tw$ -(^|\.)kink\.com$ -(^|\.)kinmen\.org\.tw$ -(^|\.)kinmen\.travel$ -(^|\.)kir\.jp$ -(^|\.)kissbbao\.cn$ -(^|\.)kiwi\.kz$ -(^|\.)kk-whys\.co\.jp$ -(^|\.)kkbox\.com$ -(^|\.)kknews\.cc$ -(^|\.)kmuh\.org\.tw$ -(^|\.)knowledgerush\.com$ -(^|\.)kobo\.com$ -(^|\.)kobobooks\.com$ -(^|\.)kodingen\.com$ -(^|\.)kompozer\.net$ -(^|\.)konachan\.com$ -(^|\.)kone\.com$ -(^|\.)koolsolutions\.com$ -(^|\.)koornk\.com$ -(^|\.)koranmandarin\.com$ -(^|\.)korenan2\.com$ -(^|\.)ksdl\.org$ -(^|\.)ksnews\.com\.tw$ -(^|\.)ktzhk\.com$ -(^|\.)kui\.name$ -(^|\.)kun\.im$ -(^|\.)kurashsultan\.com$ -(^|\.)kurtmunger\.com$ -(^|\.)kusocity\.com$ -(^|\.)kwcg\.ca$ -(^|\.)kwongwah\.com\.my$ -(^|\.)kxsw\.life$ -(^|\.)kyofun\.com$ -(^|\.)kyohk\.net$ -(^|\.)kyoyue\.com$ -(^|\.)kyzyhello\.com$ -(^|\.)kzeng\.info$ -(^|\.)la-forum\.org$ -(^|\.)labiennale\.org$ -(^|\.)ladbrokes\.com$ -(^|\.)lagranepoca\.com$ -(^|\.)lalulalu\.com$ -(^|\.)lama\.com\.tw$ -(^|\.)lamayeshe\.com$ -(^|\.)lamnia\.co\.uk$ -(^|\.)lamrim\.com$ -(^|\.)lanterncn\.cn$ -(^|\.)lantosfoundation\.org$ -(^|\.)laod\.cn$ -(^|\.)laogai\.org$ -(^|\.)laomiu\.com$ -(^|\.)laoyang\.info$ -(^|\.)laptoplockdown\.com$ -(^|\.)laqingdan\.net$ -(^|\.)larsgeorge\.com$ -(^|\.)lastcombat\.com$ -(^|\.)lastfm\.es$ -(^|\.)latelinenews\.com$ -(^|\.)latibet\.org$ -(^|\.)ld\.hao123img\.com$ -(^|\.)le-vpn\.com$ -(^|\.)leafyvpn\.net$ -(^|\.)lecloud\.net$ -(^|\.)leeao\.com\.cn$ -(^|\.)lefora\.com$ -(^|\.)left21\.hk$ -(^|\.)legalporno\.com$ -(^|\.)legaltech\.law\.com$ -(^|\.)legsjapan\.com$ -(^|\.)leirentv\.ca$ -(^|\.)leisurecafe\.ca$ -(^|\.)leisurepro\.com$ -(^|\.)lematin\.ch$ -(^|\.)lemonde\.fr$ -(^|\.)lenwhite\.com$ -(^|\.)lerosua\.org$ -(^|\.)lers\.google$ -(^|\.)lesoir\.be$ -(^|\.)letou\.com$ -(^|\.)letscorp\.net$ -(^|\.)lflink\.com$ -(^|\.)lflinkup\.com$ -(^|\.)lflinkup\.net$ -(^|\.)lflinkup\.org$ -(^|\.)lhakar\.org$ -(^|\.)lhasocialwork\.org$ -(^|\.)liangyou\.net$ -(^|\.)lianyue\.net$ -(^|\.)liaowangxizang\.net$ -(^|\.)liberal\.org\.hk$ -(^|\.)libertytimes\.com\.tw$ -(^|\.)library\.usc\.cuhk\.edu\.hk$ -(^|\.)lidecheng\.com$ -(^|\.)lifemiles\.com$ -(^|\.)lighten\.org\.tw$ -(^|\.)lightnovel\.cn$ -(^|\.)like\.com$ -(^|\.)limiao\.net$ -(^|\.)line-apps\.com$ -(^|\.)line-scdn\.net$ -(^|\.)line\.me$ -(^|\.)line\.naver\.jp$ -(^|\.)linglingfa\.com$ -(^|\.)lingvodics\.com$ -(^|\.)link-o-rama\.com$ -(^|\.)linkideo\.com$ -(^|\.)linkuswell\.com$ -(^|\.)linux\.org\.hk$ -(^|\.)linuxtoy\.org$ -(^|\.)lionsroar\.com$ -(^|\.)lipuman\.com$ -(^|\.)liquidvpn\.com$ -(^|\.)listentoyoutube\.com$ -(^|\.)listorious\.com$ -(^|\.)lists\.w3\.org$ -(^|\.)liudejun\.com$ -(^|\.)liuhanyu\.com$ -(^|\.)liujianshu\.com$ -(^|\.)liuxiaobo\.net$ -(^|\.)liuxiaotong\.com$ -(^|\.)livedoor\.jp$ -(^|\.)liveleak\.com$ -(^|\.)livestation\.com$ -(^|\.)livestream\.com$ -(^|\.)livevideo\.com$ -(^|\.)livingonline\.us$ -(^|\.)livingstream\.com$ -(^|\.)liwangyang\.com$ -(^|\.)lizhizhuangbi\.com$ -(^|\.)lkcn\.net$ -(^|\.)llss\.me$ -(^|\.)load\.to$ -(^|\.)lobsangwangyal\.com$ -(^|\.)localdomain\.ws$ -(^|\.)localpresshk\.com$ -(^|\.)lockestek\.com$ -(^|\.)logbot\.net$ -(^|\.)logiqx\.com$ -(^|\.)londonchinese\.ca$ -(^|\.)longhair\.hk$ -(^|\.)longmusic\.com$ -(^|\.)longtermly\.net$ -(^|\.)longtoes\.com$ -(^|\.)lookpic\.com$ -(^|\.)looktoronto\.com$ -(^|\.)lotsawahouse\.org$ -(^|\.)lotuslight\.org\.hk$ -(^|\.)lotuslight\.org\.tw$ -(^|\.)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$ -(^|\.)luke54\.com$ -(^|\.)luke54\.org$ -(^|\.)lupm\.org$ -(^|\.)lushstories\.com$ -(^|\.)luxebc\.com$ -(^|\.)lvhai\.org$ -(^|\.)lvv2\.com$ -(^|\.)lyfhk\.net$ -(^|\.)lzmtnews\.org$ -(^|\.)m\.hkgalden\.com$ -(^|\.)m\.me$ -(^|\.)m\.plixi\.com$ -(^|\.)m\.slandr\.net$ -(^|\.)ma\.hao123\.com$ -(^|\.)macgamestore\.com$ -(^|\.)macrovpn\.com$ -(^|\.)macts\.com\.tw$ -(^|\.)mad-ar\.ch$ -(^|\.)madewithcode\.com$ -(^|\.)madonna-av\.com$ -(^|\.)madthumbs\.com$ -(^|\.)magazines\.sina\.com\.tw$ -(^|\.)magic-net\.info$ -(^|\.)mahabodhi\.org$ -(^|\.)maiio\.net$ -(^|\.)mail-archive\.com$ -(^|\.)maildns\.xyz$ -(^|\.)maiplus\.com$ -(^|\.)maizhong\.org$ -(^|\.)makemymood\.com$ -(^|\.)makkahnewspaper\.com$ -(^|\.)makzhou\.warehouse333\.com$ -(^|\.)malaysiakini\.com$ -(^|\.)mamingzhe\.com$ -(^|\.)manchukuo\.net$ -(^|\.)mangafox\.com$ -(^|\.)mangafox\.me$ -(^|\.)maniash\.com$ -(^|\.)manicur4ik\.ru$ -(^|\.)mansion\.com$ -(^|\.)mansionpoker\.com$ -(^|\.)manta\.com$ -(^|\.)maplew\.com$ -(^|\.)marc\.info$ -(^|\.)marguerite\.su$ -(^|\.)martau\.com$ -(^|\.)martincartoons\.com$ -(^|\.)martsangkagyuofficial\.org$ -(^|\.)maruta\.be$ -(^|\.)marxist\.com$ -(^|\.)marxist\.net$ -(^|\.)marxists\.org$ -(^|\.)mash\.to$ -(^|\.)maskedip\.com$ -(^|\.)matainja\.com$ -(^|\.)material\.io$ -(^|\.)mathable\.io$ -(^|\.)mathiew-badimon\.com$ -(^|\.)matome-plus\.com$ -(^|\.)matome-plus\.net$ -(^|\.)matsushimakaede\.com$ -(^|\.)mattwilcox\.net$ -(^|\.)maturejp\.com$ -(^|\.)maxing\.jp$ -(^|\.)mayimayi\.com$ -(^|\.)mcadforums\.com$ -(^|\.)mcaf\.ee$ -(^|\.)mcfog\.com$ -(^|\.)mcreasite\.com$ -(^|\.)md-t\.org$ -(^|\.)me\.youthwant\.com\.tw$ -(^|\.)meansys\.com$ -(^|\.)media\.nu\.nl$ -(^|\.)media\.org\.hk$ -(^|\.)mediachinese\.com$ -(^|\.)mediafire\.com$ -(^|\.)mediafreakcity\.com$ -(^|\.)medium\.com$ -(^|\.)meetav\.com$ -(^|\.)meetup\.com$ -(^|\.)mefeedia\.com$ -(^|\.)mefound\.com$ -(^|\.)mega\.nz$ -(^|\.)megaproxy\.com$ -(^|\.)megarotic\.com$ -(^|\.)megavideo\.com$ -(^|\.)megurineluka\.com$ -(^|\.)meirixiaochao\.com$ -(^|\.)melon-peach\.com$ -(^|\.)meltoday\.com$ -(^|\.)meme\.yahoo\.com$ -(^|\.)memehk\.com$ -(^|\.)memorybbs\.com$ -(^|\.)memri\.org$ -(^|\.)memrijttm\.org$ -(^|\.)mercyprophet\.org$ -(^|\.)meridian-trust\.org$ -(^|\.)meripet\.biz$ -(^|\.)meripet\.com$ -(^|\.)merit-times\.com\.tw$ -(^|\.)meshrep\.com$ -(^|\.)mesotw\.com$ -(^|\.)messenger\.com$ -(^|\.)metacafe\.com$ -(^|\.)metarthunter\.com$ -(^|\.)meteorshowersonline\.com$ -(^|\.)metrohk\.com\.hk$ -(^|\.)metrolife\.ca$ -(^|\.)metroradio\.com\.hk$ -(^|\.)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$ -(^|\.)mike\.cz\.cc$ -(^|\.)mikesoltys\.com$ -(^|\.)milph\.net$ -(^|\.)milsurps\.com$ -(^|\.)mimiai\.net$ -(^|\.)mimivip\.com$ -(^|\.)mimivv\.com$ -(^|\.)mindrolling\.org$ -(^|\.)minghui-a\.org$ -(^|\.)minghui-b\.org$ -(^|\.)minghui-school\.org$ -(^|\.)minghui\.or\.kr$ -(^|\.)minghui\.org$ -(^|\.)minghuiyw\.wordpress\.com$ -(^|\.)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$ -(^|\.)mist\.vip$ -(^|\.)mitao\.com\.tw$ -(^|\.)mitbbs\.com$ -(^|\.)mitbbsau\.com$ -(^|\.)mixero\.com$ -(^|\.)mixpod\.com$ -(^|\.)mixx\.com$ -(^|\.)mizzmona\.com$ -(^|\.)mjib\.gov\.tw$ -(^|\.)mjlsh\.usc\.cuhk\.edu\.hk$ -(^|\.)mk5000\.com$ -(^|\.)mlcool\.com$ -(^|\.)mm-cg\.com$ -(^|\.)mmaaxx\.com$ -(^|\.)mmmca\.com$ -(^|\.)mnewstv\.com$ -(^|\.)mo\.nightlife141\.com$ -(^|\.)mobatek\.net$ -(^|\.)mobile01\.com$ -(^|\.)mobileways\.de$ -(^|\.)moby\.to$ -(^|\.)mobypicture\.com$ -(^|\.)moeaic\.gov\.tw$ -(^|\.)moeerolibrary\.com$ -(^|\.)mofaxiehui\.com$ -(^|\.)mofos\.com$ -(^|\.)mog\.com$ -(^|\.)mol\.gov\.tw$ -(^|\.)molihua\.org$ -(^|\.)mondex\.org$ -(^|\.)money-link\.com\.tw$ -(^|\.)moneyhome\.biz$ -(^|\.)monitorchina\.org$ -(^|\.)monster\.com$ -(^|\.)moodyz\.com$ -(^|\.)moonbbs\.com$ -(^|\.)morningsun\.org$ -(^|\.)moroneta\.com$ -(^|\.)mos\.ru$ -(^|\.)motherless\.com$ -(^|\.)motor4ik\.ru$ -(^|\.)mousebreaker\.com$ -(^|\.)movements\.org$ -(^|\.)moviefap\.com$ -(^|\.)mp3buscador\.com$ -(^|\.)mp3ye\.eu$ -(^|\.)mpettis\.com$ -(^|\.)mpfinance\.com$ -(^|\.)mpinews\.com$ -(^|\.)mponline\.hk$ -(^|\.)mqxd\.org$ -(^|\.)mrbasic\.com$ -(^|\.)mrbonus\.com$ -(^|\.)mrface\.com$ -(^|\.)mrslove\.com$ -(^|\.)mrtweet\.com$ -(^|\.)msguancha\.com$ -(^|\.)msha\.gov$ -(^|\.)mswe1\.org$ -(^|\.)mthruf\.com$ -(^|\.)mtw\.tl$ -(^|\.)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$ -(^|\.)mx\.hao123\.com$ -(^|\.)mx981\.com$ -(^|\.)my-formosa\.com$ -(^|\.)my-private-network\.co\.uk$ -(^|\.)my-proxy\.com$ -(^|\.)my\.mail\.ru$ -(^|\.)my\.opera\.com$ -(^|\.)my\.pcloud\.com$ -(^|\.)my03\.com$ -(^|\.)myactimes\.com$ -(^|\.)myanniu\.com$ -(^|\.)myaudiocast\.com$ -(^|\.)myav\.com\.tw$ -(^|\.)mybbs\.us$ -(^|\.)mybet\.com$ -(^|\.)myca168\.com$ -(^|\.)mycanadanow\.com$ -(^|\.)mychinamyhome\.com$ -(^|\.)mychinanet\.com$ -(^|\.)mychinanews\.com$ -(^|\.)mychinese\.news$ -(^|\.)mycnnews\.com$ -(^|\.)mycould\.com$ -(^|\.)mydad\.info$ -(^|\.)myddns\.com$ -(^|\.)myeasytv\.com$ -(^|\.)myeclipseide\.com$ -(^|\.)myforum\.com\.hk$ -(^|\.)myforum\.com\.uk$ -(^|\.)myfreecams\.com$ -(^|\.)myfreepaysite\.com$ -(^|\.)myfreshnet\.com$ -(^|\.)myftp\.info$ -(^|\.)myftp\.name$ -(^|\.)myiphide\.com$ -(^|\.)mykomica\.org$ -(^|\.)mylftv\.com$ -(^|\.)mymediarom\.com$ -(^|\.)mymoe\.moe$ -(^|\.)mymom\.info$ -(^|\.)mymusic\.net\.tw$ -(^|\.)mynetav\.net$ -(^|\.)mynetav\.org$ -(^|\.)mynumber\.org$ -(^|\.)myparagliding\.com$ -(^|\.)mypicture\.info$ -(^|\.)mypop3\.net$ -(^|\.)mypop3\.org$ -(^|\.)mypopescu\.com$ -(^|\.)myradio\.hk$ -(^|\.)myreadingmanga\.info$ -(^|\.)mysecondarydns\.com$ -(^|\.)myshare\.url\.com\.tw$ -(^|\.)mysinablog\.com$ -(^|\.)mysite\.verizon\.net$ -(^|\.)myspace\.com$ -(^|\.)myspacecdn\.com$ -(^|\.)mytalkbox\.com$ -(^|\.)mytizi\.com$ -(^|\.)mywww\.biz$ -(^|\.)myz\.info$ -(^|\.)naacoalition\.org$ -(^|\.)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$ -(^|\.)nat\.gov\.tw$ -(^|\.)nat\.moe$ -(^|\.)national-lottery\.co\.uk$ -(^|\.)nationsonline\.org$ -(^|\.)nationwide\.com$ -(^|\.)naughtyamerica\.com$ -(^|\.)navyfamily\.navy\.mil$ -(^|\.)navyreserve\.navy\.mil$ -(^|\.)naweeklytimes\.com$ -(^|\.)nbtvpn\.com$ -(^|\.)nccwatch\.org\.tw$ -(^|\.)nch\.com\.tw$ -(^|\.)ncn\.org$ -(^|\.)nde\.de$ -(^|\.)ndr\.de$ -(^|\.)ned\.org$ -(^|\.)nekoslovakia\.net$ -(^|\.)nemesis2\.qx\.net$ -(^|\.)neo-miracle\.com$ -(^|\.)nepusoku\.com$ -(^|\.)net-fits\.pro$ -(^|\.)netbirds\.com$ -(^|\.)netcolony\.com$ -(^|\.)netflix\.com$ -(^|\.)netme\.cc$ -(^|\.)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$ -(^|\.)newipnow\.com$ -(^|\.)newlandmagazine\.com\.au$ -(^|\.)newnews\.ca$ -(^|\.)news\.bbc\.co\.uk$ -(^|\.)news\.cnyes\.com$ -(^|\.)news\.hk\.msn\.com$ -(^|\.)news\.hkpeanut\.com$ -(^|\.)news\.msn\.com\.tw$ -(^|\.)news\.nationalgeographic\.com$ -(^|\.)news\.now\.com$ -(^|\.)news\.now\.com%2fhome$ -(^|\.)news\.omy\.sg$ -(^|\.)news\.seehua\.com$ -(^|\.)news\.sina\.com\.hk$ -(^|\.)news\.sina\.com\.tw$ -(^|\.)news\.sinchew\.com\.my$ -(^|\.)news\.singtao\.ca$ -(^|\.)news\.tvb\.com$ -(^|\.)news\.tvbs\.com\.tw$ -(^|\.)news\.yahoo\.com$ -(^|\.)news100\.com\.tw$ -(^|\.)newsancai\.com$ -(^|\.)newschinacomment\.org$ -(^|\.)newscn\.org$ -(^|\.)newsdetox\.ca$ -(^|\.)newsdh\.com$ -(^|\.)newsforums\.bbc\.co\.uk$ -(^|\.)newspeak\.cc$ -(^|\.)newstamago\.com$ -(^|\.)newstapa\.org$ -(^|\.)newstarnet\.com$ -(^|\.)newtaiwan\.com\.tw$ -(^|\.)newtalk\.tw$ -(^|\.)newyorktimes\.com$ -(^|\.)nexon\.com$ -(^|\.)next11\.co\.jp$ -(^|\.)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$ -(^|\.)nga\.mil$ -(^|\.)ngensis\.com$ -(^|\.)nhentai\.net$ -(^|\.)nhi\.gov\.tw$ -(^|\.)nhk-ondemand\.jp$ -(^|\.)nic\.cz\.cc$ -(^|\.)nic\.google$ -(^|\.)nic\.gov$ -(^|\.)nicovideo\.jp$ -(^|\.)nighost\.org$ -(^|\.)nikkei\.com$ -(^|\.)ninecommentaries\.com$ -(^|\.)ninjacloak\.com$ -(^|\.)ninjaproxy\.ninja$ -(^|\.)nintendium\.com$ -(^|\.)ninth\.biz$ -(^|\.)niusnews\.com$ -(^|\.)njactb\.org$ -(^|\.)njuice\.com$ -(^|\.)nko\.navy\.mil$ -(^|\.)nlfreevpn\.com$ -(^|\.)no-ip\.org$ -(^|\.)nobel\.se$ -(^|\.)nobelprize\.org$ -(^|\.)nobodycanstop\.us$ -(^|\.)nokogiri\.org$ -(^|\.)nokola\.com$ -(^|\.)noodlevpn\.com$ -(^|\.)norbulingka\.org$ -(^|\.)nordstrom\.com$ -(^|\.)nordstromimage\.com$ -(^|\.)nordstromrack\.com$ -(^|\.)nordvpn\.com$ -(^|\.)nottinghampost\.com$ -(^|\.)novelasia\.com$ -(^|\.)now\.im$ -(^|\.)nownews\.com$ -(^|\.)nowtorrents\.com$ -(^|\.)noypf\.com$ -(^|\.)npa\.go\.jp$ -(^|\.)npa\.gov\.tw$ -(^|\.)npnt\.me$ -(^|\.)nps\.gov$ -(^|\.)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\.cz$ -(^|\.)ntdtv\.org$ -(^|\.)ntdtv\.ru$ -(^|\.)ntdtvla\.com$ -(^|\.)ntrfun\.com$ -(^|\.)ntsna\.gov\.tw$ -(^|\.)nubiles\.net$ -(^|\.)nuexpo\.com$ -(^|\.)nukistream\.com$ -(^|\.)nurgo-software\.com$ -(^|\.)nusatrip\.com$ -(^|\.)nutaku\.net$ -(^|\.)nuuvem\.com$ -(^|\.)nuvid\.com$ -(^|\.)nuzcom\.com$ -(^|\.)nvdst\.com$ -(^|\.)nvquan\.org$ -(^|\.)nvtongzhisheng\.org$ -(^|\.)nwtca\.org$ -(^|\.)ny\.stgloballink\.com$ -(^|\.)ny\.visiontimes\.com$ -(^|\.)nyaa\.eu$ -(^|\.)nyaa\.si$ -(^|\.)nydus\.ca$ -(^|\.)nylon-angel\.com$ -(^|\.)nylonstockingsonline\.com$ -(^|\.)nyt\.com$ -(^|\.)nytchina\.com$ -(^|\.)nytcn\.me$ -(^|\.)nytco\.com$ -(^|\.)nyti\.ms$ -(^|\.)nytimes\.com$ -(^|\.)nytimes\.map\.fastly\.net$ -(^|\.)nytimg\.com$ -(^|\.)nytstyle\.com$ -(^|\.)nzchinese\.com$ -(^|\.)nzchinese\.net\.nz$ -(^|\.)observechina\.net$ -(^|\.)obutu\.com$ -(^|\.)ocaspro\.com$ -(^|\.)occupytiananmen\.com$ -(^|\.)oclp\.hk$ -(^|\.)ocreampies\.com$ -(^|\.)ocry\.com$ -(^|\.)october-review\.org$ -(^|\.)oculus\.com$ -(^|\.)oculuscdn\.com$ -(^|\.)offbeatchina\.com$ -(^|\.)officeoftibet\.com$ -(^|\.)ofile\.org$ -(^|\.)ogaoga\.org$ -(^|\.)ogate\.org$ -(^|\.)oikos\.com\.tw$ -(^|\.)oiktv\.com$ -(^|\.)oizoblog\.com$ -(^|\.)ok\.ru$ -(^|\.)okayfreedom\.com$ -(^|\.)okk\.tw$ -(^|\.)old-cat\.net$ -(^|\.)old\.honeynet\.org$ -(^|\.)old\.nabble\.com$ -(^|\.)olumpo\.com$ -(^|\.)olympicwatch\.org$ -(^|\.)omgili\.com$ -(^|\.)omni7\.jp$ -(^|\.)omnitalk\.com$ -(^|\.)omnitalk\.org$ -(^|\.)on\.cc$ -(^|\.)on2\.com$ -(^|\.)onapp\.com$ -(^|\.)onedrive\.live\.com$ -(^|\.)onedumb\.com$ -(^|\.)onion\.city$ -(^|\.)online\.recoveryversion\.org$ -(^|\.)onlinecha\.com$ -(^|\.)onlineyoutube\.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$ -(^|\.)openvpn\.net$ -(^|\.)openwebster\.com$ -(^|\.)openwrt\.org\.cn$ -(^|\.)opml\.radiotime\.com$ -(^|\.)organcare\.org\.tw$ -(^|\.)organharvestinvestigation\.net$ -(^|\.)organiccrap\.com$ -(^|\.)orgasm\.com$ -(^|\.)orgfree\.com$ -(^|\.)orient-doll\.com$ -(^|\.)orientaldaily\.com\.my$ -(^|\.)orn\.jp$ -(^|\.)orzistic\.org$ -(^|\.)osfoora\.com$ -(^|\.)otnd\.org$ -(^|\.)otto\.de$ -(^|\.)otzo\.com$ -(^|\.)ourdearamy\.com$ -(^|\.)ourhobby\.com$ -(^|\.)oursogo\.com$ -(^|\.)oursteps\.com\.au$ -(^|\.)oursweb\.net$ -(^|\.)ourtv\.hk$ -(^|\.)overplay\.net$ -(^|\.)oversea\.istarshine\.com$ -(^|\.)ow\.ly$ -(^|\.)owl\.li$ -(^|\.)oyax\.com$ -(^|\.)oyghan\.com$ -(^|\.)ozchinese\.com$ -(^|\.)ozvoice\.org$ -(^|\.)ozxw\.com$ -(^|\.)ozyoyo\.com$ -(^|\.)pachosting\.com$ -(^|\.)pacificpoker\.com$ -(^|\.)packages\.debian\.org$ -(^|\.)packetix\.net$ -(^|\.)pacopacomama\.com$ -(^|\.)padmanet\.com$ -(^|\.)page\.bid\.yahoo\.com$ -(^|\.)page2rss\.com$ -(^|\.)pagodabox\.com$ -(^|\.)palacemoon\.com$ -(^|\.)paldengyal\.com$ -(^|\.)paljorpublications\.com$ -(^|\.)paltalk\.com$ -(^|\.)panacom\.co\.jp$ -(^|\.)panamapapers\.sueddeutsche\.de$ -(^|\.)pandapow\.co$ -(^|\.)pandapow\.net$ -(^|\.)pandavpn-jp\.com$ -(^|\.)pandora\.com$ -(^|\.)pandora\.tv$ -(^|\.)pangci\.net$ -(^|\.)panluan\.net$ -(^|\.)panoramio\.com$ -(^|\.)pao-pao\.net$ -(^|\.)paper\.li$ -(^|\.)paperb\.us$ -(^|\.)paradisehill\.cc$ -(^|\.)paradisepoker\.com$ -(^|\.)parkansky\.com$ -(^|\.)partycasino\.com$ -(^|\.)partypoker\.com$ -(^|\.)passion\.com$ -(^|\.)passiontimes\.hk$ -(^|\.)pastebin\.com$ -(^|\.)pastie\.org$ -(^|\.)pbs\.org$ -(^|\.)pbwiki\.com$ -(^|\.)pbworks\.com$ -(^|\.)pbxes\.com$ -(^|\.)pbxes\.org$ -(^|\.)pcanywhere\.net$ -(^|\.)pcc\.gov\.tw$ -(^|\.)pcdvd\.com\.tw$ -(^|\.)pchome\.com\.tw$ -(^|\.)pcij\.org$ -(^|\.)pcstore\.com\.tw$ -(^|\.)pct\.org\.tw$ -(^|\.)pdetails\.com$ -(^|\.)pdproxy\.com$ -(^|\.)pds\.nasa\.gov$ -(^|\.)peace\.ca$ -(^|\.)peacefire\.org$ -(^|\.)peacehall\.com$ -(^|\.)pearlher\.org$ -(^|\.)peeasian\.com$ -(^|\.)pekingduck\.org$ -(^|\.)pemulihan\.or\.id$ -(^|\.)pen\.io$ -(^|\.)penchinese\.com$ -(^|\.)penchinese\.net$ -(^|\.)pengyulong\.com$ -(^|\.)penisbot\.com$ -(^|\.)penthouse\.com$ -(^|\.)pentoy\.hk$ -(^|\.)peoplebookcafe\.com$ -(^|\.)peoplenews\.tw$ -(^|\.)peopo\.org$ -(^|\.)percy\.in$ -(^|\.)perfectgirls\.net$ -(^|\.)perfectvpn\.net$ -(^|\.)periscope\.tv$ -(^|\.)persecutionblog\.com$ -(^|\.)persiankitty\.com$ -(^|\.)pfd\.org\.hk$ -(^|\.)phapluan\.org$ -(^|\.)phayul\.com$ -(^|\.)philborges\.com$ -(^|\.)philly\.com$ -(^|\.)phmsociety\.org$ -(^|\.)phncdn\.com$ -(^|\.)phobos\.apple\.com$ -(^|\.)phosphation13\.rssing\.com$ -(^|\.)photodharma\.net$ -(^|\.)photofocus\.com$ -(^|\.)phuquocservices\.com$ -(^|\.)picacomic\.com$ -(^|\.)picacomiccn\.com$ -(^|\.)picasaweb\.com$ -(^|\.)picidae\.net$ -(^|\.)pictures\.playboy\.com$ -(^|\.)picturesocial\.com$ -(^|\.)pin-cong\.com$ -(^|\.)pin6\.com$ -(^|\.)ping\.fm$ -(^|\.)pinimg\.com$ -(^|\.)pinkrod\.com$ -(^|\.)pinoy-n\.com$ -(^|\.)pinterest\.at$ -(^|\.)pinterest\.co\.kr$ -(^|\.)pinterest\.co\.uk$ -(^|\.)pinterest\.com$ -(^|\.)pinterest\.de$ -(^|\.)pinterest\.dk$ -(^|\.)pinterest\.fr$ -(^|\.)pinterest\.jp$ -(^|\.)pinterest\.nl$ -(^|\.)pinterest\.se$ -(^|\.)pioneer-worker\.forums-free\.com$ -(^|\.)pipii\.tv$ -(^|\.)piposay\.com$ -(^|\.)piraattilahti\.org$ -(^|\.)piring\.com$ -(^|\.)pixelqi\.com$ -(^|\.)pixiv\.net$ -(^|\.)pixnet\.net$ -(^|\.)pk\.com$ -(^|\.)placemix\.com$ -(^|\.)playboy\.com$ -(^|\.)playboyplus\.com$ -(^|\.)player\.fm$ -(^|\.)playno1\.com$ -(^|\.)playpcesor\.com$ -(^|\.)plays\.com\.tw$ -(^|\.)plm\.org\.hk$ -(^|\.)plunder\.com$ -(^|\.)plus28\.com$ -(^|\.)plusbb\.com$ -(^|\.)pmatehunter\.com$ -(^|\.)pmates\.com$ -(^|\.)po2b\.com$ -(^|\.)pobieramy\.top$ -(^|\.)podictionary\.com$ -(^|\.)pokerstars\.net$ -(^|\.)politicalchina\.org$ -(^|\.)politicalconsultation\.org$ -(^|\.)poloniex\.com$ -(^|\.)polymer-project\.org$ -(^|\.)polymerhk\.com$ -(^|\.)popo\.tw$ -(^|\.)popvote\.hk$ -(^|\.)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$ -(^|\.)potvpn\.com$ -(^|\.)power\.com$ -(^|\.)powerapple\.com$ -(^|\.)powercx\.com$ -(^|\.)powerphoto\.org$ -(^|\.)prayforchina\.net$ -(^|\.)premeforwindows7\.com$ -(^|\.)presentationzen\.com$ -(^|\.)presidentlee\.tw$ -(^|\.)prestige-av\.com$ -(^|\.)prisoner-state-secret-journal-premier$ -(^|\.)prisoneralert\.com$ -(^|\.)pritunl\.com$ -(^|\.)privacybox\.de$ -(^|\.)private\.com$ -(^|\.)privateinternetaccess\.com$ -(^|\.)privatepaste\.com$ -(^|\.)privatetunnel\.com$ -(^|\.)privatevpn\.com$ -(^|\.)procopytips\.com$ -(^|\.)prosiben\.de$ -(^|\.)provideocoalition\.com$ -(^|\.)provpnaccounts\.com$ -(^|\.)proxfree\.com$ -(^|\.)proxifier\.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$ -(^|\.)psiphon\.ca$ -(^|\.)psiphon\.civisec\.org$ -(^|\.)psiphon3\.com$ -(^|\.)psiphontoday\.com$ -(^|\.)pts\.org\.tw$ -(^|\.)ptt\.cc$ -(^|\.)pttvan\.org$ -(^|\.)pubu\.com\.tw$ -(^|\.)puffinbrowser\.com$ -(^|\.)puffstore\.com$ -(^|\.)pullfolio\.com$ -(^|\.)pulse\.yahoo\.com$ -(^|\.)punyu\.com$ -(^|\.)pure18\.com$ -(^|\.)pureconcepts\.net$ -(^|\.)pureinsight\.org$ -(^|\.)purepdf\.com$ -(^|\.)purevpn\.com$ -(^|\.)purplelotus\.org$ -(^|\.)pursuestar\.com$ -(^|\.)pushchinawall\.com$ -(^|\.)pussyspace\.com$ -(^|\.)putihome\.org$ -(^|\.)putlocker\.com$ -(^|\.)putty\.org$ -(^|\.)puuko\.com$ -(^|\.)pwned\.com$ -(^|\.)python\.com$ -(^|\.)python\.com\.tw$ -(^|\.)pythonhackers\.com$ -(^|\.)q%3dfreedom$ -(^|\.)q%3dtriangle$ -(^|\.)q=freedom$ -(^|\.)q=triangle$ -(^|\.)qanote\.com$ -(^|\.)qgirl\.com\.tw$ -(^|\.)qhigh\.com$ -(^|\.)qi-gong\.me$ -(^|\.)qiandao\.today$ -(^|\.)qiangyou\.org$ -(^|\.)qidian\.ca$ -(^|\.)qienkuen\.org$ -(^|\.)qiwen\.lu$ -(^|\.)qixianglu\.cn$ -(^|\.)qkshare\.com$ -(^|\.)qoos\.com$ -(^|\.)qpoe\.com$ -(^|\.)qq\.co\.za$ -(^|\.)qstatus\.com$ -(^|\.)qtrac\.eu$ -(^|\.)qtweeter\.com$ -(^|\.)quannengshen\.org$ -(^|\.)quantumbooter\.net$ -(^|\.)questvisual\.com$ -(^|\.)quitccp\.net$ -(^|\.)quitccp\.org$ -(^|\.)quora\.com$ -(^|\.)quran\.com$ -(^|\.)quranexplorer\.com$ -(^|\.)qusi8\.net$ -(^|\.)qvodzy\.org$ -(^|\.)qxbbs\.org$ -(^|\.)r18\.com$ -(^|\.)ra\.gg$ -(^|\.)radicalparty\.org$ -(^|\.)radiko\.jp$ -(^|\.)radioaustralia\.net\.au$ -(^|\.)radiohilight\.net$ -(^|\.)radiovaticana\.org$ -(^|\.)radiovncr\.com$ -(^|\.)rael\.org$ -(^|\.)raggedbanner\.com$ -(^|\.)raidcall\.com\.tw$ -(^|\.)raidtalk\.com\.tw$ -(^|\.)rainbowplan\.org$ -(^|\.)raizoji\.or\.jp$ -(^|\.)ramcity\.com\.au$ -(^|\.)rangwang\.biz$ -(^|\.)rangzen\.com$ -(^|\.)rangzen\.net$ -(^|\.)rangzen\.org$ -(^|\.)ranyunfei\.com$ -(^|\.)rapbull\.net$ -(^|\.)rapidgator\.net$ -(^|\.)rapidmoviez\.com$ -(^|\.)rapidvpn\.com$ -(^|\.)raremovie\.cc$ -(^|\.)raremovie\.net$ -(^|\.)rawgit\.com$ -(^|\.)rawgithub\.com$ -(^|\.)razyboard\.com$ -(^|\.)rcinet\.ca$ -(^|\.)rconversation\.blogs\.com$ -(^|\.)rd\.com$ -(^|\.)rdio\.com$ -(^|\.)read01\.com$ -(^|\.)read100\.com$ -(^|\.)readingtimes\.com\.tw$ -(^|\.)readmoo\.com$ -(^|\.)readydown\.com$ -(^|\.)realcourage\.org$ -(^|\.)realforum\.zkiz\.com$ -(^|\.)realitykings\.com$ -(^|\.)realraptalk\.com$ -(^|\.)realsexpass\.com$ -(^|\.)rebatesrule\.net$ -(^|\.)recordhistory\.org$ -(^|\.)recovery\.org\.tw$ -(^|\.)recoveryversion\.com\.tw$ -(^|\.)red-lang\.org$ -(^|\.)redballoonsolidarity\.org$ -(^|\.)redchinacn\.net$ -(^|\.)redchinacn\.org$ -(^|\.)redhotlabs\.com$ -(^|\.)redtube\.com$ -(^|\.)referer\.us$ -(^|\.)reflectivecode\.com$ -(^|\.)registry\.google$ -(^|\.)relaxbbs\.com$ -(^|\.)relay\.com\.tw$ -(^|\.)releaseinternational\.org$ -(^|\.)religioustolerance\.org$ -(^|\.)remembering_tiananmen_20_years$ -(^|\.)renminbao\.com$ -(^|\.)renyurenquan\.org$ -(^|\.)research\.jmsc\.hku\.hk$ -(^|\.)resilio\.com$ -(^|\.)retweeteffect\.com$ -(^|\.)retweetist\.com$ -(^|\.)retweetrank\.com$ -(^|\.)reuters\.com$ -(^|\.)reutersmedia\.net$ -(^|\.)revleft\.com$ -(^|\.)revver\.com$ -(^|\.)rfa\.org$ -(^|\.)rfachina\.com$ -(^|\.)rfamobile\.org$ -(^|\.)rfaweb\.org$ -(^|\.)rferl\.org$ -(^|\.)rfi\.fr$ -(^|\.)rfi\.my$ -(^|\.)rigpa\.org$ -(^|\.)riku\.me$ -(^|\.)rileyguide\.com$ -(^|\.)ritouki\.jp$ -(^|\.)ritter\.vg$ -(^|\.)rlwlw\.com$ -(^|\.)rmjdw\.com$ -(^|\.)rmjdw132\.info$ -(^|\.)roadshow\.hk$ -(^|\.)roboforex\.com$ -(^|\.)robustnessiskey\.com$ -(^|\.)rocket-inc\.net$ -(^|\.)rocksdb\.org$ -(^|\.)rojo\.com$ -(^|\.)rolia\.net$ -(^|\.)ronjoneswriter\.com$ -(^|\.)roodo\.com$ -(^|\.)rosechina\.net$ -(^|\.)rotten\.com$ -(^|\.)rsf-chinese\.org$ -(^|\.)rsf\.org$ -(^|\.)rsgamen\.org$ -(^|\.)rssmeme\.com$ -(^|\.)rtalabel\.org$ -(^|\.)rthk\.hk$ -(^|\.)rthk\.org\.hk$ -(^|\.)rti\.org\.tw$ -(^|\.)rtycminnesota\.org$ -(^|\.)ruanyifeng\.com$ -(^|\.)rukor\.org$ -(^|\.)rushbee\.com$ -(^|\.)ruten\.com\.tw$ -(^|\.)rutube\.ru$ -(^|\.)ruyiseek\.com$ -(^|\.)rxhj\.net$ -(^|\.)s-cute\.com$ -(^|\.)s-dragon\.org$ -(^|\.)s1\.nudezz\.com$ -(^|\.)s1heng\.com$ -(^|\.)s1s1s1\.com$ -(^|\.)s3-ap-northeast-1\.amazonaws\.com$ -(^|\.)s3-ap-southeast-2\.amazonaws\.com$ -(^|\.)s8forum\.com$ -(^|\.)sa\.hao123\.com$ -(^|\.)sacks\.com$ -(^|\.)sacom\.hk$ -(^|\.)sadistic-v\.com$ -(^|\.)sadpanda\.us$ -(^|\.)safervpn\.com$ -(^|\.)saintyculture\.com$ -(^|\.)saiq\.me$ -(^|\.)sakuralive\.com$ -(^|\.)sakya\.org$ -(^|\.)salvation\.org\.hk$ -(^|\.)samair\.ru$ -(^|\.)sambhota\.org$ -(^|\.)sanmin\.com\.tw$ -(^|\.)sapikachu\.net$ -(^|\.)saveliuxiaobo\.com$ -(^|\.)savemedia\.com$ -(^|\.)savethedate\.foo$ -(^|\.)savetibet\.de$ -(^|\.)savetibet\.fr$ -(^|\.)savetibet\.nl$ -(^|\.)savetibet\.org$ -(^|\.)savetibet\.ru$ -(^|\.)savetibetstore\.org$ -(^|\.)savevid\.com$ -(^|\.)say2\.info$ -(^|\.)sbme\.me$ -(^|\.)sbs\.com\.au$ -(^|\.)scasino\.com$ -(^|\.)schema\.org$ -(^|\.)sciencenets\.com$ -(^|\.)scieron\.com$ -(^|\.)scmp\.com$ -(^|\.)scmpchinese\.com$ -(^|\.)scramble\.io$ -(^|\.)scribd\.com$ -(^|\.)scriptspot\.com$ -(^|\.)seapuff\.com$ -(^|\.)search$ -(^|\.)search\.aol\.com$ -(^|\.)search\.yahoo\.co\.jp$ -(^|\.)searchtruth\.com$ -(^|\.)secretchina\.com$ -(^|\.)secretgarden\.no$ -(^|\.)secretsline\.biz$ -(^|\.)secure\.hustler\.com$ -(^|\.)secure\.logmein\.com$ -(^|\.)secure\.raxcdn\.com$ -(^|\.)securetunnel\.com$ -(^|\.)securitykiss\.com$ -(^|\.)seed4\.me$ -(^|\.)seesmic\.com$ -(^|\.)seevpn\.com$ -(^|\.)seezone\.net$ -(^|\.)sejie\.com$ -(^|\.)sellclassics\.com$ -(^|\.)sendsmtp\.com$ -(^|\.)sendspace\.com$ -(^|\.)servehttp\.com$ -(^|\.)serveuser\.com$ -(^|\.)serveusers\.com$ -(^|\.)sesawe\.net$ -(^|\.)sesawe\.org$ -(^|\.)sethwklein\.net$ -(^|\.)setn\.com$ -(^|\.)settv\.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$ -(^|\.)sfileydy\.com$ -(^|\.)sfshibao\.com$ -(^|\.)sftindia\.org$ -(^|\.)sftuk\.org$ -(^|\.)shadeyouvpn\.com$ -(^|\.)shadow\.ma$ -(^|\.)shadowsky\.xyz$ -(^|\.)shadowsocks-r\.com$ -(^|\.)shadowsocks\.asia$ -(^|\.)shadowsocks\.com$ -(^|\.)shadowsocks\.com\.hk$ -(^|\.)shadowsocks\.org$ -(^|\.)shadowsocks9\.com$ -(^|\.)shambalapost\.com$ -(^|\.)shambhalasun\.com$ -(^|\.)shangfang\.org$ -(^|\.)shapeservices\.com$ -(^|\.)share\.dmhy\.org$ -(^|\.)share\.ovi\.com$ -(^|\.)share\.youthwant\.com\.tw$ -(^|\.)sharebee\.com$ -(^|\.)sharecool\.org$ -(^|\.)sharpdaily\.com\.hk$ -(^|\.)sharpdaily\.hk$ -(^|\.)sharpdaily\.tw$ -(^|\.)shat-tibet\.com$ -(^|\.)shattered\.io$ -(^|\.)sheikyermami\.com$ -(^|\.)shellfire\.de$ -(^|\.)shenshou\.org$ -(^|\.)shenyun\.com$ -(^|\.)shenyunperformingarts\.org$ -(^|\.)shenzhoufilm\.com$ -(^|\.)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$ -(^|\.)shopping\.com$ -(^|\.)showbiz\.omy\.sg$ -(^|\.)showhaotu\.com$ -(^|\.)showtime\.jp$ -(^|\.)shutterstock\.com$ -(^|\.)shwchurch\.org$ -(^|\.)shwchurch3\.com$ -(^|\.)siddharthasintent\.org$ -(^|\.)sidelinesnews\.com$ -(^|\.)sidelinessportseatery\.com$ -(^|\.)sierrafriendsoftibet\.org$ -(^|\.)sijihuisuo\.club$ -(^|\.)sijihuisuo\.com$ -(^|\.)silkbook\.com$ -(^|\.)simbolostwitter\.com$ -(^|\.)simplecd\.org$ -(^|\.)simpleproductivityblog\.com$ -(^|\.)sinchew\.com\.my$ -(^|\.)singaporepools\.com\.sg$ -(^|\.)singfortibet\.com$ -(^|\.)singpao\.com\.hk$ -(^|\.)singtao\.com$ -(^|\.)singtaousa\.com$ -(^|\.)sino-monthly\.com$ -(^|\.)sinoants\.com$ -(^|\.)sinocast\.com$ -(^|\.)sinocism\.com$ -(^|\.)sinomontreal\.ca$ -(^|\.)sinonet\.ca$ -(^|\.)sinopitt\.info$ -(^|\.)sinoquebec\.com$ -(^|\.)sipml5\.org$ -(^|\.)sis\.xxx$ -(^|\.)sis001\.com$ -(^|\.)sis001\.us$ -(^|\.)site90\.net$ -(^|\.)sitebro\.tw$ -(^|\.)sitekreator\.com$ -(^|\.)siteks\.uk\.to$ -(^|\.)sitemaps\.org$ -(^|\.)sixth\.biz$ -(^|\.)sjrt\.org$ -(^|\.)sjum\.cn$ -(^|\.)sketchappsources\.com$ -(^|\.)skimtube\.com$ -(^|\.)skybet\.com$ -(^|\.)skyking\.com\.tw$ -(^|\.)skyvegas\.com$ -(^|\.)skyxvpn\.com$ -(^|\.)slacker\.com$ -(^|\.)slaytizle\.com$ -(^|\.)sleazydream\.com$ -(^|\.)slheng\.com$ -(^|\.)slickvpn\.com$ -(^|\.)slideshare\.net$ -(^|\.)slinkset\.com$ -(^|\.)slutload\.com$ -(^|\.)slutmoonbeam\.com$ -(^|\.)slyip\.com$ -(^|\.)slyip\.net$ -(^|\.)sm-miracle\.com$ -(^|\.)smartdnsproxy\.com$ -(^|\.)smarthide\.com$ -(^|\.)smchbooks\.com$ -(^|\.)smh\.com\.au$ -(^|\.)smhric\.org$ -(^|\.)smith\.edu$ -(^|\.)smyxy\.org$ -(^|\.)snapchat\.com$ -(^|\.)snaptu\.com$ -(^|\.)sndcdn\.com$ -(^|\.)sneakme\.net$ -(^|\.)snowlionpub\.com$ -(^|\.)sobees\.com$ -(^|\.)soc\.mil$ -(^|\.)socialwhale\.com$ -(^|\.)sockscap64\.com$ -(^|\.)sockslist\.net$ -(^|\.)socrec\.org$ -(^|\.)sod\.co\.jp$ -(^|\.)sodatea\.github\.io$ -(^|\.)softether-download\.com$ -(^|\.)softether\.co\.jp$ -(^|\.)softether\.org$ -(^|\.)softwarebychuck\.com$ -(^|\.)softwaredownload\.gitbooks\.io$ -(^|\.)sogclub\.com$ -(^|\.)sogrady\.me$ -(^|\.)soh\.tw$ -(^|\.)sohcradio\.com$ -(^|\.)sohfrance\.org$ -(^|\.)sokamonline\.com$ -(^|\.)sokmil\.com$ -(^|\.)solarsystem\.nasa\.gov$ -(^|\.)solidaritetibet\.org$ -(^|\.)solidfiles\.com$ -(^|\.)somee\.com$ -(^|\.)songjianjun\.com$ -(^|\.)sonicbbs\.cc$ -(^|\.)sonidodelaesperanza\.org$ -(^|\.)sopcast\.com$ -(^|\.)sopcast\.org$ -(^|\.)sorazone\.net$ -(^|\.)sorting-algorithms\.com$ -(^|\.)sos\.org$ -(^|\.)sosreader\.com$ -(^|\.)sostibet\.org$ -(^|\.)soubory\.com$ -(^|\.)soul-plus\.net$ -(^|\.)soulcaliburhentai\.net$ -(^|\.)soumo\.info$ -(^|\.)soundcloud\.com$ -(^|\.)soundofhope\.kr$ -(^|\.)soundofhope\.org$ -(^|\.)soup\.io$ -(^|\.)soupofmedia\.com$ -(^|\.)sourceforge\.net$ -(^|\.)sourcewadio\.com$ -(^|\.)southnews\.com\.tw$ -(^|\.)sowers\.org\.hk$ -(^|\.)spankbang\.com$ -(^|\.)spankingtube\.com$ -(^|\.)spankwire\.com$ -(^|\.)spb\.com$ -(^|\.)speakerdeck\.com$ -(^|\.)specxinzl\.jigsy\.com$ -(^|\.)speedify\.com$ -(^|\.)spem\.at$ -(^|\.)spencertipping\.com$ -(^|\.)spicevpn\.com$ -(^|\.)spideroak\.com$ -(^|\.)spike\.com$ -(^|\.)sports\.williamhill\.com$ -(^|\.)spotflux\.com$ -(^|\.)spotify\.com$ -(^|\.)spreadshirt\.es$ -(^|\.)spring4u\.info$ -(^|\.)springboardplatform\.com$ -(^|\.)sprite\.org$ -(^|\.)sproutcore\.com$ -(^|\.)sproxy\.info$ -(^|\.)squirly\.info$ -(^|\.)srcf\.ucam\.org$ -(^|\.)srocket\.us$ -(^|\.)ss-link\.com$ -(^|\.)ss\.carryzhou\.com$ -(^|\.)ss\.levyhsu\.com$ -(^|\.)ssglobal\.co$ -(^|\.)ssglobal\.me$ -(^|\.)ssh91\.com$ -(^|\.)ssl\.webpack\.de$ -(^|\.)ssl443\.org$ -(^|\.)sspro\.ml$ -(^|\.)sss\.camp$ -(^|\.)sstmlt\.moe$ -(^|\.)sstmlt\.net$ -(^|\.)stackoverflow\.com$ -(^|\.)stage64\.hk$ -(^|\.)standupfortibet\.org$ -(^|\.)stanford\.edu$ -(^|\.)starfishfx\.com$ -(^|\.)starp2p\.com$ -(^|\.)startpage\.com$ -(^|\.)startuplivingchina\.com$ -(^|\.)stat\.gov\.tw$ -(^|\.)static-economist\.com$ -(^|\.)static\.comico\.tw$ -(^|\.)static01\.nyt\.com$ -(^|\.)staticflickr\.com$ -(^|\.)statueofdemocracy\.org$ -(^|\.)stc\.com\.sa$ -(^|\.)steamcommunity\.com$ -(^|\.)steel-storm\.com$ -(^|\.)steganos\.com$ -(^|\.)steganos\.net$ -(^|\.)stepchina\.com$ -(^|\.)stephaniered\.com$ -(^|\.)sthoo\.com$ -(^|\.)stickam\.com$ -(^|\.)stickeraction\.com$ -(^|\.)stileproject\.com$ -(^|\.)sto\.cc$ -(^|\.)stoporganharvesting\.org$ -(^|\.)stoptibetcrisis\.net$ -(^|\.)storagenewsletter\.com$ -(^|\.)store\.steampowered\.com$ -(^|\.)stories\.google$ -(^|\.)storify\.com$ -(^|\.)storm\.mg$ -(^|\.)stormmediagroup\.com$ -(^|\.)stoweboyd\.com$ -(^|\.)stranabg\.com$ -(^|\.)straplessdildo\.com$ -(^|\.)streamingthe\.net$ -(^|\.)streema\.com$ -(^|\.)strikingly\.com$ -(^|\.)strongvpn\.com$ -(^|\.)strongwindpress\.com$ -(^|\.)student\.tw$ -(^|\.)studentsforafreetibet\.org$ -(^|\.)stumbleupon\.com$ -(^|\.)stupidvideos\.com$ -(^|\.)subacme\.rerouted\.org$ -(^|\.)successfn\.com$ -(^|\.)sugarsync\.com$ -(^|\.)sugobbs\.com$ -(^|\.)sugumiru18\.com$ -(^|\.)suissl\.com$ -(^|\.)sujiatun\.wordpress\.com$ -(^|\.)sulian\.me$ -(^|\.)summify\.com$ -(^|\.)sumrando\.com$ -(^|\.)sun1911\.com$ -(^|\.)sunmedia\.ca$ -(^|\.)sunporno\.com$ -(^|\.)sunskyforum\.com$ -(^|\.)sunta\.com\.tw$ -(^|\.)sunvpn\.net$ -(^|\.)sunwinism\.joinbbs\.net$ -(^|\.)suoluo\.org$ -(^|\.)superfreevpn\.com$ -(^|\.)superokayama\.com$ -(^|\.)superpages\.com$ -(^|\.)supervpn\.net$ -(^|\.)suppig\.net$ -(^|\.)suprememastertv\.com$ -(^|\.)surfeasy\.com$ -(^|\.)surfeasy\.com\.au$ -(^|\.)suroot\.com$ -(^|\.)surrenderat20\.net$ -(^|\.)suyangg\.com$ -(^|\.)svsfx\.com$ -(^|\.)swagbucks\.com$ -(^|\.)swissvpn\.net$ -(^|\.)switch1\.jp$ -(^|\.)switchvpn\.net$ -(^|\.)sydneytoday\.com$ -(^|\.)sylfoundation\.org$ -(^|\.)syncback\.com$ -(^|\.)synergyse\.com$ -(^|\.)sysresccd\.org$ -(^|\.)sytes\.net$ -(^|\.)szbbs\.net$ -(^|\.)szetowah\.org\.hk$ -(^|\.)t-g\.com$ -(^|\.)t\.co$ -(^|\.)t\.me$ -(^|\.)t\.orzdream\.com$ -(^|\.)t35\.com$ -(^|\.)t66y\.com$ -(^|\.)taa-usa\.org$ -(^|\.)taaze\.tw$ -(^|\.)tabtter\.jp$ -(^|\.)tacc\.cwb\.gov\.tw$ -(^|\.)tacem\.org$ -(^|\.)taconet\.com\.tw$ -(^|\.)taedp\.org\.tw$ -(^|\.)tafm\.org$ -(^|\.)tagwa\.org\.au$ -(^|\.)tagwalk\.com$ -(^|\.)tahr\.org\.tw$ -(^|\.)taipei\.gov\.tw$ -(^|\.)taipeisociety\.org$ -(^|\.)taiwan-sex\.com$ -(^|\.)taiwanbible\.com$ -(^|\.)taiwancon\.com$ -(^|\.)taiwandaily\.net$ -(^|\.)taiwandc\.org$ -(^|\.)taiwanjobs\.gov\.tw$ -(^|\.)taiwanjustice\.com$ -(^|\.)taiwankiss\.com$ -(^|\.)taiwannation\.50webs\.com$ -(^|\.)taiwannation\.com$ -(^|\.)taiwannation\.com\.tw$ -(^|\.)taiwanncf\.org\.tw$ -(^|\.)taiwannews\.com\.tw$ -(^|\.)taiwantp\.net$ -(^|\.)taiwantt\.org\.tw$ -(^|\.)taiwanus\.net$ -(^|\.)taiwanyes\.com$ -(^|\.)taiwanyes\.ning\.com$ -(^|\.)talk853\.com$ -(^|\.)talkboxapp\.com$ -(^|\.)talkonly\.net$ -(^|\.)tamiaode\.tk$ -(^|\.)tanc\.org$ -(^|\.)tangben\.com$ -(^|\.)tangren\.us$ -(^|\.)taoism\.net$ -(^|\.)taolun\.info$ -(^|\.)tapanwap\.com$ -(^|\.)tapatalk\.com$ -(^|\.)tarr\.uspto\.gov$ -(^|\.)tascn\.com\.au$ -(^|\.)taup\.net$ -(^|\.)taweet\.com$ -(^|\.)tbcollege\.org$ -(^|\.)tbi\.org\.hk$ -(^|\.)tbicn\.org$ -(^|\.)tbjyt\.org$ -(^|\.)tbpic\.info$ -(^|\.)tbrc\.org$ -(^|\.)tbs-rainbow\.org$ -(^|\.)tbsec\.org$ -(^|\.)tbskkinabalu\.page\.tl$ -(^|\.)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$ -(^|\.)teachparentstech\.org$ -(^|\.)teamamericany\.com$ -(^|\.)tech2\.in\.com$ -(^|\.)teck\.in$ -(^|\.)teeniefuck\.net$ -(^|\.)teensinasia\.com$ -(^|\.)telecomspace\.com$ -(^|\.)telegram\.dog$ -(^|\.)telegram\.me$ -(^|\.)telegram\.org$ -(^|\.)telegramdownload\.com$ -(^|\.)telegraph\.co\.uk$ -(^|\.)telesco\.pe$ -(^|\.)tellme\.pw$ -(^|\.)tenacy\.com$ -(^|\.)tensorflow\.org$ -(^|\.)tenzinpalmo\.com$ -(^|\.)tew\.org$ -(^|\.)th\.hao123\.com$ -(^|\.)thaicn\.com$ -(^|\.)thb\.gov\.tw$ -(^|\.)theatrum-belli\.com$ -(^|\.)thebcomplex\.com$ -(^|\.)theblemish\.com$ -(^|\.)thebobs\.com$ -(^|\.)thebodyshop-usa\.com$ -(^|\.)thecenter\.mit\.edu$ -(^|\.)thechinabeat\.org$ -(^|\.)thedalailamamovie\.com$ -(^|\.)thedw\.us$ -(^|\.)thefacebook\.com$ -(^|\.)thefrontier\.hk$ -(^|\.)thegioitinhoc\.vn$ -(^|\.)thegly\.com$ -(^|\.)thehots\.info$ -(^|\.)thehousenews\.com$ -(^|\.)thehun\.net$ -(^|\.)theinitium\.com$ -(^|\.)thenewslens\.com$ -(^|\.)thepiratebay\.org$ -(^|\.)theportalwiki\.com$ -(^|\.)thereallove\.kr$ -(^|\.)therock\.net\.nz$ -(^|\.)thespeeder\.com$ -(^|\.)thestandnews\.com$ -(^|\.)thetibetcenter\.org$ -(^|\.)thetibetconnection\.org$ -(^|\.)thetibetmuseum\.org$ -(^|\.)thetibetpost\.com$ -(^|\.)thetinhat\.com$ -(^|\.)thetrotskymovie\.com$ -(^|\.)thevivekspot\.com$ -(^|\.)thewgo\.org$ -(^|\.)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-info\.net$ -(^|\.)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$ -(^|\.)tibetanfeministcollective\.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$ -(^|\.)tibetlibre\.free\.fr$ -(^|\.)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$ -(^|\.)tiltbrush\.com$ -(^|\.)timdir\.com$ -(^|\.)time\.com$ -(^|\.)times\.hinet\.net$ -(^|\.)timesofindia\.indiatimes\.com$ -(^|\.)timsah\.com$ -(^|\.)tintuc101\.com$ -(^|\.)tiny\.cc$ -(^|\.)tinychat\.com$ -(^|\.)tinypaste\.com$ -(^|\.)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$ -(^|\.)tongil\.or\.kr$ -(^|\.)tono-oka\.jp$ -(^|\.)tonyyan\.net$ -(^|\.)toodoc\.com$ -(^|\.)toonel\.net$ -(^|\.)top\.tv$ -(^|\.)top81\.ws$ -(^|\.)topic\.youthwant\.com\.tw$ -(^|\.)topnews\.in$ -(^|\.)toppornsites\.com$ -(^|\.)topshareware\.com$ -(^|\.)topsy\.com$ -(^|\.)toptip\.ca$ -(^|\.)tor\.blingblingsquad\.net$ -(^|\.)tor\.cn\.uptodown\.com$ -(^|\.)tor\.updatestar\.com$ -(^|\.)tora\.to$ -(^|\.)torcn\.com$ -(^|\.)torguard\.net$ -(^|\.)torproject\.org$ -(^|\.)torrentprivacy\.com$ -(^|\.)torrentproject\.se$ -(^|\.)torrenty\.org$ -(^|\.)torrentz\.eu$ -(^|\.)torvpn\.com$ -(^|\.)tosh\.comedycentral\.com$ -(^|\.)totalvpn\.com$ -(^|\.)toutiaoabc\.com$ -(^|\.)towngain\.com$ -(^|\.)toypark\.in$ -(^|\.)toythieves\.com$ -(^|\.)toytractorshow\.com$ -(^|\.)tparents\.org$ -(^|\.)tpi\.org\.tw$ -(^|\.)tracfone\.com$ -(^|\.)traffichaus\.com$ -(^|\.)trans\.wenweipo\.com$ -(^|\.)transparency\.org$ -(^|\.)treemall\.com\.tw$ -(^|\.)trendsmap\.com$ -(^|\.)trialofccp\.org$ -(^|\.)trickip\.net$ -(^|\.)trickip\.org$ -(^|\.)trimondi\.de$ -(^|\.)trouw\.nl$ -(^|\.)trt\.net\.tr$ -(^|\.)trtc\.com\.tw$ -(^|\.)truebuddha-md\.org$ -(^|\.)trulyergonomic\.com$ -(^|\.)truth101\.co\.tv$ -(^|\.)truthontour\.org$ -(^|\.)truveo\.com$ -(^|\.)tryheart\.jp$ -(^|\.)tsctv\.net$ -(^|\.)tsdr\.uspto\.gov$ -(^|\.)tsemtulku\.com$ -(^|\.)tsquare\.tv$ -(^|\.)tsu\.org\.tw$ -(^|\.)tsunagarumon\.com$ -(^|\.)tt-rss\.org$ -(^|\.)tt1069\.com$ -(^|\.)tttan\.com$ -(^|\.)tu8964\.com$ -(^|\.)tubaholic\.com$ -(^|\.)tube\.com$ -(^|\.)tube8\.com$ -(^|\.)tube911\.com$ -(^|\.)tubecup\.com$ -(^|\.)tubegals\.com$ -(^|\.)tubeislam\.com$ -(^|\.)tubestack\.com$ -(^|\.)tubewolf\.com$ -(^|\.)tui\.orzdream\.com$ -(^|\.)tuibeitu\.net$ -(^|\.)tuidang\.net$ -(^|\.)tuidang\.org$ -(^|\.)tuidang\.se$ -(^|\.)tuitwit\.com$ -(^|\.)tumblr\.com$ -(^|\.)tumutanzi\.com$ -(^|\.)tumview\.com$ -(^|\.)tunein\.com$ -(^|\.)tunnelbear\.com$ -(^|\.)tunnelr\.com$ -(^|\.)tuo8\.blue$ -(^|\.)tuo8\.cc$ -(^|\.)tuo8\.club$ -(^|\.)tuo8\.fit$ -(^|\.)tuo8\.hk$ -(^|\.)tuo8\.in$ -(^|\.)tuo8\.ninja$ -(^|\.)tuo8\.org$ -(^|\.)tuo8\.pw$ -(^|\.)tuo8\.red$ -(^|\.)tuo8\.space$ -(^|\.)turansam\.org$ -(^|\.)turbobit\.net$ -(^|\.)turbohide\.com$ -(^|\.)turbotwitter\.com$ -(^|\.)turntable\.fm$ -(^|\.)tushycash\.com$ -(^|\.)tuvpn\.com$ -(^|\.)tuzaijidi\.com$ -(^|\.)tv\.com$ -(^|\.)tvants\.com$ -(^|\.)tvboxnow\.com$ -(^|\.)tvider\.com$ -(^|\.)tvmost\.com\.hk$ -(^|\.)tvplayvideos\.com$ -(^|\.)tvunetworks\.com$ -(^|\.)tw-blog\.com$ -(^|\.)tw-npo\.org$ -(^|\.)tw\.answers\.yahoo\.com$ -(^|\.)tw\.bid\.yahoo\.com$ -(^|\.)tw\.gigacircle\.com$ -(^|\.)tw\.hao123\.com$ -(^|\.)tw\.jiepang\.com$ -(^|\.)tw\.knowledge\.yahoo\.com$ -(^|\.)tw\.mall\.yahoo\.com$ -(^|\.)tw\.mobi\.yahoo\.com$ -(^|\.)tw\.money\.yahoo\.com$ -(^|\.)tw\.myblog\.yahoo\.com$ -(^|\.)tw\.news\.yahoo\.com$ -(^|\.)tw\.streetvoice\.com$ -(^|\.)tw\.tomonews\.net$ -(^|\.)tw\.voa\.mobi$ -(^|\.)tw\.yahoo\.com$ -(^|\.)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$ -(^|\.)tweets\.seraph\.me$ -(^|\.)tweettunnel\.com$ -(^|\.)tweetwally\.com$ -(^|\.)tweetymail\.com$ -(^|\.)tweez\.net$ -(^|\.)twelve\.today$ -(^|\.)twerkingbutt\.com$ -(^|\.)twftp\.org$ -(^|\.)twgreatdaily\.com$ -(^|\.)twibase\.com$ -(^|\.)twibble\.de$ -(^|\.)twibbon\.com$ -(^|\.)twibs\.com$ -(^|\.)twicsy\.com$ -(^|\.)twiends\.com$ -(^|\.)twifan\.com$ -(^|\.)twiffo\.com$ -(^|\.)twiggit\.org$ -(^|\.)twilightsex\.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$ -(^|\.)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$ -(^|\.)twskype\.com$ -(^|\.)twstar\.net$ -(^|\.)twt\.tl$ -(^|\.)twtkr\.com$ -(^|\.)twtr2src\.ogaoga\.org$ -(^|\.)twtrland\.com$ -(^|\.)twttr\.com$ -(^|\.)twurl\.nl$ -(^|\.)twyac\.org$ -(^|\.)txxx\.com$ -(^|\.)tycool\.com$ -(^|\.)typepad\.com$ -(^|\.)u9un\.com$ -(^|\.)ub0\.cc$ -(^|\.)ubddns\.org$ -(^|\.)uberproxy\.net$ -(^|\.)uc-japan\.org$ -(^|\.)ucdc1998\.org$ -(^|\.)uderzo\.it$ -(^|\.)udn\.com$ -(^|\.)udn\.com\.tw$ -(^|\.)udnbkk\.com$ -(^|\.)uforadio\.com\.tw$ -(^|\.)ufreevpn\.com$ -(^|\.)ugo\.com$ -(^|\.)uhdwallpapers\.org$ -(^|\.)uhrp\.org$ -(^|\.)uighur\.narod\.ru$ -(^|\.)uighur\.nl$ -(^|\.)uighurbiz\.net$ -(^|\.)ukcdp\.co\.uk$ -(^|\.)ukliferadio\.co\.uk$ -(^|\.)ulike\.net$ -(^|\.)ulop\.net$ -(^|\.)ultrareach$ -(^|\.)ultrasurf$ -(^|\.)ultravpn\.fr$ -(^|\.)ultraxs\.com$ -(^|\.)umich\.edu$ -(^|\.)unblock-us\.com$ -(^|\.)unblock\.cn\.com$ -(^|\.)unblockdmm\.com$ -(^|\.)unblocker\.yt$ -(^|\.)unblocksit\.es$ -(^|\.)uncyclomedia\.org$ -(^|\.)uncyclopedia\.hk$ -(^|\.)uncyclopedia\.tw$ -(^|\.)underwoodammo\.com$ -(^|\.)unholyknight\.com$ -(^|\.)uni\.cc$ -(^|\.)unification\.net$ -(^|\.)unification\.org\.tw$ -(^|\.)unitedsocialpress\.com$ -(^|\.)unix100\.com$ -(^|\.)unknownspace\.org$ -(^|\.)unodedos\.com$ -(^|\.)unpo\.org$ -(^|\.)unseen\.is$ -(^|\.)untraceable\.us$ -(^|\.)uocn\.org$ -(^|\.)upcoming\.yahoo\.com$ -(^|\.)updates\.tdesktop\.com$ -(^|\.)upholdjustice\.org$ -(^|\.)upload4u\.info$ -(^|\.)uploaded\.net$ -(^|\.)uploaded\.to$ -(^|\.)uploadstation\.com$ -(^|\.)upmedia\.mg$ -(^|\.)upornia\.com$ -(^|\.)uproxy\.org$ -(^|\.)upwill\.org$ -(^|\.)ur7s\.com$ -(^|\.)urbansurvival\.com$ -(^|\.)urchin\.com$ -(^|\.)urlborg\.com$ -(^|\.)urlparser\.com$ -(^|\.)us\.to$ -(^|\.)usacn\.com$ -(^|\.)usaip\.eu$ -(^|\.)userapi\.nytlog\.com$ -(^|\.)users\.skynet\.be$ -(^|\.)usfk\.mil$ -(^|\.)ushuarencity\.echainhost\.com$ -(^|\.)usinfo\.state\.gov$ -(^|\.)usma\.edu$ -(^|\.)usmc\.mil$ -(^|\.)usmgtcg\.ning\.com$ -(^|\.)usno\.navy\.mil$ -(^|\.)usocctn\.com$ -(^|\.)ustream\.tv$ -(^|\.)usunitednews\.com$ -(^|\.)usus\.cc$ -(^|\.)utopianpal\.com$ -(^|\.)uu-gg\.com$ -(^|\.)uvwxyz\.xyz$ -(^|\.)uwants\.com$ -(^|\.)uwants\.net$ -(^|\.)uyghur-j\.org$ -(^|\.)uyghur\.co\.uk$ -(^|\.)uyghuramerican\.org$ -(^|\.)uyghurcanadiansociety\.org$ -(^|\.)uyghurcongress\.org$ -(^|\.)uyghurensemble\.co\.uk$ -(^|\.)uyghurpen\.org$ -(^|\.)uyghurpress\.com$ -(^|\.)uyghurstudies\.org$ -(^|\.)uygur\.fc2web\.com$ -(^|\.)uygur\.org$ -(^|\.)uymaarip\.com$ -(^|\.)v2ex\.com$ -(^|\.)v2ray\.com$ -(^|\.)van001\.com$ -(^|\.)van698\.com$ -(^|\.)vanemu\.cn$ -(^|\.)vanilla-jp\.com$ -(^|\.)vanpeople\.com$ -(^|\.)vansky\.com$ -(^|\.)vatn\.org$ -(^|\.)vcf-online\.org$ -(^|\.)vcfbuilder\.org$ -(^|\.)vds\.rightster\.com$ -(^|\.)vegas\.williamhill\.com$ -(^|\.)vegasred\.com$ -(^|\.)velkaepocha\.sk$ -(^|\.)venbbs\.com$ -(^|\.)venchina\.com$ -(^|\.)venetianmacao\.com$ -(^|\.)ventureswell\.com$ -(^|\.)veoh\.com$ -(^|\.)vermonttibet\.org$ -(^|\.)versavpn\.com$ -(^|\.)verybs\.com$ -(^|\.)vevo\.com$ -(^|\.)vft\.com\.tw$ -(^|\.)viber\.com$ -(^|\.)vica\.info$ -(^|\.)victimsofcommunism\.org$ -(^|\.)vid\.me$ -(^|\.)vidble\.com$ -(^|\.)video\.aol\.ca$ -(^|\.)video\.aol\.co\.uk$ -(^|\.)video\.aol\.com$ -(^|\.)video\.ap\.org$ -(^|\.)video\.fdbox\.com$ -(^|\.)video\.foxbusiness\.com$ -(^|\.)video\.pbs\.org$ -(^|\.)video\.yahoo\.com$ -(^|\.)videobam\.com$ -(^|\.)videodetective\.com$ -(^|\.)videomega\.tv$ -(^|\.)videomo\.com$ -(^|\.)videopediaworld\.com$ -(^|\.)videopress\.com$ -(^|\.)vidinfo\.org$ -(^|\.)vietdaikynguyen\.com$ -(^|\.)vijayatemple\.org$ -(^|\.)vimeo\.com$ -(^|\.)vimperator\.org$ -(^|\.)vincnd\.com$ -(^|\.)vine\.co$ -(^|\.)vinniev\.com$ -(^|\.)vip-enterprise\.com$ -(^|\.)visibletweets\.com$ -(^|\.)vital247\.org$ -(^|\.)viu\.com$ -(^|\.)viu\.tv$ -(^|\.)vivahentai4u\.net$ -(^|\.)vivatube\.com$ -(^|\.)vivthomas\.com$ -(^|\.)vizvaz\.com$ -(^|\.)vjmedia\.com\.hk$ -(^|\.)vllcs\.org$ -(^|\.)vlog\.xuite\.net$ -(^|\.)vmixcore\.com$ -(^|\.)vn\.hao123\.com$ -(^|\.)vnet\.link$ -(^|\.)voa-11\.akacast\.akamaistream\.net$ -(^|\.)voacantonese\.com$ -(^|\.)voachinese\.com$ -(^|\.)voachineseblog\.com$ -(^|\.)voagd\.com$ -(^|\.)voanews\.com$ -(^|\.)voatibetan\.com$ -(^|\.)voatibetanenglish\.com$ -(^|\.)vocativ\.com$ -(^|\.)vocn\.tv$ -(^|\.)vod\.wwe\.com$ -(^|\.)vot\.org$ -(^|\.)vovo2000\.com$ -(^|\.)voxer\.com$ -(^|\.)voy\.com$ -(^|\.)vpn\.ac$ -(^|\.)vpn\.cjb\.net$ -(^|\.)vpn\.cmu\.edu$ -(^|\.)vpn\.sv\.cmu\.edu$ -(^|\.)vpn4all\.com$ -(^|\.)vpnaccount\.org$ -(^|\.)vpnaccounts\.com$ -(^|\.)vpnbook\.com$ -(^|\.)vpncomparison\.org$ -(^|\.)vpncoupons\.com$ -(^|\.)vpncup\.com$ -(^|\.)vpndada\.com$ -(^|\.)vpnfan\.com$ -(^|\.)vpnfire\.com$ -(^|\.)vpnforgame\.net$ -(^|\.)vpngate\.jp$ -(^|\.)vpngate\.net$ -(^|\.)vpngratis\.net$ -(^|\.)vpnhq\.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$ -(^|\.)vtunnel\.com$ -(^|\.)vuku\.cc$ -(^|\.)w\.idaiwan\.com$ -(^|\.)w3schools\.com$ -(^|\.)waffle1999\.com$ -(^|\.)wahas\.com$ -(^|\.)waigaobu\.com$ -(^|\.)waikeung\.org$ -(^|\.)wailaike\.net$ -(^|\.)waiwaier\.com$ -(^|\.)wallmama\.com$ -(^|\.)wallornot\.org$ -(^|\.)wallpapercasa\.com$ -(^|\.)wallproxy\.com$ -(^|\.)waltermartin\.com$ -(^|\.)waltermartin\.org$ -(^|\.)wanderinghorse\.net$ -(^|\.)wangafu\.net$ -(^|\.)wangjinbo\.org$ -(^|\.)wanglixiong\.com$ -(^|\.)wango\.org$ -(^|\.)wangruoshui\.net$ -(^|\.)want-daily\.com$ -(^|\.)wanz-factory\.com$ -(^|\.)wapedia\.mobi$ -(^|\.)warbler\.iconfactory\.net$ -(^|\.)waselpro\.com$ -(^|\.)washeng\.net$ -(^|\.)watch8x\.com$ -(^|\.)watchinese\.com$ -(^|\.)watchmygf\.net$ -(^|\.)wattpad\.com$ -(^|\.)wav\.tv$ -(^|\.)waveprotocol\.org$ -(^|\.)waymo\.com$ -(^|\.)wda\.gov\.tw$ -(^|\.)wdf5\.com$ -(^|\.)wearehairy\.com$ -(^|\.)wearn\.com$ -(^|\.)web2project\.net$ -(^|\.)webbang\.net$ -(^|\.)webevader\.org$ -(^|\.)webfreer\.com$ -(^|\.)webjb\.org$ -(^|\.)weblagu\.com$ -(^|\.)webmproject\.org$ -(^|\.)webrtc\.org$ -(^|\.)webrush\.net$ -(^|\.)webs-tv\.net$ -(^|\.)website\.informer\.com$ -(^|\.)websitepulse\.com$ -(^|\.)webwarper\.net$ -(^|\.)webworkerdaily\.com$ -(^|\.)weekmag\.info$ -(^|\.)wefightcensorship\.org$ -(^|\.)wefong\.com$ -(^|\.)weiboleak\.com$ -(^|\.)weiboscope\.jmsc\.hku\.hk$ -(^|\.)weihuo\.org$ -(^|\.)weijingsheng\.org$ -(^|\.)weiming\.info$ -(^|\.)weiquanwang\.org$ -(^|\.)weisuo\.ws$ -(^|\.)welovecock\.com$ -(^|\.)wemigrate\.org$ -(^|\.)wengewang\.com$ -(^|\.)wengewang\.org$ -(^|\.)wenhui\.ch$ -(^|\.)wenxuecity\.com$ -(^|\.)wenyunchao\.com$ -(^|\.)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\.net$ -(^|\.)wheatseeds\.org$ -(^|\.)wheelockslatin\.com$ -(^|\.)whereiswerner\.com$ -(^|\.)wheretowatch\.com$ -(^|\.)whippedass\.com$ -(^|\.)whitebear\.freebearblog\.org$ -(^|\.)whodns\.xyz$ -(^|\.)whoer\.net$ -(^|\.)whotalking\.com$ -(^|\.)whylover\.com$ -(^|\.)whyx\.org$ -(^|\.)widevine\.com$ -(^|\.)wikaba\.com$ -(^|\.)wiki\.cnitter\.com$ -(^|\.)wiki\.esu\.im$ -(^|\.)wiki\.gamerp\.jp$ -(^|\.)wiki\.jqueryui\.com$ -(^|\.)wiki\.keso\.cn$ -(^|\.)wiki\.moegirl\.org$ -(^|\.)wiki\.oauth\.net$ -(^|\.)wiki\.phonegap\.com$ -(^|\.)wikileaks-forum\.com$ -(^|\.)wikileaks\.ch$ -(^|\.)wikileaks\.com$ -(^|\.)wikileaks\.de$ -(^|\.)wikileaks\.eu$ -(^|\.)wikileaks\.lu$ -(^|\.)wikileaks\.org$ -(^|\.)wikileaks\.pl$ -(^|\.)wikilivres\.info$ -(^|\.)wikimapia\.org$ -(^|\.)wikiwiki\.jp$ -(^|\.)wildammo\.com$ -(^|\.)willw\.net$ -(^|\.)windowsphoneme\.com$ -(^|\.)windscribe\.com$ -(^|\.)wingamestore\.com$ -(^|\.)wingy\.site$ -(^|\.)winning11\.com$ -(^|\.)winwhispers\.info$ -(^|\.)wire\.com$ -(^|\.)wiredbytes\.com$ -(^|\.)wiredpen\.com$ -(^|\.)wisdompubs\.org$ -(^|\.)wisevid\.com$ -(^|\.)withgoogle\.com$ -(^|\.)withyoutube\.com$ -(^|\.)witnessleeteaching\.com$ -(^|\.)witopia\.net$ -(^|\.)wizcrafts\.net$ -(^|\.)wjbk\.org$ -(^|\.)wlcnew\.jigsy\.com$ -(^|\.)wlx\.sowiki\.net$ -(^|\.)wn\.com$ -(^|\.)wnacg\.com$ -(^|\.)wnacg\.org$ -(^|\.)wo\.tc$ -(^|\.)wo3ttt\.wordpress\.com$ -(^|\.)woeser\.com$ -(^|\.)woesermiddle-way\.net$ -(^|\.)wokar\.org$ -(^|\.)wolfax\.com$ -(^|\.)woolyss\.com$ -(^|\.)woopie\.jp$ -(^|\.)woopie\.tv$ -(^|\.)wordpress\.com$ -(^|\.)workatruna\.com$ -(^|\.)workerdemo\.org\.hk$ -(^|\.)workersthebig\.net$ -(^|\.)worldcat\.org$ -(^|\.)worldjournal\.com$ -(^|\.)worldvpn\.net$ -(^|\.)wow-life\.net$ -(^|\.)wow\.com$ -(^|\.)wowgirls\.com$ -(^|\.)wowlegacy\.ml$ -(^|\.)wowporn\.com$ -(^|\.)wowrk\.com$ -(^|\.)woxinghuiguo\.com$ -(^|\.)woyaolian\.org$ -(^|\.)wozy\.in$ -(^|\.)wp\.com$ -(^|\.)wpoforum\.com$ -(^|\.)wqyd\.org$ -(^|\.)wrchina\.org$ -(^|\.)wretch\.cc$ -(^|\.)writer\.zoho\.com$ -(^|\.)wsgzao\.github\.io$ -(^|\.)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$ -(^|\.)wuu\.wikipedia\.org$ -(^|\.)wuw\.red$ -(^|\.)wuyanblog\.com$ -(^|\.)wwitv\.com$ -(^|\.)www\.ajsands\.com$ -(^|\.)www\.americorps\.gov$ -(^|\.)www\.antd\.org$ -(^|\.)www\.aolnews\.com$ -(^|\.)www\.businessinsider\.com\.au$ -(^|\.)www\.citizenlab\.org$ -(^|\.)www\.cmoinc\.org$ -(^|\.)www\.cool18\.com$ -(^|\.)www\.dmm\.com$ -(^|\.)www\.dwheeler\.com$ -(^|\.)www\.eastturkistan\.net$ -(^|\.)www\.ftchinese\.com$ -(^|\.)www\.gmiddle\.com$ -(^|\.)www\.gmiddle\.net$ -(^|\.)www\.hustlercash\.com$ -(^|\.)www\.idlcoyote\.com$ -(^|\.)www\.imdb\.com$ -(^|\.)www\.kindleren\.com$ -(^|\.)www\.klip\.me$ -(^|\.)www\.lamenhu\.com$ -(^|\.)www\.lib\.virginia\.edu$ -(^|\.)www\.linksalpha\.com$ -(^|\.)www\.m-sport\.co\.uk$ -(^|\.)www\.metro\.taipei$ -(^|\.)www\.monlamit\.org$ -(^|\.)www\.moztw\.org$ -(^|\.)www\.nbc\.com$ -(^|\.)www\.orchidbbs\.com$ -(^|\.)www\.owind\.com$ -(^|\.)www\.oxid\.it$ -(^|\.)www\.powerpointninja\.com$ -(^|\.)www\.s4miniarchive\.com$ -(^|\.)www\.sciencemag\.org$ -(^|\.)www\.shadowsocks\.com$ -(^|\.)www\.shwchurch\.org$ -(^|\.)www\.skype\.com$ -(^|\.)www\.tablesgenerator\.com$ -(^|\.)www\.taiwanonline\.cc$ -(^|\.)www\.taup\.org\.tw$ -(^|\.)www\.thechinastory\.org$ -(^|\.)www\.wan-press\.org$ -(^|\.)www\.wangruowang\.org$ -(^|\.)www\.websnapr\.com$ -(^|\.)www\.zensur\.freerk\.com$ -(^|\.)www1\.american\.edu$ -(^|\.)www1\.biz$ -(^|\.)www2\.ohchr\.org$ -(^|\.)www2\.rocketbbs\.com$ -(^|\.)wwwhost\.biz$ -(^|\.)wzyboy\.im$ -(^|\.)x-art\.com$ -(^|\.)x-berry\.com$ -(^|\.)x-wall\.org$ -(^|\.)x\.company$ -(^|\.)x1949x\.com$ -(^|\.)x24hr\.com$ -(^|\.)x365x\.com$ -(^|\.)xa\.yimg\.com$ -(^|\.)xanga\.com$ -(^|\.)xbabe\.com$ -(^|\.)xbookcn\.com$ -(^|\.)xcafe\.in$ -(^|\.)xcity\.jp$ -(^|\.)xcritic\.com$ -(^|\.)xerotica\.com$ -(^|\.)xfinity\.com$ -(^|\.)xfm\.pp\.ru$ -(^|\.)xgmyd\.com$ -(^|\.)xhamster\.com$ -(^|\.)xianchawang\.net$ -(^|\.)xianjian\.tw$ -(^|\.)xianqiao\.net$ -(^|\.)xiaobaiwu\.com$ -(^|\.)xiaochuncnjp\.com$ -(^|\.)xiaod\.in$ -(^|\.)xiaohexie\.com$ -(^|\.)xiaolan\.me$ -(^|\.)xiaoma\.org$ -(^|\.)xiezhua\.com$ -(^|\.)xihua\.es$ -(^|\.)xing\.com$ -(^|\.)xinhuanet\.org$ -(^|\.)xinmiao\.com\.hk$ -(^|\.)xinqimeng\.over-blog\.com$ -(^|\.)xinsheng\.net$ -(^|\.)xinshijue\.com$ -(^|\.)xinyubbs\.net$ -(^|\.)xiongpian\.com$ -(^|\.)xiuren\.org$ -(^|\.)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--czq75pvv1aj5c\.org$ -(^|\.)xn--i2ru8q2qg\.com$ -(^|\.)xn--ngstr-lra8j\.com$ -(^|\.)xn--p8j9a0d9c9a\.xn--q9jyb4c$ -(^|\.)xnxx\.com$ -(^|\.)xpdo\.net$ -(^|\.)xpud\.org$ -(^|\.)xrentdvd\.com$ -(^|\.)xskywalker\.com$ -(^|\.)xskywalker\.net$ -(^|\.)xtube\.com$ -(^|\.)xuchao\.net$ -(^|\.)xuchao\.org$ -(^|\.)xuehua\.us$ -(^|\.)xuzhiyong\.net$ -(^|\.)xvideo\.cc$ -(^|\.)xvideos\.com$ -(^|\.)xvideos\.es$ -(^|\.)xxbbx\.com$ -(^|\.)xxlmovies\.com$ -(^|\.)xxuz\.com$ -(^|\.)xxx\.com$ -(^|\.)xxx\.xxx$ -(^|\.)xxxfuckmom\.com$ -(^|\.)xxxx\.com\.au$ -(^|\.)xxxy\.biz$ -(^|\.)xxxy\.info$ -(^|\.)xxxymovies\.com$ -(^|\.)xys\.dxiong\.com$ -(^|\.)xys\.org$ -(^|\.)xysblogs\.org$ -(^|\.)xyy69\.com$ -(^|\.)xyy69\.info$ -(^|\.)yahoo\.com\.hk$ -(^|\.)yakbutterblues\.com$ -(^|\.)yam\.com$ -(^|\.)yam\.org\.tw$ -(^|\.)yanghengjun\.com$ -(^|\.)yangjianli\.com$ -(^|\.)yasni\.co\.uk$ -(^|\.)yayabay\.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$ -(^|\.)yilubbs\.com$ -(^|\.)yingsuoss\.com$ -(^|\.)yinlei\.org$ -(^|\.)yipub\.com$ -(^|\.)yizhihongxing\.com$ -(^|\.)yobt\.com$ -(^|\.)yobt\.tv$ -(^|\.)yogichen\.org$ -(^|\.)yong\.hu$ -(^|\.)yorkbbs\.ca$ -(^|\.)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$ -(^|\.)youthnetradio\.org$ -(^|\.)youtu\.be$ -(^|\.)youtube-nocookie\.com$ -(^|\.)youtube\.com$ -(^|\.)youtubecn\.com$ -(^|\.)youtubeeducation\.com$ -(^|\.)youtubegaming\.com$ -(^|\.)youversion\.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$ -(^|\.)yzzk\.com$ -(^|\.)zacebook\.com$ -(^|\.)zalmos\.com$ -(^|\.)zannel\.com$ -(^|\.)zaobao\.com\.sg$ -(^|\.)zaozon\.com$ -(^|\.)zapto\.org$ -(^|\.)zattoo\.com$ -(^|\.)zdnet\.com\.tw$ -(^|\.)zello\.com$ -(^|\.)zengjinyan\.org$ -(^|\.)zenmate\.com$ -(^|\.)zenmate\.com\.ru$ -(^|\.)zeronet\.io$ -(^|\.)zeutch\.com$ -(^|\.)zfreet\.com$ -(^|\.)zgsddh\.com$ -(^|\.)zgzcjj\.net$ -(^|\.)zh-yue\.wikipedia\.org$ -(^|\.)zh\.ecdm\.wikia\.com$ -(^|\.)zh\.m\.wikipedia\.org$ -(^|\.)zh\.pokerstrategy\.com$ -(^|\.)zh\.uncyclopedia\.wikia\.com$ -(^|\.)zh\.wikinews\.org$ -(^|\.)zh\.wikipedia\.org$ -(^|\.)zh\.wikisource\.org$ -(^|\.)zhanbin\.net$ -(^|\.)zhangboli\.net$ -(^|\.)zhangtianliang\.com$ -(^|\.)zhanlve\.org$ -(^|\.)zhao\.1984\.city$ -(^|\.)zhao\.jinhai\.de$ -(^|\.)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$ -(^|\.)ziddu\.com$ -(^|\.)zillionk\.com$ -(^|\.)zim\.vn$ -(^|\.)zinio\.com$ -(^|\.)ziporn\.com$ -(^|\.)zippyshare\.com$ -(^|\.)zkaip\.com$ -(^|\.)zmw\.cn$ -(^|\.)zodgame\.us$ -(^|\.)zomobo\.net$ -(^|\.)zonaeuropa\.com$ -(^|\.)zonghexinwen\.com$ -(^|\.)zonghexinwen\.net$ -(^|\.)zoogvpn\.com$ -(^|\.)zootool\.com$ -(^|\.)zoozle\.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$ -(^|\.)zyzc9\.com$ -(^|\.)zzcartoon\.com$ -(^|\.)zzux\.com$ diff --git a/client/android/assets/acl/bypass-lan-china.acl b/client/android/assets/acl/bypass-lan-china.acl deleted file mode 100644 index 64500c093..000000000 --- a/client/android/assets/acl/bypass-lan-china.acl +++ /dev/null @@ -1,10391 +0,0 @@ -[proxy_all] - -[bypass_list] -0.0.0.0/8 -10.0.0.0/8 -100.64.0.0/10 -127.0.0.0/8 -169.254.0.0/16 -172.16.0.0/12 -192.0.0.0/29 -192.0.2.0/24 -192.88.99.0/24 -192.168.0.0/16 -198.18.0.0/15 -198.51.100.0/24 -203.0.113.0/24 -224.0.0.0/3 -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.32.0/19 -8.208.64.0/18 -8.208.128.0/17 -8.209.0.0/16 -8.210.0.0/15 -8.212.0.0/14 -8.216.0.0/13 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.251.240.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -65.55.60.184/30 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.119.224.0/22 -103.120.52.0/22 -103.120.72.0/22 -103.120.76.0/24 -103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 -103.121.52.0/22 -103.121.92.0/22 -103.121.160.0/21 -103.121.250.0/24 -103.121.252.0/22 -103.129.52.0/22 -103.129.148.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.197.104.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -130.214.218.0/23 -131.228.96.0/24 -131.253.12.0/29 -131.253.12.80/28 -131.253.12.240/29 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -147.243.13.32/27 -147.243.13.64/27 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.158.0.0/16 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.32.136.0/21 -152.32.144.0/20 -152.32.160.0/19 -152.32.192.0/18 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -188.65.16.0/22 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.1.0/24 -202.95.2.0/23 -202.95.4.0/22 -202.95.8.0/21 -202.95.16.0/20 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 - -[proxy_list] -# Telegram IPs$ -91.108.4.0/22 -91.108.8.0/21 -91.108.16.0/21 -91.108.36.0/22 -91.108.56.0/22 -109.239.140.0/24 -149.154.160.0/20 -14.102.250.18 -14.102.250.19 -174.142.105.153 -50.7.31.230 -67.220.91.15 -67.220.91.18 -67.220.91.23 -69.65.19.160 -72.52.81.22 -85.17.73.31 -(^|\.)030buy\.com$ -(^|\.)0rz\.tw$ -(^|\.)1-apple\.com\.tw$ -(^|\.)10\.tt$ -(^|\.)1000giri\.net$ -(^|\.)100ke\.org$ -(^|\.)10conditionsoflove\.com$ -(^|\.)10musume\.com$ -(^|\.)123rf\.com$ -(^|\.)12bet\.com$ -(^|\.)12vpn\.com$ -(^|\.)12vpn\.net$ -(^|\.)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$ -(^|\.)1984bbs\.com$ -(^|\.)1984bbs\.org$ -(^|\.)1989report\.hkja\.org\.hk$ -(^|\.)1991way\.com$ -(^|\.)1998cdp\.org$ -(^|\.)1bao\.org$ -(^|\.)1dumb\.com$ -(^|\.)1e100\.net$ -(^|\.)1eew\.com$ -(^|\.)1mobile\.com$ -(^|\.)1pondo\.tv$ -(^|\.)2-hand\.info$ -(^|\.)2000fun\.com$ -(^|\.)2008xianzhang\.info$ -(^|\.)2017\.hk$ -(^|\.)21andy\.com$ -(^|\.)21pron\.com$ -(^|\.)21sextury\.com$ -(^|\.)228\.net\.tw$ -(^|\.)233abc\.com$ -(^|\.)24hrs\.ca$ -(^|\.)24smile\.org$ -(^|\.)25u\.com$ -(^|\.)2dbook\.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$ -(^|\.)466453\.com$ -(^|\.)4bluestones\.biz$ -(^|\.)4chan\.com$ -(^|\.)4dq\.com$ -(^|\.)4everproxy\.com$ -(^|\.)4irc\.com$ -(^|\.)4mydomain\.com$ -(^|\.)4pu\.com$ -(^|\.)4rbtv\.com$ -(^|\.)4shared\.com$ -(^|\.)4tern\.com$ -(^|\.)51\.ca$ -(^|\.)51jav\.org$ -(^|\.)51luoben\.com$ -(^|\.)5278\.cc$ -(^|\.)56cun04\.jigsy\.com$ -(^|\.)5aimiku\.com$ -(^|\.)5i01\.com$ -(^|\.)5isotoi5\.org$ -(^|\.)5maodang\.com$ -(^|\.)63i\.com$ -(^|\.)64memo$ -(^|\.)64museum\.org$ -(^|\.)64tianwang\.com$ -(^|\.)64wiki\.com$ -(^|\.)66\.ca$ -(^|\.)666kb\.com$ -(^|\.)6park\.com$ -(^|\.)6parker\.com$ -(^|\.)7capture\.com$ -(^|\.)7cow\.com$ -(^|\.)8-d\.com$ -(^|\.)85cc\.net$ -(^|\.)85cc\.us$ -(^|\.)85st\.com$ -(^|\.)881903\.com$ -(^|\.)888\.com$ -(^|\.)888poker\.com$ -(^|\.)89-64\.org$ -(^|\.)89\.64\.charter\.constitutionalism\.solutions$ -(^|\.)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$ -(^|\.)a-normal-day\.com$ -(^|\.)a248\.e\.akamai\.net$ -(^|\.)a5\.com\.ru$ -(^|\.)aamacau\.com$ -(^|\.)abc\.com$ -(^|\.)abc\.pp\.ru$ -(^|\.)abc\.xyz$ -(^|\.)abchinese\.com$ -(^|\.)abclite\.net$ -(^|\.)abitno\.linpie\.com$ -(^|\.)ablwang\.com$ -(^|\.)aboluowang\.com$ -(^|\.)aboutgfw\.com$ -(^|\.)abs\.edu$ -(^|\.)ac\.jiruan\.net$ -(^|\.)accim\.org$ -(^|\.)aceros-de-hispania\.com$ -(^|\.)acevpn\.com$ -(^|\.)acg18\.me$ -(^|\.)acgkj\.com$ -(^|\.)acmedia365\.com$ -(^|\.)acmetoy\.com$ -(^|\.)acnw\.com\.au$ -(^|\.)actfortibet\.org$ -(^|\.)actimes\.com\.au$ -(^|\.)activpn\.com$ -(^|\.)aculo\.us$ -(^|\.)addictedtocoffee\.de$ -(^|\.)adelaidebbs\.com$ -(^|\.)admob\.com$ -(^|\.)adorama\.com$ -(^|\.)adpl\.org\.hk$ -(^|\.)ads-twitter\.com$ -(^|\.)adsense\.com$ -(^|\.)adult-sex-games\.com$ -(^|\.)adult\.friendfinder\.com$ -(^|\.)adultfriendfinder\.com$ -(^|\.)adultkeep\.net$ -(^|\.)advanscene\.com$ -(^|\.)advertfan\.com$ -(^|\.)ae\.hao123\.com$ -(^|\.)ae\.org$ -(^|\.)aenhancers\.com$ -(^|\.)af\.mil$ -(^|\.)afantibbs\.com$ -(^|\.)agnesb\.fr$ -(^|\.)agoogleaday\.com$ -(^|\.)agro\.hk$ -(^|\.)ahr0chm6ly95zwnslm5lda$ -(^|\.)ai-kan\.net$ -(^|\.)ai-wen\.net$ -(^|\.)ai\.binwang\.me$ -(^|\.)aiph\.net$ -(^|\.)airasia\.com$ -(^|\.)airconsole\.com$ -(^|\.)airvpn\.org$ -(^|\.)aisex\.com$ -(^|\.)ait\.org\.tw$ -(^|\.)aiweiwei\.com$ -(^|\.)aiweiweiblog\.com$ -(^|\.)akademiye\.org$ -(^|\.)akiba-online\.com$ -(^|\.)akiba-web\.com$ -(^|\.)al-islam\.com$ -(^|\.)al-qimmah\.net$ -(^|\.)alabout\.com$ -(^|\.)alanhou\.com$ -(^|\.)alarab\.qa$ -(^|\.)alasbarricadas\.org$ -(^|\.)alexlur\.org$ -(^|\.)alforattv\.net$ -(^|\.)alhayat\.com$ -(^|\.)alicejapan\.co\.jp$ -(^|\.)alien-ufos\.com$ -(^|\.)aliengu\.com$ -(^|\.)alkasir\.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\.com$ -(^|\.)ameblo\.jp$ -(^|\.)americangreencard\.com$ -(^|\.)americanunfinished\.com$ -(^|\.)amiblockedornot\.com$ -(^|\.)amigobbs\.net$ -(^|\.)amitabhafoundation\.us$ -(^|\.)amnesty\.org$ -(^|\.)amnesty\.org\.hk$ -(^|\.)amnesty\.tw$ -(^|\.)amnestyusa\.org$ -(^|\.)amnyemachen\.org$ -(^|\.)amoiist\.com$ -(^|\.)ampproject\.org$ -(^|\.)amtb-taipei\.org$ -(^|\.)anchorfree\.com$ -(^|\.)ancsconf\.org$ -(^|\.)andfaraway\.net$ -(^|\.)android-x86\.org$ -(^|\.)android\.com$ -(^|\.)androidify\.com$ -(^|\.)androidplus\.co$ -(^|\.)andygod\.com$ -(^|\.)angelfire\.com$ -(^|\.)angularjs\.org$ -(^|\.)animecrazy\.net$ -(^|\.)animeshippuuden\.com$ -(^|\.)aniscartujo\.com$ -(^|\.)annatam\.com$ -(^|\.)anobii\.com$ -(^|\.)anontext\.com$ -(^|\.)anonymise\.us$ -(^|\.)anonymitynetwork\.com$ -(^|\.)anonymizer\.com$ -(^|\.)anpopo\.com$ -(^|\.)answering-islam\.org$ -(^|\.)anthonycalzadilla\.com$ -(^|\.)anti1984\.com$ -(^|\.)antichristendom\.com$ -(^|\.)antiwave\.net$ -(^|\.)anyporn\.com$ -(^|\.)anysex\.com$ -(^|\.)aobo\.com\.au$ -(^|\.)aofriend\.com$ -(^|\.)aofriend\.com\.au$ -(^|\.)aojiao\.org$ -(^|\.)aolchannels\.aol\.com$ -(^|\.)aomiwang\.com$ -(^|\.)apetube\.com$ -(^|\.)api-secure\.recaptcha\.net$ -(^|\.)api-verify\.recaptcha\.net$ -(^|\.)api\.ai$ -(^|\.)api\.dropboxapi\.com$ -(^|\.)api\.linksalpha\.com$ -(^|\.)api\.proxlet\.com$ -(^|\.)api\.recaptcha\.net$ -(^|\.)apiary\.io$ -(^|\.)apidocs\.linksalpha\.com$ -(^|\.)apigee\.com$ -(^|\.)apk-dl\.com$ -(^|\.)apkdler\.com$ -(^|\.)apkmirror\.com$ -(^|\.)apkmonk\.com$ -(^|\.)apkplz\.com$ -(^|\.)apkpure\.com$ -(^|\.)aplusvpn\.com$ -(^|\.)app\.box\.com$ -(^|\.)app\.heywire\.com$ -(^|\.)app\.tutanota\.com$ -(^|\.)appdownloader\.net$ -(^|\.)appledaily\.com$ -(^|\.)appshopper\.com$ -(^|\.)appsocks\.net$ -(^|\.)appspot\.com$ -(^|\.)appsto\.re$ -(^|\.)ar\.hao123\.com$ -(^|\.)archive\.fo$ -(^|\.)archive\.is$ -(^|\.)archive\.org$ -(^|\.)archives\.gov$ -(^|\.)archives\.gov\.tw$ -(^|\.)arctosia\.com$ -(^|\.)areca-backup\.org$ -(^|\.)arena\.taipei$ -(^|\.)arethusa\.su$ -(^|\.)arlingtoncemetery\.mil$ -(^|\.)army\.mil$ -(^|\.)art4tibet1998\.org$ -(^|\.)artofpeacefoundation\.org$ -(^|\.)artsy\.net$ -(^|\.)asacp\.org$ -(^|\.)asahichinese\.com$ -(^|\.)asdfg\.jp$ -(^|\.)asg\.to$ -(^|\.)asia-gaming\.com$ -(^|\.)asiaharvest\.org$ -(^|\.)asianews\.it$ -(^|\.)asiansexdiary\.com$ -(^|\.)asianspiss\.com$ -(^|\.)asianwomensfilm\.de$ -(^|\.)asiatgp\.com$ -(^|\.)asiatoday\.us$ -(^|\.)askstudent\.com$ -(^|\.)askynz\.net$ -(^|\.)assembla\.com$ -(^|\.)assimp\.org$ -(^|\.)astrill\.com$ -(^|\.)atc\.org\.au$ -(^|\.)atchinese\.com$ -(^|\.)atdmt\.com$ -(^|\.)atgfw\.org$ -(^|\.)athenaeizou\.com$ -(^|\.)atlanta168\.com$ -(^|\.)atlaspost\.com$ -(^|\.)atnext\.com$ -(^|\.)authorizeddns\.net$ -(^|\.)authorizeddns\.org$ -(^|\.)authorizeddns\.us$ -(^|\.)autodraw\.com$ -(^|\.)av\.com$ -(^|\.)av\.movie$ -(^|\.)av\.nightlife141\.com$ -(^|\.)avaaz\.org$ -(^|\.)avbody\.tv$ -(^|\.)avcity\.tv$ -(^|\.)avcool\.com$ -(^|\.)avdb\.in$ -(^|\.)avdb\.tv$ -(^|\.)avfantasy\.com$ -(^|\.)avidemux\.org$ -(^|\.)avmo\.pw$ -(^|\.)avmoo\.com$ -(^|\.)avmoo\.net$ -(^|\.)avmoo\.pw$ -(^|\.)avoision\.com$ -(^|\.)avyahoo\.com$ -(^|\.)axureformac\.com$ -(^|\.)azerbaycan\.tv$ -(^|\.)azerimix\.com$ -(^|\.)azubu\.tv$ -(^|\.)b0ne\.com$ -(^|\.)babynet\.com\.hk$ -(^|\.)backchina\.com$ -(^|\.)backpackers\.com\.tw$ -(^|\.)backtotiananmen\.com$ -(^|\.)badjojo\.com$ -(^|\.)badoo\.com$ -(^|\.)baidu\.jp$ -(^|\.)bailandaily\.com$ -(^|\.)baixing\.me$ -(^|\.)bakgeekhome\.tk$ -(^|\.)banana-vpn\.com$ -(^|\.)bandwagonhost\.com$ -(^|\.)bangbrosnetwork\.com$ -(^|\.)bangchen\.net$ -(^|\.)bangyoulater\.com$ -(^|\.)bannedbook\.org$ -(^|\.)bannednews\.org$ -(^|\.)banorte\.com$ -(^|\.)baramangaonline\.com$ -(^|\.)barenakedislam\.com$ -(^|\.)barnabu\.co\.uk$ -(^|\.)bartvpn\.com$ -(^|\.)bash-hackers\.org$ -(^|\.)bastillepost\.com$ -(^|\.)bayvoice\.net$ -(^|\.)bb-chat\.tv$ -(^|\.)bb\.ttv\.com\.tw$ -(^|\.)bbc\.co\.uk$ -(^|\.)bbc\.com$ -(^|\.)bbc\.com%2fzhongwen$ -(^|\.)bbc\.in$ -(^|\.)bbcchinese\.com$ -(^|\.)bbchat\.tv$ -(^|\.)bbg\.gov$ -(^|\.)bbkz\.com$ -(^|\.)bbnradio\.org$ -(^|\.)bbs-tw\.com$ -(^|\.)bbs\.brockbbs\.com$ -(^|\.)bbs\.cantonese\.asia$ -(^|\.)bbs\.ecstart\.com$ -(^|\.)bbs\.hanminzu\.org$ -(^|\.)bbs\.hasi\.wang$ -(^|\.)bbs\.huasing\.org$ -(^|\.)bbs\.junglobal\.net$ -(^|\.)bbs\.kimy\.com\.tw$ -(^|\.)bbs\.morbell\.com$ -(^|\.)bbs\.mychat\.to$ -(^|\.)bbs\.netbig\.com$ -(^|\.)bbs\.ozchinese\.com$ -(^|\.)bbs\.qmzdd\.com$ -(^|\.)bbs\.sina\.com$ -(^|\.)bbs\.sina\.com%2f$ -(^|\.)bbs\.skykiwi\.com$ -(^|\.)bbs\.sou-tong\.org$ -(^|\.)bbs\.tuitui\.info$ -(^|\.)bbsdigest\.com$ -(^|\.)bbsfeed\.com$ -(^|\.)bbsland\.com$ -(^|\.)bbsmo\.com$ -(^|\.)bbsone\.com$ -(^|\.)bbtoystore\.com$ -(^|\.)bcast\.co\.nz$ -(^|\.)bcc\.com\.tw$ -(^|\.)bcchinese\.net$ -(^|\.)bcmorning\.com$ -(^|\.)bdsmvideos\.net$ -(^|\.)beaconevents\.com$ -(^|\.)bebo\.com$ -(^|\.)beeg\.com$ -(^|\.)beevpn\.com$ -(^|\.)behindkink\.com$ -(^|\.)beijing1989\.com$ -(^|\.)beijingspring\.com$ -(^|\.)beijingzx\.org$ -(^|\.)belamionline\.com$ -(^|\.)bell\.wiki$ -(^|\.)bemywife\.cc$ -(^|\.)beric\.me$ -(^|\.)berlintwitterwall\.com$ -(^|\.)berm\.co\.nz$ -(^|\.)bestforchina\.org$ -(^|\.)bestgore\.com$ -(^|\.)bestpornstardb\.com$ -(^|\.)bestvpn\.com$ -(^|\.)bestvpnanalysis\.com$ -(^|\.)bestvpnserver\.com$ -(^|\.)bestvpnservice\.com$ -(^|\.)bestvpnusa\.com$ -(^|\.)bet365\.com$ -(^|\.)beta\.usejump\.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$ -(^|\.)bic2011\.org$ -(^|\.)bigfools\.com$ -(^|\.)bigjapanesesex\.com$ -(^|\.)bigmoney\.biz$ -(^|\.)bignews\.org$ -(^|\.)bigsound\.org$ -(^|\.)biliworld\.com$ -(^|\.)billypan\.com$ -(^|\.)binux\.me$ -(^|\.)bipic\.net$ -(^|\.)bit\.do$ -(^|\.)bit\.ly$ -(^|\.)bitc\.bme\.emory\.edu$ -(^|\.)bitcointalk\.org$ -(^|\.)bitmex\.com$ -(^|\.)bitshare\.com$ -(^|\.)bitsnoop\.com$ -(^|\.)bitvise\.com$ -(^|\.)bizhat\.com$ -(^|\.)bjnewlife\.org$ -(^|\.)bjs\.org$ -(^|\.)bjzc\.org$ -(^|\.)bl-doujinsouko\.com$ -(^|\.)blacklogic\.com$ -(^|\.)blackvpn\.com$ -(^|\.)blewpass\.com$ -(^|\.)blinkx\.com$ -(^|\.)blinw\.com$ -(^|\.)blip\.tv$ -(^|\.)blockcn\.com$ -(^|\.)blockless\.com$ -(^|\.)blog\.calibre-ebook\.com$ -(^|\.)blog\.cnyes\.com$ -(^|\.)blog\.daum\.net$ -(^|\.)blog\.de$ -(^|\.)blog\.exblog\.co\.jp$ -(^|\.)blog\.excite\.co\.jp$ -(^|\.)blog\.expofutures\.com$ -(^|\.)blog\.fizzik\.com$ -(^|\.)blog\.foolsmountain\.com$ -(^|\.)blog\.fuckgfw233\.org$ -(^|\.)blog\.goo\.ne\.jp$ -(^|\.)blog\.google$ -(^|\.)blog\.inoreader\.com$ -(^|\.)blog\.istef\.info$ -(^|\.)blog\.jackjia\.com$ -(^|\.)blog\.jp$ -(^|\.)blog\.kangye\.org$ -(^|\.)blog\.lester850\.info$ -(^|\.)blog\.martinoei\.com$ -(^|\.)blog\.pathtosharepoint\.com$ -(^|\.)blog\.pentalogic\.net$ -(^|\.)blog\.qooza\.hk$ -(^|\.)blog\.ranxiang\.com$ -(^|\.)blog\.sina\.com\.tw$ -(^|\.)blog\.sogoo\.org$ -(^|\.)blog\.soylent\.com$ -(^|\.)blog\.syx86\.cn$ -(^|\.)blog\.syx86\.com$ -(^|\.)blog\.taragana\.com$ -(^|\.)blog\.tiney\.com$ -(^|\.)blog\.xuite\.net$ -(^|\.)blog\.youthwant\.com\.tw$ -(^|\.)blog\.youxu\.info$ -(^|\.)blogblog\.com$ -(^|\.)blogcatalog\.com$ -(^|\.)blogcity\.me$ -(^|\.)blogdns\.org$ -(^|\.)blogger\.com$ -(^|\.)blogimg\.jp$ -(^|\.)bloglines\.com$ -(^|\.)bloglovin\.com$ -(^|\.)blogs\.icerocket\.com$ -(^|\.)blogs\.libraryinformationtechnology\.com$ -(^|\.)blogs\.tampabay\.com$ -(^|\.)blogs\.yahoo\.co\.jp$ -(^|\.)blogspot(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)blogtd\.net$ -(^|\.)blogtd\.org$ -(^|\.)bloodshed\.net$ -(^|\.)bloomberg\.cn$ -(^|\.)bloomberg\.com$ -(^|\.)bloomberg\.de$ -(^|\.)bloombergview\.com$ -(^|\.)bloomfortune\.com$ -(^|\.)blueangellive\.com$ -(^|\.)bmfinn\.com$ -(^|\.)bnews\.co$ -(^|\.)bnrmetal\.com$ -(^|\.)boardreader\.com$ -(^|\.)bod\.asia$ -(^|\.)bodog88\.com$ -(^|\.)bolehvpn\.net$ -(^|\.)bolin\.netfirms\.com$ -(^|\.)bonbonme\.com$ -(^|\.)bonbonsex\.com$ -(^|\.)bonfoundation\.org$ -(^|\.)bongacams\.com$ -(^|\.)boobstagram\.com$ -(^|\.)book\.com\.tw$ -(^|\.)book\.zi5\.me$ -(^|\.)bookepub\.com$ -(^|\.)books\.com\.tw$ -(^|\.)boomssr\.com$ -(^|\.)bot\.nu$ -(^|\.)botanwang\.com$ -(^|\.)bowenpress\.com$ -(^|\.)boxpn\.com$ -(^|\.)boxun$ -(^|\.)boxun\.com$ -(^|\.)boxun\.tv$ -(^|\.)boxunblog\.com$ -(^|\.)boxunclub\.com$ -(^|\.)boyangu\.com$ -(^|\.)boyfriendtv\.com$ -(^|\.)boysfood\.com$ -(^|\.)boysmaster\.com$ -(^|\.)br\.hao123\.com$ -(^|\.)br\.st$ -(^|\.)brainyquote\.com$ -(^|\.)brandonhutchinson\.com$ -(^|\.)braumeister\.org$ -(^|\.)bravotube\.net$ -(^|\.)brazzers\.com$ -(^|\.)break\.com$ -(^|\.)breakgfw\.com$ -(^|\.)breaking911\.com$ -(^|\.)breakingtweets\.com$ -(^|\.)breakwall\.net$ -(^|\.)briefdream\.com$ -(^|\.)briian\.com$ -(^|\.)brizzly\.com$ -(^|\.)brkmd\.com$ -(^|\.)broadbook\.com$ -(^|\.)broadpressinc\.com$ -(^|\.)brucewang\.net$ -(^|\.)brutaltgp\.com$ -(^|\.)bt2mag\.com$ -(^|\.)bt95\.com$ -(^|\.)btaia\.com$ -(^|\.)btbtav\.com$ -(^|\.)btdigg\.org$ -(^|\.)btku\.me$ -(^|\.)btku\.org$ -(^|\.)btspread\.com$ -(^|\.)budaedu\.org$ -(^|\.)buddhanet\.com\.tw$ -(^|\.)buddhistchannel\.tv$ -(^|\.)buffered\.com$ -(^|\.)bullog\.org$ -(^|\.)bullogger\.com$ -(^|\.)bunbunhk\.com$ -(^|\.)busayari\.com$ -(^|\.)businessinsider\.com$ -(^|\.)businessweek\.com$ -(^|\.)busu\.org$ -(^|\.)busytrade\.com$ -(^|\.)buugaa\.com$ -(^|\.)buy\.yahoo\.com\.tw$ -(^|\.)buzzhand\.com$ -(^|\.)buzzhand\.net$ -(^|\.)buzzorange\.com$ -(^|\.)bvpn\.com$ -(^|\.)bwsj\.hk$ -(^|\.)bx\.tl$ -(^|\.)bynet\.co\.il$ -(^|\.)c-est-simple\.com$ -(^|\.)c-spanvideo\.org$ -(^|\.)c100tibet\.org$ -(^|\.)c1522\.mooo\.com$ -(^|\.)cablegatesearch\.net$ -(^|\.)cachinese\.com$ -(^|\.)cacnw\.com$ -(^|\.)cactusvpn\.com$ -(^|\.)cafepress\.com$ -(^|\.)cahr\.org\.tw$ -(^|\.)calameo\.com$ -(^|\.)calebelston\.com$ -(^|\.)calgarychinese\.ca$ -(^|\.)calgarychinese\.com$ -(^|\.)calgarychinese\.net$ -(^|\.)cam4\.com$ -(^|\.)cam4\.jp$ -(^|\.)cam4\.sg$ -(^|\.)camfrog\.com$ -(^|\.)cams\.com$ -(^|\.)cams\.org\.sg$ -(^|\.)canadameet\.com$ -(^|\.)canalporno\.com$ -(^|\.)canyu\.org$ -(^|\.)cao\.im$ -(^|\.)caobian\.info$ -(^|\.)caochangqing\.com$ -(^|\.)cap\.org\.hk$ -(^|\.)carabinasypistolas\.com$ -(^|\.)cardinalkungfoundation\.org$ -(^|\.)carfax\.com$ -(^|\.)cari\.com\.my$ -(^|\.)caribbeancom\.com$ -(^|\.)carmotorshow\.com$ -(^|\.)cartoonmovement\.com$ -(^|\.)casadeltibetbcn\.org$ -(^|\.)casatibet\.org\.mx$ -(^|\.)casino\.williamhill\.com$ -(^|\.)casinobellini\.com$ -(^|\.)casinoking\.com$ -(^|\.)casinoriva\.com$ -(^|\.)castbox\.fm$ -(^|\.)catch22\.net$ -(^|\.)catfightpayperview\.xxx$ -(^|\.)catholic\.org\.hk$ -(^|\.)catholic\.org\.tw$ -(^|\.)cathvoice\.org\.tw$ -(^|\.)cattt\.com$ -(^|\.)cbc\.ca$ -(^|\.)cbs\.ntu\.edu\.tw$ -(^|\.)cbsnews\.com$ -(^|\.)cbtc\.org\.hk$ -(^|\.)cccat\.cc$ -(^|\.)cccat\.co$ -(^|\.)ccdtr\.org$ -(^|\.)cchere\.com$ -(^|\.)ccim\.org$ -(^|\.)cclife\.ca$ -(^|\.)cclife\.org$ -(^|\.)cclifefl\.org$ -(^|\.)ccthere\.com$ -(^|\.)cctmweb\.net$ -(^|\.)cctongbao\.com$ -(^|\.)ccue\.ca$ -(^|\.)ccue\.com$ -(^|\.)ccvoice\.ca$ -(^|\.)ccw\.org\.tw$ -(^|\.)cdbook\.org$ -(^|\.)cdcparty\.com$ -(^|\.)cdef\.org$ -(^|\.)cdig\.info$ -(^|\.)cdjp\.org$ -(^|\.)cdn$ -(^|\.)cdn-apple\.com$ -(^|\.)cdn-images\.mailchimp\.com$ -(^|\.)cdn\.assets\.lfpcontent\.com$ -(^|\.)cdn\.helixstudios\.net$ -(^|\.)cdn\.printfriendly\.com$ -(^|\.)cdn\.softlayer\.net$ -(^|\.)cdn1\.lp\.saboom\.com$ -(^|\.)cdnews\.com\.tw$ -(^|\.)cdninstagram\.com$ -(^|\.)cdp1989\.org$ -(^|\.)cdp1998\.org$ -(^|\.)cdp2006\.org$ -(^|\.)cdpa\.url\.tw$ -(^|\.)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$ -(^|\.)certificate\.revocationcheck\.com$ -(^|\.)cfhks\.org\.hk$ -(^|\.)cftfc\.com$ -(^|\.)cgdepot\.org$ -(^|\.)cgst\.edu$ -(^|\.)ch\.shvoong\.com$ -(^|\.)change\.org$ -(^|\.)changeip\.name$ -(^|\.)changeip\.net$ -(^|\.)changeip\.org$ -(^|\.)changp\.com$ -(^|\.)changsa\.net$ -(^|\.)channel8news\.sg$ -(^|\.)chapm25\.com$ -(^|\.)chatnook\.com$ -(^|\.)chaturbate\.com$ -(^|\.)chengmingmag\.com$ -(^|\.)chenguangcheng\.com$ -(^|\.)chenpokong\.com$ -(^|\.)chenpokong\.net$ -(^|\.)chenshan20042005\.wordpress\.com$ -(^|\.)cherrysave\.com$ -(^|\.)chhongbi\.org$ -(^|\.)chicagoncmtv\.com$ -(^|\.)china-mmm\.jp\.net$ -(^|\.)china-mmm\.net$ -(^|\.)china-mmm\.sa\.com$ -(^|\.)china-review\.com\.ua$ -(^|\.)china-week\.com$ -(^|\.)china\.hket\.com$ -(^|\.)china\.ucanews\.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$ -(^|\.)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$ -(^|\.)chinese\.donga\.com$ -(^|\.)chinese\.engadget\.com$ -(^|\.)chinese\.irib\.ir$ -(^|\.)chinese\.soifind\.com$ -(^|\.)chinesedaily\.com$ -(^|\.)chinesedailynews\.com$ -(^|\.)chinesedemocracy\.com$ -(^|\.)chinesegay\.org$ -(^|\.)chinesen\.de$ -(^|\.)chinesepen\.org$ -(^|\.)chinesetalks\.net$ -(^|\.)chineseupress\.com$ -(^|\.)chingcheong\.com$ -(^|\.)chinman\.net$ -(^|\.)chithu\.org$ -(^|\.)chn\.chosun\.com$ -(^|\.)chrdnet\.com$ -(^|\.)christianfreedom\.org$ -(^|\.)christianstudy\.com$ -(^|\.)christiantimes\.org\.hk$ -(^|\.)christusrex\.org$ -(^|\.)chrlawyers\.hk$ -(^|\.)chrome\.com$ -(^|\.)chromecast\.com$ -(^|\.)chromeexperiments\.com$ -(^|\.)chromercise\.com$ -(^|\.)chromestatus\.com$ -(^|\.)chromium\.org$ -(^|\.)chuang-yen\.org$ -(^|\.)chubold\.com$ -(^|\.)chubun\.com$ -(^|\.)chuizi\.net$ -(^|\.)churchinhongkong\.org$ -(^|\.)chushigangdrug\.ch$ -(^|\.)cienen\.com$ -(^|\.)cineastentreff\.de$ -(^|\.)cipfg\.org$ -(^|\.)circlethebayfortibet\.org$ -(^|\.)citizencn\.com$ -(^|\.)citizenlab\.org$ -(^|\.)citizenscommission\.hk$ -(^|\.)citizensradio\.org$ -(^|\.)city365\.ca$ -(^|\.)city9x\.com$ -(^|\.)citypopulation\.de$ -(^|\.)citytalk\.tw$ -(^|\.)civicparty\.hk$ -(^|\.)civildisobediencemovement\.org$ -(^|\.)civilhrfront\.org$ -(^|\.)civiliangunner\.com$ -(^|\.)civilmedia\.tw$ -(^|\.)ck101\.com$ -(^|\.)cl\.d0z\.net$ -(^|\.)clarionproject\.org$ -(^|\.)classicalguitarblog\.net$ -(^|\.)clb\.org\.hk$ -(^|\.)cldr\.unicode\.org$ -(^|\.)cleansite\.biz$ -(^|\.)cleansite\.info$ -(^|\.)cleansite\.us$ -(^|\.)clearharmony\.net$ -(^|\.)clearwisdom\.net$ -(^|\.)clementine-player\.org$ -(^|\.)cling\.omy\.sg$ -(^|\.)clinica-tibet\.ru$ -(^|\.)clipfish\.de$ -(^|\.)cloakpoint\.com$ -(^|\.)cloud\.mail\.ru$ -(^|\.)club1069\.com$ -(^|\.)cmi\.org\.tw$ -(^|\.)cmp\.hku\.hk$ -(^|\.)cms\.gov$ -(^|\.)cmule\.com$ -(^|\.)cmule\.org$ -(^|\.)cn-proxy\.com$ -(^|\.)cn\.calameo\.com$ -(^|\.)cn\.dayabook\.com$ -(^|\.)cn\.fmnnow\.com$ -(^|\.)cn\.freeones\.com$ -(^|\.)cn\.giganews\.com$ -(^|\.)cn\.ibtimes\.com$ -(^|\.)cn\.nytstyle\.com$ -(^|\.)cn\.sandscotaicentral\.com$ -(^|\.)cn\.shafaqna\.com$ -(^|\.)cn\.streetvoice\.com$ -(^|\.)cn\.uncyclopedia\.wikia\.com$ -(^|\.)cn\.uptodown\.com$ -(^|\.)cn\.voa\.mobi$ -(^|\.)cn2\.streetvoice\.com$ -(^|\.)cn6\.eu$ -(^|\.)cna\.com\.tw$ -(^|\.)cnabc\.com$ -(^|\.)cnbbnews\.wordpress\.com$ -(^|\.)cnd\.org$ -(^|\.)cnex\.org\.cn$ -(^|\.)cnineu\.com$ -(^|\.)cnn\.com$ -(^|\.)cnnews\.chosun\.com$ -(^|\.)cnpolitics\.org$ -(^|\.)cnproxy\.com$ -(^|\.)co\.ng\.mil$ -(^|\.)coat\.co\.jp$ -(^|\.)cochina\.co$ -(^|\.)cochina\.org$ -(^|\.)code1984\.com$ -(^|\.)codeshare\.io$ -(^|\.)codeskulptor\.org$ -(^|\.)collateralmurder\.com$ -(^|\.)collateralmurder\.org$ -(^|\.)com\.google$ -(^|\.)comefromchina\.com$ -(^|\.)comic-mega\.me$ -(^|\.)commandarms\.com$ -(^|\.)commentshk\.com$ -(^|\.)communistcrimes\.org$ -(^|\.)community\.windy\.com$ -(^|\.)communitychoicecu\.com$ -(^|\.)compileheart\.com$ -(^|\.)compress\.to$ -(^|\.)connect\.facebook\.net$ -(^|\.)conoha\.jp$ -(^|\.)contactmagazine\.net$ -(^|\.)contests\.twilio\.com$ -(^|\.)convio\.net$ -(^|\.)coobay\.com$ -(^|\.)coolaler\.com$ -(^|\.)coolder\.com$ -(^|\.)coolloud\.org\.tw$ -(^|\.)coolncute\.com$ -(^|\.)corumcollege\.com$ -(^|\.)cos-moe\.com$ -(^|\.)cosmic\.monar\.ch$ -(^|\.)cosplayjav\.pl$ -(^|\.)cotweet\.com$ -(^|\.)coursehero\.com$ -(^|\.)cpj\.org$ -(^|\.)cq99\.us$ -(^|\.)crackle\.com$ -(^|\.)crazys\.cc$ -(^|\.)crchina\.org$ -(^|\.)crd-net\.org$ -(^|\.)creaders\.net$ -(^|\.)creadersnet\.com$ -(^|\.)creativelab5\.com$ -(^|\.)cristyli\.com$ -(^|\.)crocotube\.com$ -(^|\.)crossfire\.co\.kr$ -(^|\.)crossthewall\.net$ -(^|\.)crossvpn\.net$ -(^|\.)crrev\.com$ -(^|\.)crucial\.com$ -(^|\.)csdparty\.com$ -(^|\.)css\.pixnet\.in$ -(^|\.)csuchen\.de$ -(^|\.)csw\.org\.uk$ -(^|\.)ct\.org\.tw$ -(^|\.)ctao\.org$ -(^|\.)ctfriend\.net$ -(^|\.)cthlo\.github\.io$ -(^|\.)ctitv\.com\.tw$ -(^|\.)cts\.com\.tw$ -(^|\.)cuhkacs\.org$ -(^|\.)cuihua\.org$ -(^|\.)cuiweiping\.net$ -(^|\.)culture\.tw$ -(^|\.)cumlouder\.com$ -(^|\.)curvefish\.com$ -(^|\.)cusu\.hk$ -(^|\.)cw\.com\.tw$ -(^|\.)cyberghost\.natado\.com$ -(^|\.)cyberghostvpn\.com$ -(^|\.)cynscribe\.com$ -(^|\.)cytode\.us$ -(^|\.)d-fukyu\.com$ -(^|\.)d100\.net$ -(^|\.)d1b183sg0nvnuh\.cloudfront\.net$ -(^|\.)d1c37gjwa26taa\.cloudfront\.net$ -(^|\.)d2bay\.com$ -(^|\.)d2pass\.com$ -(^|\.)d3c33hcgiwev3\.cloudfront\.net$ -(^|\.)d3rhr7kgmtrq1v\.cloudfront\.net$ -(^|\.)dabr\.co\.uk$ -(^|\.)dabr\.eu$ -(^|\.)dabr\.me$ -(^|\.)dabr\.mobi$ -(^|\.)dadazim\.com$ -(^|\.)dadi360\.com$ -(^|\.)dafagood\.com$ -(^|\.)dafahao\.com$ -(^|\.)dafoh\.org$ -(^|\.)dagelijksestandaard\.nl$ -(^|\.)daidostup\.ru$ -(^|\.)dailidaili\.com$ -(^|\.)dailymotion\.com$ -(^|\.)dailynews\.sina\.com$ -(^|\.)dailynews\.sina\.com%2f$ -(^|\.)daiphapinfo\.net$ -(^|\.)dajiyuan\.com$ -(^|\.)dajiyuan\.de$ -(^|\.)dajiyuan\.eu$ -(^|\.)dajusha\.baywords\.com$ -(^|\.)dalailama-archives\.org$ -(^|\.)dalailama\.com$ -(^|\.)dalailama\.mn$ -(^|\.)dalailama\.ru$ -(^|\.)dalailama\.usc\.edu$ -(^|\.)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$ -(^|\.)danbooru\.donmai\.us$ -(^|\.)danke4china\.net$ -(^|\.)danwei\.org$ -(^|\.)daodu14\.jigsy\.com$ -(^|\.)daolan\.net$ -(^|\.)daozhongxing\.org$ -(^|\.)darktech\.org$ -(^|\.)darktoy\.net$ -(^|\.)darpa\.mil$ -(^|\.)dastrassi\.org$ -(^|\.)data-vocabulary\.org$ -(^|\.)data\.flurry\.com$ -(^|\.)data\.gov\.tw$ -(^|\.)david-kilgour\.com$ -(^|\.)dawangidc\.com$ -(^|\.)daxa\.cn$ -(^|\.)daylife\.com$ -(^|\.)db\.tt$ -(^|\.)dbc\.hk$ -(^|\.)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$ -(^|\.)deaftone\.com$ -(^|\.)debug\.com$ -(^|\.)deck\.ly$ -(^|\.)decodet\.co$ -(^|\.)deepmind\.com$ -(^|\.)deezer\.com$ -(^|\.)definebabe\.com$ -(^|\.)deja\.com$ -(^|\.)delcamp\.net$ -(^|\.)delicious\.com$ -(^|\.)demo\.opera-mini\.net$ -(^|\.)democrats\.org$ -(^|\.)depositphotos\.com$ -(^|\.)derekhsu\.homeip\.net$ -(^|\.)desc\.se$ -(^|\.)design\.google$ -(^|\.)desipro\.de$ -(^|\.)dessci\.com$ -(^|\.)destiny\.xfiles\.to$ -(^|\.)destroy-china\.jp$ -(^|\.)deutsche-welle\.de$ -(^|\.)developers\.box\.net$ -(^|\.)devio\.us$ -(^|\.)devpn\.com$ -(^|\.)dfas\.mil$ -(^|\.)dfn\.org$ -(^|\.)dharamsalanet\.com$ -(^|\.)dharmakara\.net$ -(^|\.)dhcp\.biz$ -(^|\.)diaoyuislands\.org$ -(^|\.)dictionary\.goo\.ne\.jp$ -(^|\.)digiland\.tw$ -(^|\.)digisfera\.com$ -(^|\.)digitalnomadsproject\.org$ -(^|\.)diigo\.com$ -(^|\.)dilber\.se$ -(^|\.)dingchin\.com\.tw$ -(^|\.)dipity\.com$ -(^|\.)directcreative\.com$ -(^|\.)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$ -(^|\.)dl\.box\.net$ -(^|\.)dlsite\.com$ -(^|\.)dlyoutube\.com$ -(^|\.)dm530\.net$ -(^|\.)dmcdn\.net$ -(^|\.)dmm\.co\.jp$ -(^|\.)dns-dns\.com$ -(^|\.)dns-stuff\.com$ -(^|\.)dns04\.com$ -(^|\.)dns05\.com$ -(^|\.)dns1\.us$ -(^|\.)dns2\.us$ -(^|\.)dns2go\.com$ -(^|\.)dnscrypt\.org$ -(^|\.)dnset\.com$ -(^|\.)dnsrd\.com$ -(^|\.)dnssec\.net$ -(^|\.)dnvod\.tv$ -(^|\.)doctorvoice\.org$ -(^|\.)dogfartnetwork\.com$ -(^|\.)dojin\.com$ -(^|\.)dok-forum\.net$ -(^|\.)dolc\.de$ -(^|\.)dolf\.org\.hk$ -(^|\.)dollf\.com$ -(^|\.)domain\.club\.tw$ -(^|\.)domainhelp\.search\.com$ -(^|\.)domains\.google$ -(^|\.)domaintoday\.com\.au$ -(^|\.)dongtaiwang\.com$ -(^|\.)dongtaiwang\.net$ -(^|\.)dongyangjing\.com$ -(^|\.)dontfilter\.us$ -(^|\.)dontmovetochina\.com$ -(^|\.)dorjeshugden\.com$ -(^|\.)dotplane\.com$ -(^|\.)dotsub\.com$ -(^|\.)dotvpn\.com$ -(^|\.)doub\.io$ -(^|\.)dougscripts\.com$ -(^|\.)douhokanko\.net$ -(^|\.)doujincafe\.com$ -(^|\.)dowei\.org$ -(^|\.)download\.aircrack-ng\.org$ -(^|\.)download\.cnet\.com$ -(^|\.)download\.ithome\.com\.tw$ -(^|\.)dphk\.org$ -(^|\.)dpp\.org\.tw$ -(^|\.)dpr\.info$ -(^|\.)dragonsprings\.org$ -(^|\.)dreamamateurs\.com$ -(^|\.)drepung\.org$ -(^|\.)drgan\.net$ -(^|\.)drmingxia\.org$ -(^|\.)dropbooks\.tv$ -(^|\.)dropbox\.com$ -(^|\.)dropboxusercontent\.com$ -(^|\.)drsunacademy\.com$ -(^|\.)drtuber\.com$ -(^|\.)dscn\.info$ -(^|\.)dsmtp\.com$ -(^|\.)dstk\.dk$ -(^|\.)dtdns\.net$ -(^|\.)dtiblog\.com$ -(^|\.)dtic\.mil$ -(^|\.)dtwang\.org$ -(^|\.)duanzhihu\.com$ -(^|\.)duck\.com$ -(^|\.)duckdns\.org$ -(^|\.)duckduckgo-owned-server\.yahoo\.net$ -(^|\.)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$ -(^|\.)dvorak\.org$ -(^|\.)dw-world\.com$ -(^|\.)dw-world\.de$ -(^|\.)dw\.com$ -(^|\.)dw\.de$ -(^|\.)dwnews\.com$ -(^|\.)dwnews\.net$ -(^|\.)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$ -(^|\.)dynupdate\.no-ip\.com$ -(^|\.)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$ -(^|\.)eastturkistancc\.org$ -(^|\.)eastturkistangovernmentinexile\.us$ -(^|\.)easyca\.ca$ -(^|\.)easypic\.com$ -(^|\.)ebony-beauty\.com$ -(^|\.)ebook\.hyread\.com\.tw$ -(^|\.)ebookbrowse\.com$ -(^|\.)ebookee\.com$ -(^|\.)ecfa\.org\.tw$ -(^|\.)echofon\.com$ -(^|\.)ecimg\.tw$ -(^|\.)ecministry\.net$ -(^|\.)economist\.com$ -(^|\.)ecsm\.vs\.com$ -(^|\.)edgecastcdn\.net$ -(^|\.)edicypages\.com$ -(^|\.)edmontonchina\.cn$ -(^|\.)edmontonservice\.com$ -(^|\.)edns\.biz$ -(^|\.)edoors\.com$ -(^|\.)edubridge\.com$ -(^|\.)edupro\.org$ -(^|\.)eeas\.europa\.eu$ -(^|\.)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$ -(^|\.)elpais\.com$ -(^|\.)eltondisney\.com$ -(^|\.)emaga\.com$ -(^|\.)emanna\.com$ -(^|\.)embr\.in$ -(^|\.)emilylau\.org\.hk$ -(^|\.)empfil\.com$ -(^|\.)emule-ed2k\.com$ -(^|\.)emulefans\.com$ -(^|\.)emuparadise\.me$ -(^|\.)en\.favotter\.net$ -(^|\.)en\.hao123\.com$ -(^|\.)enanyang\.my$ -(^|\.)enewstree\.com$ -(^|\.)enfal\.de$ -(^|\.)engagedaily\.org$ -(^|\.)englishforeveryone\.org$ -(^|\.)englishfromengland\.co\.uk$ -(^|\.)englishpen\.org$ -(^|\.)enlighten\.org\.tw$ -(^|\.)entermap\.com$ -(^|\.)entnt\.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$ -(^|\.)etaa\.org\.au$ -(^|\.)etadult\.com$ -(^|\.)etaiwannews\.com$ -(^|\.)etizer\.org$ -(^|\.)etokki\.com$ -(^|\.)etools\.ncol\.com$ -(^|\.)etowns\.net$ -(^|\.)etowns\.org$ -(^|\.)ettoday\.net$ -(^|\.)etvonline\.hk$ -(^|\.)eu\.org$ -(^|\.)eucasino\.com$ -(^|\.)eulam\.com$ -(^|\.)eurekavpt\.com$ -(^|\.)evchk\.wikia\.com$ -(^|\.)evschool\.net$ -(^|\.)exblog\.jp$ -(^|\.)exchristian\.hk$ -(^|\.)exmormon\.org$ -(^|\.)expatshield\.com$ -(^|\.)expecthim\.com$ -(^|\.)expekt\.com$ -(^|\.)experts-univers\.com$ -(^|\.)exploader\.net$ -(^|\.)expressvpn\.com$ -(^|\.)extmatrix\.com$ -(^|\.)extremetube\.com$ -(^|\.)eyevio\.jp$ -(^|\.)eyny\.com$ -(^|\.)ezpc\.tk$ -(^|\.)ezpeer\.com$ -(^|\.)ezua\.com$ -(^|\.)fa\.gov\.tw$ -(^|\.)facebook\.br$ -(^|\.)facebook\.com$ -(^|\.)facebook\.design$ -(^|\.)facebook\.hu$ -(^|\.)facebook\.in$ -(^|\.)facebook\.nl$ -(^|\.)facebook\.se$ -(^|\.)facebookquotes4u\.com$ -(^|\.)faceless\.me$ -(^|\.)facesofnyfw\.com$ -(^|\.)facesoftibetanselfimmolators\.info$ -(^|\.)fail\.hk$ -(^|\.)faith100\.org$ -(^|\.)faithfuleye\.com$ -(^|\.)faiththedog\.info$ -(^|\.)fakku\.net$ -(^|\.)falsefire\.com$ -(^|\.)falun-co\.org$ -(^|\.)falun-ny\.net$ -(^|\.)falun\.caltech\.edu$ -(^|\.)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$ -(^|\.)fangbinxing\.com$ -(^|\.)fangeming\.com$ -(^|\.)fangeqiang\.com$ -(^|\.)fanglizhi\.info$ -(^|\.)fangmincn\.org$ -(^|\.)fangong\.forums-free\.com$ -(^|\.)fangong\.org$ -(^|\.)fangongheike\.com$ -(^|\.)fanhaodang\.com$ -(^|\.)fanqiang\.tk$ -(^|\.)fanqianghou\.com$ -(^|\.)fanqiangyakexi\.net$ -(^|\.)fanqiangzhe\.com$ -(^|\.)fanswong\.com$ -(^|\.)fanyue\.info$ -(^|\.)fapdu\.com$ -(^|\.)faproxy\.com$ -(^|\.)faqserv\.com$ -(^|\.)fartit\.com$ -(^|\.)farwestchina\.com$ -(^|\.)fast\.wistia\.com$ -(^|\.)fastpic\.ru$ -(^|\.)fastssh\.com$ -(^|\.)faststone\.org$ -(^|\.)favstar\.fm$ -(^|\.)fawanghuihui\.org$ -(^|\.)faydao\.com$ -(^|\.)fb\.com$ -(^|\.)fb\.me$ -(^|\.)fbcdn\.net$ -(^|\.)fbsbx\.com$ -(^|\.)fc2\.com$ -(^|\.)fc2blog\.net$ -(^|\.)fc2china\.com$ -(^|\.)fc2cn\.com$ -(^|\.)fda\.gov\.tw$ -(^|\.)fdc64\.de$ -(^|\.)fdc64\.org$ -(^|\.)fdc89\.jp$ -(^|\.)feedburner\.com$ -(^|\.)feeds\.fileforum\.com$ -(^|\.)feelssh\.com$ -(^|\.)feer\.com$ -(^|\.)feifeiss\.com$ -(^|\.)feitian-california\.org$ -(^|\.)feitianacademy\.org$ -(^|\.)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$ -(^|\.)files2me\.com$ -(^|\.)fileserve\.com$ -(^|\.)filesor\.com$ -(^|\.)fillthesquare\.org$ -(^|\.)filmingfortibet\.org$ -(^|\.)filmy\.olabloga\.pl$ -(^|\.)filthdump\.com$ -(^|\.)financetwitter\.com$ -(^|\.)finchvpn\.com$ -(^|\.)findmespot\.com$ -(^|\.)findyoutube\.com$ -(^|\.)fingerdaily\.com$ -(^|\.)finler\.net$ -(^|\.)firearmsworld\.net$ -(^|\.)firebaseio\.com$ -(^|\.)fireofliberty\.org$ -(^|\.)firetweet\.io$ -(^|\.)firstfivefollowers\.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$ -(^|\.)fochk\.org$ -(^|\.)focustaiwan\.tw$ -(^|\.)focusvpn\.com$ -(^|\.)fofg-europe\.net$ -(^|\.)fofg\.org$ -(^|\.)fofldfradio\.org$ -(^|\.)fooooo\.com$ -(^|\.)footwiball\.com$ -(^|\.)forum\.baby-kingdom\.com$ -(^|\.)forum\.cyberctm\.com$ -(^|\.)forum\.idsam\.com$ -(^|\.)forum\.my903\.com$ -(^|\.)forum\.mymaji\.com$ -(^|\.)forum\.omy\.sg$ -(^|\.)forum\.palmislife\.com$ -(^|\.)forum\.setty\.com\.tw$ -(^|\.)forum\.sina\.com\.hk$ -(^|\.)forum\.slime\.com\.tw$ -(^|\.)forum\.tvb\.com$ -(^|\.)forum\.xinbao\.de$ -(^|\.)forum4hk\.com$ -(^|\.)fotile\.me$ -(^|\.)fourface\.nodesnoop\.com$ -(^|\.)fourthinternational\.org$ -(^|\.)foxdie\.us$ -(^|\.)foxgay\.com$ -(^|\.)foxsub\.com$ -(^|\.)foxtang\.com$ -(^|\.)fpmt-osel\.org$ -(^|\.)fpmt\.org$ -(^|\.)fpmt\.tw$ -(^|\.)fpmtmexico\.org$ -(^|\.)fq\.wikia\.com$ -(^|\.)fqok\.org$ -(^|\.)fqrouter\.com$ -(^|\.)franklc\.com$ -(^|\.)freakshare\.com$ -(^|\.)free-gate\.org$ -(^|\.)free-hada-now\.org$ -(^|\.)free-proxy\.cz$ -(^|\.)free-ssh\.com$ -(^|\.)free\.fr$ -(^|\.)free4u\.com\.ar$ -(^|\.)freealim\.com$ -(^|\.)freebrowser\.org$ -(^|\.)freechal\.com$ -(^|\.)freechina\.net$ -(^|\.)freechina\.news$ -(^|\.)freechinaforum\.org$ -(^|\.)freeddns\.com$ -(^|\.)freeddns\.org$ -(^|\.)freedomchina\.info$ -(^|\.)freedomcollection\.org$ -(^|\.)freedomhouse\.org$ -(^|\.)freedominfonetweb\.wordpress\.com$ -(^|\.)freedomsherald\.org$ -(^|\.)freeforums\.org$ -(^|\.)freefq\.com$ -(^|\.)freefuckvids\.com$ -(^|\.)freegao\.com$ -(^|\.)freeilhamtohti\.org$ -(^|\.)freekwonpyong\.org$ -(^|\.)freelotto\.com$ -(^|\.)freeman2\.com$ -(^|\.)freemoren\.com$ -(^|\.)freemorenews\.com$ -(^|\.)freemuse\.org$ -(^|\.)freenet$ -(^|\.)freenet-china\.org$ -(^|\.)freenetproject\.org$ -(^|\.)freenewscn\.com$ -(^|\.)freeopenvpn\.com$ -(^|\.)freeoz\.org$ -(^|\.)freessh\.us$ -(^|\.)freetcp\.com$ -(^|\.)freetibet\.net$ -(^|\.)freetibet\.org$ -(^|\.)freetibetanheroes\.org$ -(^|\.)freeviewmovies\.com$ -(^|\.)freevpn\.me$ -(^|\.)freevpn\.nl$ -(^|\.)freewallpaper4\.me$ -(^|\.)freewebs\.com$ -(^|\.)freewechat\.com$ -(^|\.)freeweibo\.com$ -(^|\.)freewww\.biz$ -(^|\.)freewww\.info$ -(^|\.)freexinwen\.com$ -(^|\.)freeyellow\.com$ -(^|\.)freeyoutubeproxy\.net$ -(^|\.)friendfeed-media\.com$ -(^|\.)friendfeed\.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$ -(^|\.)fucd\.com$ -(^|\.)fuckcnnic\.net$ -(^|\.)fuckgfw\.org$ -(^|\.)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$ -(^|\.)g6hentai\.com$ -(^|\.)gabocorp\.com$ -(^|\.)gaeproxy\.com$ -(^|\.)gaforum\.org$ -(^|\.)galaxymacau\.com$ -(^|\.)galenwu\.com$ -(^|\.)galstars\.net$ -(^|\.)game735\.com$ -(^|\.)gamebase\.com\.tw$ -(^|\.)gamejolt\.com$ -(^|\.)gamer\.com\.tw$ -(^|\.)gamez\.com\.tw$ -(^|\.)gamousa\.com$ -(^|\.)ganges\.com$ -(^|\.)gaoming\.net$ -(^|\.)gaopi\.net$ -(^|\.)gaozhisheng\.net$ -(^|\.)gaozhisheng\.org$ -(^|\.)gardennetworks\.com$ -(^|\.)gardennetworks\.org$ -(^|\.)gartlive\.com$ -(^|\.)gate-project\.com$ -(^|\.)gather\.com$ -(^|\.)gatherproxy\.com$ -(^|\.)gati\.org\.tw$ -(^|\.)gaybubble\.com$ -(^|\.)gaycn\.net$ -(^|\.)gayhub\.com$ -(^|\.)gaymap\.cc$ -(^|\.)gaytube\.com$ -(^|\.)gaywatch\.com$ -(^|\.)gazotube\.com$ -(^|\.)gcc\.org\.hk$ -(^|\.)gclooney\.com$ -(^|\.)gcpnews\.com$ -(^|\.)gcr\.io$ -(^|\.)gdbt\.net$ -(^|\.)gdzf\.org$ -(^|\.)geek-art\.net$ -(^|\.)geekerhome\.com$ -(^|\.)geekheart\.info$ -(^|\.)gekikame\.com$ -(^|\.)gelbooru\.com$ -(^|\.)geocities\.co\.jp$ -(^|\.)geocities\.com$ -(^|\.)geocities\.jp$ -(^|\.)gerefoundation\.org$ -(^|\.)get\.how$ -(^|\.)getastrill\.com$ -(^|\.)getchu\.com$ -(^|\.)getcloak\.com$ -(^|\.)getfoxyproxy\.org$ -(^|\.)getfreedur\.com$ -(^|\.)getgom\.com$ -(^|\.)geti2p\.net$ -(^|\.)getiton\.com$ -(^|\.)getjetso\.com$ -(^|\.)getlantern\.org$ -(^|\.)getmdl\.io$ -(^|\.)getsocialscope\.com$ -(^|\.)getsync\.com$ -(^|\.)gettrials\.com$ -(^|\.)gettyimages\.com$ -(^|\.)getuploader\.com$ -(^|\.)gfbv\.de$ -(^|\.)gfgold\.com\.hk$ -(^|\.)gfsale\.com$ -(^|\.)gfw\.org\.ua$ -(^|\.)gfw\.press$ -(^|\.)ggpht\.com$ -(^|\.)ggssl\.com$ -(^|\.)ghost\.org$ -(^|\.)ghostpath\.com$ -(^|\.)ghut\.org$ -(^|\.)giantessnight\.com$ -(^|\.)gifree\.com$ -(^|\.)giga-web\.jp$ -(^|\.)gigporno\.ru$ -(^|\.)girlbanker\.com$ -(^|\.)git\.io$ -(^|\.)gizlen\.net$ -(^|\.)gjczz\.com$ -(^|\.)glass8\.eu$ -(^|\.)global\.bing\.com$ -(^|\.)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$ -(^|\.)gmbd\.cn$ -(^|\.)gmhz\.org$ -(^|\.)gmll\.org$ -(^|\.)gmodules\.com$ -(^|\.)gmozomg\.izihost\.org$ -(^|\.)gnci\.org\.hk$ -(^|\.)go-pki\.com$ -(^|\.)go\.nesnode\.com$ -(^|\.)go141\.com$ -(^|\.)goagent\.biz$ -(^|\.)goagent\.codeplex\.com$ -(^|\.)goagentplus\.com$ -(^|\.)gobet\.cc$ -(^|\.)godfootsteps\.org$ -(^|\.)godns\.work$ -(^|\.)godoc\.org$ -(^|\.)godsdirectcontact\.co\.uk$ -(^|\.)godsdirectcontact\.org$ -(^|\.)godsdirectcontact\.org\.tw$ -(^|\.)godsimmediatecontact\.com$ -(^|\.)gogotunnel\.com$ -(^|\.)gohappy\.com\.tw$ -(^|\.)gojet\.krtco\.com\.tw$ -(^|\.)gokbayrak\.com$ -(^|\.)golang\.org$ -(^|\.)goldbet\.com$ -(^|\.)goldbetsports\.com$ -(^|\.)goldeneyevault\.com$ -(^|\.)goldenfrog\.com$ -(^|\.)goldjizz\.com$ -(^|\.)goldstep\.net$ -(^|\.)goldwave\.com$ -(^|\.)gongm\.in$ -(^|\.)gongmeng\.info$ -(^|\.)gongminliliang\.com$ -(^|\.)gongwt\.com$ -(^|\.)goo\.gl$ -(^|\.)gooday\.xyz$ -(^|\.)gooddns\.info$ -(^|\.)goodreaders\.com$ -(^|\.)goodreads\.com$ -(^|\.)goodtv\.com\.tw$ -(^|\.)goodtv\.tv$ -(^|\.)goofind\.com$ -(^|\.)google(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapis(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapps\.com$ -(^|\.)googlearth\.com$ -(^|\.)googleartproject\.com$ -(^|\.)googleblog\.com$ -(^|\.)googlebot\.com$ -(^|\.)googlechinawebmaster\.com$ -(^|\.)googlecode\.com$ -(^|\.)googlecommerce\.com$ -(^|\.)googledomains\.com$ -(^|\.)googledrive\.com$ -(^|\.)googleearth\.com$ -(^|\.)googlegroups\.com$ -(^|\.)googlehosted\.com$ -(^|\.)googleideas\.com$ -(^|\.)googleinsidesearch\.com$ -(^|\.)googlelabs\.com$ -(^|\.)googlemail\.com$ -(^|\.)googlemashups\.com$ -(^|\.)googlepagecreator\.com$ -(^|\.)googleplay\.com$ -(^|\.)googleplus\.com$ -(^|\.)googlescholar\.com$ -(^|\.)googlesile\.com$ -(^|\.)googlesource\.com$ -(^|\.)googleusercontent\.com$ -(^|\.)googlevideo\.com$ -(^|\.)googleweblight\.com$ -(^|\.)googlezip\.net$ -(^|\.)gopetition\.com$ -(^|\.)goproxing\.net$ -(^|\.)gospelherald\.com$ -(^|\.)got-game\.org$ -(^|\.)gotdns\.ch$ -(^|\.)gotgeeks\.com$ -(^|\.)gotrusted\.com$ -(^|\.)gotw\.ca$ -(^|\.)gov\.taipei$ -(^|\.)gov\.tw$ -(^|\.)gr8domain\.biz$ -(^|\.)gr8name\.biz$ -(^|\.)grammaly\.com$ -(^|\.)grandtrial\.org$ -(^|\.)grangorz\.org$ -(^|\.)graphis\.ne\.jp$ -(^|\.)graphql\.org$ -(^|\.)greasespot\.net$ -(^|\.)great-firewall\.com$ -(^|\.)great-roc\.org$ -(^|\.)greatfire\.org$ -(^|\.)greatfire\.us7\.list-manage\.com$ -(^|\.)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$ -(^|\.)groups\.google\.cn$ -(^|\.)gs-discuss\.com$ -(^|\.)gstatic\.com$ -(^|\.)gtricks\.com$ -(^|\.)gts-vpn\.com$ -(^|\.)gu-chu-sum\.org$ -(^|\.)guaguass\.com$ -(^|\.)guaguass\.org$ -(^|\.)guancha\.org$ -(^|\.)guangming\.com\.my$ -(^|\.)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$ -(^|\.)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$ -(^|\.)hackthatphone\.net$ -(^|\.)hahlo\.com$ -(^|\.)hakkatv\.org\.tw$ -(^|\.)handcraftedsoftware\.org$ -(^|\.)hanunyi\.com$ -(^|\.)hao\.news$ -(^|\.)haoel\.github\.io$ -(^|\.)happy-vpn\.com$ -(^|\.)haproxy\.org$ -(^|\.)hardsextube\.com$ -(^|\.)harunyahya\.com$ -(^|\.)hautelook\.com$ -(^|\.)hautelookcdn\.com$ -(^|\.)have8\.com$ -(^|\.)hclips\.com$ -(^|\.)hd\.stheadline\.com$ -(^|\.)hdlt\.me$ -(^|\.)hdtvb\.net$ -(^|\.)hdzog\.com$ -(^|\.)heartyit\.com$ -(^|\.)hec\.su$ -(^|\.)hecaitou\.net$ -(^|\.)hechaji\.com$ -(^|\.)heeact\.edu\.tw$ -(^|\.)hegre-art\.com$ -(^|\.)heix\.pp\.ru$ -(^|\.)helloandroid\.com$ -(^|\.)helloqueer\.com$ -(^|\.)helloss\.pw$ -(^|\.)hellotxt\.com$ -(^|\.)hellouk\.org$ -(^|\.)help\.linksalpha\.com$ -(^|\.)helpeachpeople\.com$ -(^|\.)helplinfen\.com$ -(^|\.)helpster\.de$ -(^|\.)helpzhuling\.org$ -(^|\.)hentai\.to$ -(^|\.)hentaitube\.tv$ -(^|\.)hentaivideoworld\.com$ -(^|\.)heqinglian\.net$ -(^|\.)heungkongdiscuss\.com$ -(^|\.)hexieshe\.com$ -(^|\.)hexieshe\.xyz$ -(^|\.)hexxeh\.net$ -(^|\.)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$ -(^|\.)hihiforum\.com$ -(^|\.)hihistory\.net$ -(^|\.)hiitch\.com$ -(^|\.)hikinggfw\.org$ -(^|\.)hilive\.tv$ -(^|\.)himalayan-foundation\.org$ -(^|\.)himalayanglacier\.com$ -(^|\.)himemix\.com$ -(^|\.)himemix\.net$ -(^|\.)hitomi\.la$ -(^|\.)hiwifi\.com$ -(^|\.)hizb-ut-tahrir\.info$ -(^|\.)hizb-ut-tahrir\.org$ -(^|\.)hizbuttahrir\.org$ -(^|\.)hjclub\.info$ -(^|\.)hk-pub\.com$ -(^|\.)hk\.frienddy\.com$ -(^|\.)hk\.geocities\.com$ -(^|\.)hk\.gradconnection\.com$ -(^|\.)hk\.hao123img\.com$ -(^|\.)hk\.jiepang\.com$ -(^|\.)hk\.knowledge\.yahoo\.com$ -(^|\.)hk\.myblog\.yahoo\.com$ -(^|\.)hk\.news\.yahoo\.com$ -(^|\.)hk\.rd\.yahoo\.com$ -(^|\.)hk\.search\.yahoo\.com$ -(^|\.)hk\.video\.news\.yahoo\.com$ -(^|\.)hk\.yahoo\.com$ -(^|\.)hk01\.com$ -(^|\.)hk32168\.com$ -(^|\.)hka8964\.wordpress\.com$ -(^|\.)hkacg\.com$ -(^|\.)hkacg\.net$ -(^|\.)hkanews\.wordpress\.com$ -(^|\.)hkatvnews\.com$ -(^|\.)hkbc\.net$ -(^|\.)hkbf\.org$ -(^|\.)hkbookcity\.com$ -(^|\.)hkchurch\.org$ -(^|\.)hkci\.org\.hk$ -(^|\.)hkcmi\.edu$ -(^|\.)hkcnews\.com$ -(^|\.)hkcoc\.com$ -(^|\.)hkcoc\.weather\.com\.hk$ -(^|\.)hkdailynews\.com\.hk$ -(^|\.)hkday\.net$ -(^|\.)hkdf\.org$ -(^|\.)hkej\.com$ -(^|\.)hkepc\.com$ -(^|\.)hkfaa\.com$ -(^|\.)hkfreezone\.com$ -(^|\.)hkfront\.org$ -(^|\.)hkgolden\.com$ -(^|\.)hkgreenradio\.org$ -(^|\.)hkheadline\.com$ -(^|\.)hkhkhk\.com$ -(^|\.)hkhrc\.org\.hk$ -(^|\.)hkhrm\.org\.hk$ -(^|\.)hkip\.org\.uk$ -(^|\.)hkjc\.com$ -(^|\.)hkjp\.org$ -(^|\.)hklft\.com$ -(^|\.)hklts\.org\.hk$ -(^|\.)hkptu\.org$ -(^|\.)hkreporter\.com$ -(^|\.)hkreporter\.loved\.hk$ -(^|\.)hkupop\.hku\.hk$ -(^|\.)hkusu\.net$ -(^|\.)hkvwet\.com$ -(^|\.)hkwcc\.org\.hk$ -(^|\.)hkzone\.org$ -(^|\.)hmonghot\.com$ -(^|\.)hmvdigital\.ca$ -(^|\.)hmvdigital\.com$ -(^|\.)hnjhj\.com$ -(^|\.)hnntube\.com$ -(^|\.)hola\.com$ -(^|\.)hola\.org$ -(^|\.)holymountaincn\.com$ -(^|\.)holyspiritspeaks\.org$ -(^|\.)home\.sina\.com$ -(^|\.)home\.so-net\.net\.tw$ -(^|\.)homedepot\.com$ -(^|\.)homeperversion\.com$ -(^|\.)homeservershow\.com$ -(^|\.)hongkongfp\.com$ -(^|\.)hongmeimei\.com$ -(^|\.)hongzhi\.li$ -(^|\.)hootsuite\.com$ -(^|\.)hoovers\.com$ -(^|\.)hopedialogue\.org$ -(^|\.)hopto\.org$ -(^|\.)hornygamer\.com$ -(^|\.)hornytrip\.com$ -(^|\.)hotav\.tv$ -(^|\.)hotels\.cn$ -(^|\.)hotfrog\.com\.tw$ -(^|\.)hotgoo\.com$ -(^|\.)hotpornshow\.com$ -(^|\.)hotpot\.hk$ -(^|\.)hotshame\.com$ -(^|\.)hotspotshield\.com$ -(^|\.)hotvpn\.com$ -(^|\.)hougaige\.com$ -(^|\.)howtoforge\.com$ -(^|\.)hpa\.gov\.tw$ -(^|\.)hqcdp\.org$ -(^|\.)hqjapanesesex\.com$ -(^|\.)hqmovies\.com$ -(^|\.)hqsbnet\.wordpress\.com$ -(^|\.)hqsbonline\.wordpress\.com$ -(^|\.)hrcchina\.org$ -(^|\.)hrcir\.com$ -(^|\.)hrea\.org$ -(^|\.)hrichina\.org$ -(^|\.)hrw\.org$ -(^|\.)hrweb\.org$ -(^|\.)hsjp\.net$ -(^|\.)hsselite\.com$ -(^|\.)hst\.net\.tw$ -(^|\.)hstern\.net$ -(^|\.)hstt\.net$ -(^|\.)ht\.ly$ -(^|\.)htkou\.net$ -(^|\.)htl\.li$ -(^|\.)html5rocks\.com$ -(^|\.)https$ -(^|\.)https443\.net$ -(^|\.)https443\.org$ -(^|\.)hua-yue\.net$ -(^|\.)huaglad\.com$ -(^|\.)huanghuagang\.org$ -(^|\.)huangyiyu\.com$ -(^|\.)huaren\.us$ -(^|\.)huaren4us\.com$ -(^|\.)huashangnews\.com$ -(^|\.)huaxia-news\.com$ -(^|\.)huaxiabao\.org$ -(^|\.)huaxin\.ph$ -(^|\.)huayuworld\.org$ -(^|\.)hudatoriq\.web\.id$ -(^|\.)huffingtonpost\.com$ -(^|\.)hugoroy\.eu$ -(^|\.)huhaitai\.com$ -(^|\.)huhamhire\.com$ -(^|\.)huiyi\.in$ -(^|\.)hulkshare\.com$ -(^|\.)hulu\.com$ -(^|\.)huluim\.com$ -(^|\.)hum$ -(^|\.)humanrightsbriefing\.org$ -(^|\.)hung-ya\.com$ -(^|\.)hungerstrikeforaids\.org$ -(^|\.)huobi\.com$ -(^|\.)huobi\.pro$ -(^|\.)huobipro\.com$ -(^|\.)huping\.net$ -(^|\.)hurgokbayrak\.com$ -(^|\.)hurriyet\.com\.tr$ -(^|\.)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$ -(^|\.)i-cable\.com$ -(^|\.)i-part\.com\.tw$ -(^|\.)i\.lithium\.com$ -(^|\.)i1\.hk$ -(^|\.)i2p2\.de$ -(^|\.)i2runner\.com$ -(^|\.)i818hk\.com$ -(^|\.)iam\.soy$ -(^|\.)iamtopone\.com$ -(^|\.)iask\.bz$ -(^|\.)iask\.ca$ -(^|\.)iav19\.com$ -(^|\.)ibiblio\.org$ -(^|\.)iblist\.com$ -(^|\.)iblogserv-f\.net$ -(^|\.)ibros\.org$ -(^|\.)ibvpn\.com$ -(^|\.)icams\.com$ -(^|\.)ice\.audionow\.com$ -(^|\.)icij\.org$ -(^|\.)icl-fi\.org$ -(^|\.)icoco\.com$ -(^|\.)iconpaper\.org$ -(^|\.)icu-project\.org$ -(^|\.)id\.hao123\.com$ -(^|\.)id\.heroku\.com$ -(^|\.)iddddg\.com$ -(^|\.)idemocracy\.asia$ -(^|\.)identi\.ca$ -(^|\.)idiomconnection\.com$ -(^|\.)idouga\.com$ -(^|\.)idreamx\.com$ -(^|\.)idv\.tw$ -(^|\.)ieasy5\.com$ -(^|\.)ied2k\.net$ -(^|\.)ienergy1\.com$ -(^|\.)if\.ttt$ -(^|\.)ifan\.cz\.cc$ -(^|\.)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$ -(^|\.)illusionfactory\.com$ -(^|\.)ilove80\.be$ -(^|\.)ilovelongtoes\.com$ -(^|\.)im\.tv$ -(^|\.)im88\.tw$ -(^|\.)imageab\.com$ -(^|\.)imagefap\.com$ -(^|\.)imageflea\.com$ -(^|\.)images-gaytube\.com$ -(^|\.)images\.comico\.tw$ -(^|\.)imageshack\.us$ -(^|\.)imagevenue\.com$ -(^|\.)imagezilla\.net$ -(^|\.)imb\.org$ -(^|\.)imdb\.com$ -(^|\.)img$ -(^|\.)img\.dlsite\.jp$ -(^|\.)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$ -(^|\.)in99\.org$ -(^|\.)incapdns\.net$ -(^|\.)incloak\.com$ -(^|\.)incredibox\.fr$ -(^|\.)indiandefensenews\.in$ -(^|\.)indiemerch\.com$ -(^|\.)info-graf\.fr$ -(^|\.)initiativesforchina\.org$ -(^|\.)inkui\.com$ -(^|\.)inmediahk\.net$ -(^|\.)innermongolia\.org$ -(^|\.)inote\.tw$ -(^|\.)insecam\.org$ -(^|\.)insidevoa\.com$ -(^|\.)instagram\.com$ -(^|\.)instanthq\.com$ -(^|\.)institut-tibetain\.org$ -(^|\.)internet\.org$ -(^|\.)internetdefenseleague\.org$ -(^|\.)internetfreedom\.org$ -(^|\.)internetpopculture\.com$ -(^|\.)investigating\.wordpress\.com$ -(^|\.)inxian\.com$ -(^|\.)iownyour\.biz$ -(^|\.)iownyour\.org$ -(^|\.)ipalter\.com$ -(^|\.)ipfire\.org$ -(^|\.)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$ -(^|\.)iredmail\.org$ -(^|\.)ironbigfools\.compython\.net$ -(^|\.)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$ -(^|\.)istiqlalhewer\.com$ -(^|\.)istockphoto\.com$ -(^|\.)isunaffairs\.com$ -(^|\.)isuntv\.com$ -(^|\.)itaboo\.info$ -(^|\.)itaiwan\.gov\.tw$ -(^|\.)italiatibet\.org$ -(^|\.)itasoftware\.com$ -(^|\.)itemdb\.com$ -(^|\.)ithelp\.ithome\.com\.tw$ -(^|\.)its\.caltech\.edu$ -(^|\.)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$ -(^|\.)izaobao\.us$ -(^|\.)izles\.net$ -(^|\.)izlesem\.org$ -(^|\.)j\.mp$ -(^|\.)ja\.wikipedia\.org$ -(^|\.)jamaat\.org$ -(^|\.)jamyangnorbu\.com$ -(^|\.)jandyx\.com$ -(^|\.)janwongphoto\.com$ -(^|\.)japan-whores\.com$ -(^|\.)japanfirst\.asianfreeforum\.com$ -(^|\.)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$ -(^|\.)jfqu36\.club$ -(^|\.)jfqu37\.xyz$ -(^|\.)jgoodies\.com$ -(^|\.)jiangweiping\.com$ -(^|\.)jiaoyou8\.com$ -(^|\.)jiehua\.cz$ -(^|\.)jieshibaobao\.com$ -(^|\.)jigglegifs\.com$ -(^|\.)jigong1024\.com$ -(^|\.)jihadintel\.meforum\.org$ -(^|\.)jihadology\.net$ -(^|\.)jiji\.com$ -(^|\.)jims\.net$ -(^|\.)jinbushe\.org$ -(^|\.)jingpin\.org$ -(^|\.)jingsim\.org$ -(^|\.)jinpianwang\.com$ -(^|\.)jinroukong\.com$ -(^|\.)jitouch\.com$ -(^|\.)jizzthis\.com$ -(^|\.)jjgirls\.com$ -(^|\.)jkb\.cc$ -(^|\.)jkforum\.net$ -(^|\.)jkub\.com$ -(^|\.)jma\.go\.jp$ -(^|\.)jmscult\.com$ -(^|\.)joachims\.org$ -(^|\.)jobnewera\.wordpress\.com$ -(^|\.)jobso\.tv$ -(^|\.)journalchretien\.net$ -(^|\.)journalofdemocracy\.org$ -(^|\.)joymiihub\.com$ -(^|\.)joyourself\.com$ -(^|\.)jp\.hao123\.com$ -(^|\.)jpl\.nasa\.gov$ -(^|\.)jpopforum\.net$ -(^|\.)jubushoushen\.com$ -(^|\.)juhuaren\.com$ -(^|\.)jukujo-club\.com$ -(^|\.)juliepost\.com$ -(^|\.)juliereyc\.com$ -(^|\.)junauza\.com$ -(^|\.)june4commemoration\.org$ -(^|\.)junefourth-20\.net$ -(^|\.)jungleheart\.com$ -(^|\.)juoaa\.com$ -(^|\.)justdied\.com$ -(^|\.)justfreevpn\.com$ -(^|\.)justicefortenzin\.org$ -(^|\.)justpaste\.it$ -(^|\.)justtristan\.com$ -(^|\.)juyuange\.org$ -(^|\.)juziyue\.com$ -(^|\.)jwmusic\.org$ -(^|\.)jyxf\.net$ -(^|\.)k-doujin\.net$ -(^|\.)ka-wai\.com$ -(^|\.)kagyu\.org$ -(^|\.)kagyu\.org\.za$ -(^|\.)kagyumonlam\.org$ -(^|\.)kagyunews\.com\.hk$ -(^|\.)kagyuoffice\.org$ -(^|\.)kagyuoffice\.org\.tw$ -(^|\.)kaiyuan\.de$ -(^|\.)kakao\.com$ -(^|\.)kalachakralugano\.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$ -(^|\.)kb\.monitorware\.com$ -(^|\.)kba-tx\.org$ -(^|\.)kcoolonline\.com$ -(^|\.)kebrum\.com$ -(^|\.)kechara\.com$ -(^|\.)keepandshare\.com$ -(^|\.)keezmovies\.com$ -(^|\.)kendatire\.com$ -(^|\.)kendincos\.net$ -(^|\.)kenengba\.com$ -(^|\.)keontech\.net$ -(^|\.)kepard\.com$ -(^|\.)keycdn\.com$ -(^|\.)khabdha\.org$ -(^|\.)khatrimaza\.org$ -(^|\.)khmusic\.com\.tw$ -(^|\.)kichiku-doujinko\.com$ -(^|\.)kik\.com$ -(^|\.)killwall\.com$ -(^|\.)kindleren\.com$ -(^|\.)kineox\.free\.fr$ -(^|\.)kingdomsalvation\.org$ -(^|\.)kinghost\.com$ -(^|\.)kingstone\.com\.tw$ -(^|\.)kink\.com$ -(^|\.)kinmen\.org\.tw$ -(^|\.)kinmen\.travel$ -(^|\.)kir\.jp$ -(^|\.)kissbbao\.cn$ -(^|\.)kiwi\.kz$ -(^|\.)kk-whys\.co\.jp$ -(^|\.)kkbox\.com$ -(^|\.)kknews\.cc$ -(^|\.)kmuh\.org\.tw$ -(^|\.)knowledgerush\.com$ -(^|\.)kobo\.com$ -(^|\.)kobobooks\.com$ -(^|\.)kodingen\.com$ -(^|\.)kompozer\.net$ -(^|\.)konachan\.com$ -(^|\.)kone\.com$ -(^|\.)koolsolutions\.com$ -(^|\.)koornk\.com$ -(^|\.)koranmandarin\.com$ -(^|\.)korenan2\.com$ -(^|\.)ksdl\.org$ -(^|\.)ksnews\.com\.tw$ -(^|\.)ktzhk\.com$ -(^|\.)kui\.name$ -(^|\.)kun\.im$ -(^|\.)kurashsultan\.com$ -(^|\.)kurtmunger\.com$ -(^|\.)kusocity\.com$ -(^|\.)kwcg\.ca$ -(^|\.)kwongwah\.com\.my$ -(^|\.)kxsw\.life$ -(^|\.)kyofun\.com$ -(^|\.)kyohk\.net$ -(^|\.)kyoyue\.com$ -(^|\.)kyzyhello\.com$ -(^|\.)kzeng\.info$ -(^|\.)la-forum\.org$ -(^|\.)labiennale\.org$ -(^|\.)ladbrokes\.com$ -(^|\.)lagranepoca\.com$ -(^|\.)lalulalu\.com$ -(^|\.)lama\.com\.tw$ -(^|\.)lamayeshe\.com$ -(^|\.)lamnia\.co\.uk$ -(^|\.)lamrim\.com$ -(^|\.)lanterncn\.cn$ -(^|\.)lantosfoundation\.org$ -(^|\.)laod\.cn$ -(^|\.)laogai\.org$ -(^|\.)laomiu\.com$ -(^|\.)laoyang\.info$ -(^|\.)laptoplockdown\.com$ -(^|\.)laqingdan\.net$ -(^|\.)larsgeorge\.com$ -(^|\.)lastcombat\.com$ -(^|\.)lastfm\.es$ -(^|\.)latelinenews\.com$ -(^|\.)latibet\.org$ -(^|\.)ld\.hao123img\.com$ -(^|\.)le-vpn\.com$ -(^|\.)leafyvpn\.net$ -(^|\.)lecloud\.net$ -(^|\.)leeao\.com\.cn$ -(^|\.)lefora\.com$ -(^|\.)left21\.hk$ -(^|\.)legalporno\.com$ -(^|\.)legaltech\.law\.com$ -(^|\.)legsjapan\.com$ -(^|\.)leirentv\.ca$ -(^|\.)leisurecafe\.ca$ -(^|\.)leisurepro\.com$ -(^|\.)lematin\.ch$ -(^|\.)lemonde\.fr$ -(^|\.)lenwhite\.com$ -(^|\.)lerosua\.org$ -(^|\.)lers\.google$ -(^|\.)lesoir\.be$ -(^|\.)letou\.com$ -(^|\.)letscorp\.net$ -(^|\.)lflink\.com$ -(^|\.)lflinkup\.com$ -(^|\.)lflinkup\.net$ -(^|\.)lflinkup\.org$ -(^|\.)lhakar\.org$ -(^|\.)lhasocialwork\.org$ -(^|\.)liangyou\.net$ -(^|\.)lianyue\.net$ -(^|\.)liaowangxizang\.net$ -(^|\.)liberal\.org\.hk$ -(^|\.)libertytimes\.com\.tw$ -(^|\.)library\.usc\.cuhk\.edu\.hk$ -(^|\.)lidecheng\.com$ -(^|\.)lifemiles\.com$ -(^|\.)lighten\.org\.tw$ -(^|\.)lightnovel\.cn$ -(^|\.)like\.com$ -(^|\.)limiao\.net$ -(^|\.)line-apps\.com$ -(^|\.)line-scdn\.net$ -(^|\.)line\.me$ -(^|\.)line\.naver\.jp$ -(^|\.)linglingfa\.com$ -(^|\.)lingvodics\.com$ -(^|\.)link-o-rama\.com$ -(^|\.)linkideo\.com$ -(^|\.)linkuswell\.com$ -(^|\.)linux\.org\.hk$ -(^|\.)linuxtoy\.org$ -(^|\.)lionsroar\.com$ -(^|\.)lipuman\.com$ -(^|\.)liquidvpn\.com$ -(^|\.)listentoyoutube\.com$ -(^|\.)listorious\.com$ -(^|\.)lists\.w3\.org$ -(^|\.)liudejun\.com$ -(^|\.)liuhanyu\.com$ -(^|\.)liujianshu\.com$ -(^|\.)liuxiaobo\.net$ -(^|\.)liuxiaotong\.com$ -(^|\.)livedoor\.jp$ -(^|\.)liveleak\.com$ -(^|\.)livestation\.com$ -(^|\.)livestream\.com$ -(^|\.)livevideo\.com$ -(^|\.)livingonline\.us$ -(^|\.)livingstream\.com$ -(^|\.)liwangyang\.com$ -(^|\.)lizhizhuangbi\.com$ -(^|\.)lkcn\.net$ -(^|\.)llss\.me$ -(^|\.)load\.to$ -(^|\.)lobsangwangyal\.com$ -(^|\.)localdomain\.ws$ -(^|\.)localpresshk\.com$ -(^|\.)lockestek\.com$ -(^|\.)logbot\.net$ -(^|\.)logiqx\.com$ -(^|\.)londonchinese\.ca$ -(^|\.)longhair\.hk$ -(^|\.)longmusic\.com$ -(^|\.)longtermly\.net$ -(^|\.)longtoes\.com$ -(^|\.)lookpic\.com$ -(^|\.)looktoronto\.com$ -(^|\.)lotsawahouse\.org$ -(^|\.)lotuslight\.org\.hk$ -(^|\.)lotuslight\.org\.tw$ -(^|\.)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$ -(^|\.)luke54\.com$ -(^|\.)luke54\.org$ -(^|\.)lupm\.org$ -(^|\.)lushstories\.com$ -(^|\.)luxebc\.com$ -(^|\.)lvhai\.org$ -(^|\.)lvv2\.com$ -(^|\.)lyfhk\.net$ -(^|\.)lzmtnews\.org$ -(^|\.)m\.hkgalden\.com$ -(^|\.)m\.me$ -(^|\.)m\.plixi\.com$ -(^|\.)m\.slandr\.net$ -(^|\.)ma\.hao123\.com$ -(^|\.)macgamestore\.com$ -(^|\.)macrovpn\.com$ -(^|\.)macts\.com\.tw$ -(^|\.)mad-ar\.ch$ -(^|\.)madewithcode\.com$ -(^|\.)madonna-av\.com$ -(^|\.)madthumbs\.com$ -(^|\.)magazines\.sina\.com\.tw$ -(^|\.)magic-net\.info$ -(^|\.)mahabodhi\.org$ -(^|\.)maiio\.net$ -(^|\.)mail-archive\.com$ -(^|\.)maildns\.xyz$ -(^|\.)maiplus\.com$ -(^|\.)maizhong\.org$ -(^|\.)makemymood\.com$ -(^|\.)makkahnewspaper\.com$ -(^|\.)makzhou\.warehouse333\.com$ -(^|\.)malaysiakini\.com$ -(^|\.)mamingzhe\.com$ -(^|\.)manchukuo\.net$ -(^|\.)mangafox\.com$ -(^|\.)mangafox\.me$ -(^|\.)maniash\.com$ -(^|\.)manicur4ik\.ru$ -(^|\.)mansion\.com$ -(^|\.)mansionpoker\.com$ -(^|\.)manta\.com$ -(^|\.)maplew\.com$ -(^|\.)marc\.info$ -(^|\.)marguerite\.su$ -(^|\.)martau\.com$ -(^|\.)martincartoons\.com$ -(^|\.)martsangkagyuofficial\.org$ -(^|\.)maruta\.be$ -(^|\.)marxist\.com$ -(^|\.)marxist\.net$ -(^|\.)marxists\.org$ -(^|\.)mash\.to$ -(^|\.)maskedip\.com$ -(^|\.)matainja\.com$ -(^|\.)material\.io$ -(^|\.)mathable\.io$ -(^|\.)mathiew-badimon\.com$ -(^|\.)matome-plus\.com$ -(^|\.)matome-plus\.net$ -(^|\.)matsushimakaede\.com$ -(^|\.)mattwilcox\.net$ -(^|\.)maturejp\.com$ -(^|\.)maxing\.jp$ -(^|\.)mayimayi\.com$ -(^|\.)mcadforums\.com$ -(^|\.)mcaf\.ee$ -(^|\.)mcfog\.com$ -(^|\.)mcreasite\.com$ -(^|\.)md-t\.org$ -(^|\.)me\.youthwant\.com\.tw$ -(^|\.)meansys\.com$ -(^|\.)media\.nu\.nl$ -(^|\.)media\.org\.hk$ -(^|\.)mediachinese\.com$ -(^|\.)mediafire\.com$ -(^|\.)mediafreakcity\.com$ -(^|\.)medium\.com$ -(^|\.)meetav\.com$ -(^|\.)meetup\.com$ -(^|\.)mefeedia\.com$ -(^|\.)mefound\.com$ -(^|\.)mega\.nz$ -(^|\.)megaproxy\.com$ -(^|\.)megarotic\.com$ -(^|\.)megavideo\.com$ -(^|\.)megurineluka\.com$ -(^|\.)meirixiaochao\.com$ -(^|\.)melon-peach\.com$ -(^|\.)meltoday\.com$ -(^|\.)meme\.yahoo\.com$ -(^|\.)memehk\.com$ -(^|\.)memorybbs\.com$ -(^|\.)memri\.org$ -(^|\.)memrijttm\.org$ -(^|\.)mercyprophet\.org$ -(^|\.)meridian-trust\.org$ -(^|\.)meripet\.biz$ -(^|\.)meripet\.com$ -(^|\.)merit-times\.com\.tw$ -(^|\.)meshrep\.com$ -(^|\.)mesotw\.com$ -(^|\.)messenger\.com$ -(^|\.)metacafe\.com$ -(^|\.)metarthunter\.com$ -(^|\.)meteorshowersonline\.com$ -(^|\.)metrohk\.com\.hk$ -(^|\.)metrolife\.ca$ -(^|\.)metroradio\.com\.hk$ -(^|\.)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$ -(^|\.)mike\.cz\.cc$ -(^|\.)mikesoltys\.com$ -(^|\.)milph\.net$ -(^|\.)milsurps\.com$ -(^|\.)mimiai\.net$ -(^|\.)mimivip\.com$ -(^|\.)mimivv\.com$ -(^|\.)mindrolling\.org$ -(^|\.)minghui-a\.org$ -(^|\.)minghui-b\.org$ -(^|\.)minghui-school\.org$ -(^|\.)minghui\.or\.kr$ -(^|\.)minghui\.org$ -(^|\.)minghuiyw\.wordpress\.com$ -(^|\.)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$ -(^|\.)mist\.vip$ -(^|\.)mitao\.com\.tw$ -(^|\.)mitbbs\.com$ -(^|\.)mitbbsau\.com$ -(^|\.)mixero\.com$ -(^|\.)mixpod\.com$ -(^|\.)mixx\.com$ -(^|\.)mizzmona\.com$ -(^|\.)mjib\.gov\.tw$ -(^|\.)mjlsh\.usc\.cuhk\.edu\.hk$ -(^|\.)mk5000\.com$ -(^|\.)mlcool\.com$ -(^|\.)mm-cg\.com$ -(^|\.)mmaaxx\.com$ -(^|\.)mmmca\.com$ -(^|\.)mnewstv\.com$ -(^|\.)mo\.nightlife141\.com$ -(^|\.)mobatek\.net$ -(^|\.)mobile01\.com$ -(^|\.)mobileways\.de$ -(^|\.)moby\.to$ -(^|\.)mobypicture\.com$ -(^|\.)moeaic\.gov\.tw$ -(^|\.)moeerolibrary\.com$ -(^|\.)mofaxiehui\.com$ -(^|\.)mofos\.com$ -(^|\.)mog\.com$ -(^|\.)mol\.gov\.tw$ -(^|\.)molihua\.org$ -(^|\.)mondex\.org$ -(^|\.)money-link\.com\.tw$ -(^|\.)moneyhome\.biz$ -(^|\.)monitorchina\.org$ -(^|\.)monster\.com$ -(^|\.)moodyz\.com$ -(^|\.)moonbbs\.com$ -(^|\.)morningsun\.org$ -(^|\.)moroneta\.com$ -(^|\.)mos\.ru$ -(^|\.)motherless\.com$ -(^|\.)motor4ik\.ru$ -(^|\.)mousebreaker\.com$ -(^|\.)movements\.org$ -(^|\.)moviefap\.com$ -(^|\.)mp3buscador\.com$ -(^|\.)mp3ye\.eu$ -(^|\.)mpettis\.com$ -(^|\.)mpfinance\.com$ -(^|\.)mpinews\.com$ -(^|\.)mponline\.hk$ -(^|\.)mqxd\.org$ -(^|\.)mrbasic\.com$ -(^|\.)mrbonus\.com$ -(^|\.)mrface\.com$ -(^|\.)mrslove\.com$ -(^|\.)mrtweet\.com$ -(^|\.)msguancha\.com$ -(^|\.)msha\.gov$ -(^|\.)mswe1\.org$ -(^|\.)mthruf\.com$ -(^|\.)mtw\.tl$ -(^|\.)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$ -(^|\.)mx\.hao123\.com$ -(^|\.)mx981\.com$ -(^|\.)my-formosa\.com$ -(^|\.)my-private-network\.co\.uk$ -(^|\.)my-proxy\.com$ -(^|\.)my\.mail\.ru$ -(^|\.)my\.opera\.com$ -(^|\.)my\.pcloud\.com$ -(^|\.)my03\.com$ -(^|\.)myactimes\.com$ -(^|\.)myanniu\.com$ -(^|\.)myaudiocast\.com$ -(^|\.)myav\.com\.tw$ -(^|\.)mybbs\.us$ -(^|\.)mybet\.com$ -(^|\.)myca168\.com$ -(^|\.)mycanadanow\.com$ -(^|\.)mychinamyhome\.com$ -(^|\.)mychinanet\.com$ -(^|\.)mychinanews\.com$ -(^|\.)mychinese\.news$ -(^|\.)mycnnews\.com$ -(^|\.)mycould\.com$ -(^|\.)mydad\.info$ -(^|\.)myddns\.com$ -(^|\.)myeasytv\.com$ -(^|\.)myeclipseide\.com$ -(^|\.)myforum\.com\.hk$ -(^|\.)myforum\.com\.uk$ -(^|\.)myfreecams\.com$ -(^|\.)myfreepaysite\.com$ -(^|\.)myfreshnet\.com$ -(^|\.)myftp\.info$ -(^|\.)myftp\.name$ -(^|\.)myiphide\.com$ -(^|\.)mykomica\.org$ -(^|\.)mylftv\.com$ -(^|\.)mymediarom\.com$ -(^|\.)mymoe\.moe$ -(^|\.)mymom\.info$ -(^|\.)mymusic\.net\.tw$ -(^|\.)mynetav\.net$ -(^|\.)mynetav\.org$ -(^|\.)mynumber\.org$ -(^|\.)myparagliding\.com$ -(^|\.)mypicture\.info$ -(^|\.)mypop3\.net$ -(^|\.)mypop3\.org$ -(^|\.)mypopescu\.com$ -(^|\.)myradio\.hk$ -(^|\.)myreadingmanga\.info$ -(^|\.)mysecondarydns\.com$ -(^|\.)myshare\.url\.com\.tw$ -(^|\.)mysinablog\.com$ -(^|\.)mysite\.verizon\.net$ -(^|\.)myspace\.com$ -(^|\.)myspacecdn\.com$ -(^|\.)mytalkbox\.com$ -(^|\.)mytizi\.com$ -(^|\.)mywww\.biz$ -(^|\.)myz\.info$ -(^|\.)naacoalition\.org$ -(^|\.)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$ -(^|\.)nat\.gov\.tw$ -(^|\.)nat\.moe$ -(^|\.)national-lottery\.co\.uk$ -(^|\.)nationsonline\.org$ -(^|\.)nationwide\.com$ -(^|\.)naughtyamerica\.com$ -(^|\.)navyfamily\.navy\.mil$ -(^|\.)navyreserve\.navy\.mil$ -(^|\.)naweeklytimes\.com$ -(^|\.)nbtvpn\.com$ -(^|\.)nccwatch\.org\.tw$ -(^|\.)nch\.com\.tw$ -(^|\.)ncn\.org$ -(^|\.)nde\.de$ -(^|\.)ndr\.de$ -(^|\.)ned\.org$ -(^|\.)nekoslovakia\.net$ -(^|\.)nemesis2\.qx\.net$ -(^|\.)neo-miracle\.com$ -(^|\.)nepusoku\.com$ -(^|\.)net-fits\.pro$ -(^|\.)netbirds\.com$ -(^|\.)netcolony\.com$ -(^|\.)netflix\.com$ -(^|\.)netme\.cc$ -(^|\.)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$ -(^|\.)newipnow\.com$ -(^|\.)newlandmagazine\.com\.au$ -(^|\.)newnews\.ca$ -(^|\.)news\.bbc\.co\.uk$ -(^|\.)news\.cnyes\.com$ -(^|\.)news\.hk\.msn\.com$ -(^|\.)news\.hkpeanut\.com$ -(^|\.)news\.msn\.com\.tw$ -(^|\.)news\.nationalgeographic\.com$ -(^|\.)news\.now\.com$ -(^|\.)news\.now\.com%2fhome$ -(^|\.)news\.omy\.sg$ -(^|\.)news\.seehua\.com$ -(^|\.)news\.sina\.com\.hk$ -(^|\.)news\.sina\.com\.tw$ -(^|\.)news\.sinchew\.com\.my$ -(^|\.)news\.singtao\.ca$ -(^|\.)news\.tvb\.com$ -(^|\.)news\.tvbs\.com\.tw$ -(^|\.)news\.yahoo\.com$ -(^|\.)news100\.com\.tw$ -(^|\.)newsancai\.com$ -(^|\.)newschinacomment\.org$ -(^|\.)newscn\.org$ -(^|\.)newsdetox\.ca$ -(^|\.)newsdh\.com$ -(^|\.)newsforums\.bbc\.co\.uk$ -(^|\.)newspeak\.cc$ -(^|\.)newstamago\.com$ -(^|\.)newstapa\.org$ -(^|\.)newstarnet\.com$ -(^|\.)newtaiwan\.com\.tw$ -(^|\.)newtalk\.tw$ -(^|\.)newyorktimes\.com$ -(^|\.)nexon\.com$ -(^|\.)next11\.co\.jp$ -(^|\.)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$ -(^|\.)nga\.mil$ -(^|\.)ngensis\.com$ -(^|\.)nhentai\.net$ -(^|\.)nhi\.gov\.tw$ -(^|\.)nhk-ondemand\.jp$ -(^|\.)nic\.cz\.cc$ -(^|\.)nic\.google$ -(^|\.)nic\.gov$ -(^|\.)nicovideo\.jp$ -(^|\.)nighost\.org$ -(^|\.)nikkei\.com$ -(^|\.)ninecommentaries\.com$ -(^|\.)ninjacloak\.com$ -(^|\.)ninjaproxy\.ninja$ -(^|\.)nintendium\.com$ -(^|\.)ninth\.biz$ -(^|\.)niusnews\.com$ -(^|\.)njactb\.org$ -(^|\.)njuice\.com$ -(^|\.)nko\.navy\.mil$ -(^|\.)nlfreevpn\.com$ -(^|\.)no-ip\.org$ -(^|\.)nobel\.se$ -(^|\.)nobelprize\.org$ -(^|\.)nobodycanstop\.us$ -(^|\.)nokogiri\.org$ -(^|\.)nokola\.com$ -(^|\.)noodlevpn\.com$ -(^|\.)norbulingka\.org$ -(^|\.)nordstrom\.com$ -(^|\.)nordstromimage\.com$ -(^|\.)nordstromrack\.com$ -(^|\.)nordvpn\.com$ -(^|\.)nottinghampost\.com$ -(^|\.)novelasia\.com$ -(^|\.)now\.im$ -(^|\.)nownews\.com$ -(^|\.)nowtorrents\.com$ -(^|\.)noypf\.com$ -(^|\.)npa\.go\.jp$ -(^|\.)npa\.gov\.tw$ -(^|\.)npnt\.me$ -(^|\.)nps\.gov$ -(^|\.)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\.cz$ -(^|\.)ntdtv\.org$ -(^|\.)ntdtv\.ru$ -(^|\.)ntdtvla\.com$ -(^|\.)ntrfun\.com$ -(^|\.)ntsna\.gov\.tw$ -(^|\.)nubiles\.net$ -(^|\.)nuexpo\.com$ -(^|\.)nukistream\.com$ -(^|\.)nurgo-software\.com$ -(^|\.)nusatrip\.com$ -(^|\.)nutaku\.net$ -(^|\.)nuuvem\.com$ -(^|\.)nuvid\.com$ -(^|\.)nuzcom\.com$ -(^|\.)nvdst\.com$ -(^|\.)nvquan\.org$ -(^|\.)nvtongzhisheng\.org$ -(^|\.)nwtca\.org$ -(^|\.)ny\.stgloballink\.com$ -(^|\.)ny\.visiontimes\.com$ -(^|\.)nyaa\.eu$ -(^|\.)nyaa\.si$ -(^|\.)nydus\.ca$ -(^|\.)nylon-angel\.com$ -(^|\.)nylonstockingsonline\.com$ -(^|\.)nyt\.com$ -(^|\.)nytchina\.com$ -(^|\.)nytcn\.me$ -(^|\.)nytco\.com$ -(^|\.)nyti\.ms$ -(^|\.)nytimes\.com$ -(^|\.)nytimes\.map\.fastly\.net$ -(^|\.)nytimg\.com$ -(^|\.)nytstyle\.com$ -(^|\.)nzchinese\.com$ -(^|\.)nzchinese\.net\.nz$ -(^|\.)observechina\.net$ -(^|\.)obutu\.com$ -(^|\.)ocaspro\.com$ -(^|\.)occupytiananmen\.com$ -(^|\.)oclp\.hk$ -(^|\.)ocreampies\.com$ -(^|\.)ocry\.com$ -(^|\.)october-review\.org$ -(^|\.)oculus\.com$ -(^|\.)oculuscdn\.com$ -(^|\.)offbeatchina\.com$ -(^|\.)officeoftibet\.com$ -(^|\.)ofile\.org$ -(^|\.)ogaoga\.org$ -(^|\.)ogate\.org$ -(^|\.)oikos\.com\.tw$ -(^|\.)oiktv\.com$ -(^|\.)oizoblog\.com$ -(^|\.)ok\.ru$ -(^|\.)okayfreedom\.com$ -(^|\.)okk\.tw$ -(^|\.)old-cat\.net$ -(^|\.)old\.honeynet\.org$ -(^|\.)old\.nabble\.com$ -(^|\.)olumpo\.com$ -(^|\.)olympicwatch\.org$ -(^|\.)omgili\.com$ -(^|\.)omni7\.jp$ -(^|\.)omnitalk\.com$ -(^|\.)omnitalk\.org$ -(^|\.)on\.cc$ -(^|\.)on2\.com$ -(^|\.)onapp\.com$ -(^|\.)onedrive\.live\.com$ -(^|\.)onedumb\.com$ -(^|\.)onion\.city$ -(^|\.)online\.recoveryversion\.org$ -(^|\.)onlinecha\.com$ -(^|\.)onlineyoutube\.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$ -(^|\.)openvpn\.net$ -(^|\.)openwebster\.com$ -(^|\.)openwrt\.org\.cn$ -(^|\.)opml\.radiotime\.com$ -(^|\.)organcare\.org\.tw$ -(^|\.)organharvestinvestigation\.net$ -(^|\.)organiccrap\.com$ -(^|\.)orgasm\.com$ -(^|\.)orgfree\.com$ -(^|\.)orient-doll\.com$ -(^|\.)orientaldaily\.com\.my$ -(^|\.)orn\.jp$ -(^|\.)orzistic\.org$ -(^|\.)osfoora\.com$ -(^|\.)otnd\.org$ -(^|\.)otto\.de$ -(^|\.)otzo\.com$ -(^|\.)ourdearamy\.com$ -(^|\.)ourhobby\.com$ -(^|\.)oursogo\.com$ -(^|\.)oursteps\.com\.au$ -(^|\.)oursweb\.net$ -(^|\.)ourtv\.hk$ -(^|\.)overplay\.net$ -(^|\.)oversea\.istarshine\.com$ -(^|\.)ow\.ly$ -(^|\.)owl\.li$ -(^|\.)oyax\.com$ -(^|\.)oyghan\.com$ -(^|\.)ozchinese\.com$ -(^|\.)ozvoice\.org$ -(^|\.)ozxw\.com$ -(^|\.)ozyoyo\.com$ -(^|\.)pachosting\.com$ -(^|\.)pacificpoker\.com$ -(^|\.)packages\.debian\.org$ -(^|\.)packetix\.net$ -(^|\.)pacopacomama\.com$ -(^|\.)padmanet\.com$ -(^|\.)page\.bid\.yahoo\.com$ -(^|\.)page2rss\.com$ -(^|\.)pagodabox\.com$ -(^|\.)palacemoon\.com$ -(^|\.)paldengyal\.com$ -(^|\.)paljorpublications\.com$ -(^|\.)paltalk\.com$ -(^|\.)panacom\.co\.jp$ -(^|\.)panamapapers\.sueddeutsche\.de$ -(^|\.)pandapow\.co$ -(^|\.)pandapow\.net$ -(^|\.)pandavpn-jp\.com$ -(^|\.)pandora\.com$ -(^|\.)pandora\.tv$ -(^|\.)pangci\.net$ -(^|\.)panluan\.net$ -(^|\.)panoramio\.com$ -(^|\.)pao-pao\.net$ -(^|\.)paper\.li$ -(^|\.)paperb\.us$ -(^|\.)paradisehill\.cc$ -(^|\.)paradisepoker\.com$ -(^|\.)parkansky\.com$ -(^|\.)partycasino\.com$ -(^|\.)partypoker\.com$ -(^|\.)passion\.com$ -(^|\.)passiontimes\.hk$ -(^|\.)pastebin\.com$ -(^|\.)pastie\.org$ -(^|\.)pbs\.org$ -(^|\.)pbwiki\.com$ -(^|\.)pbworks\.com$ -(^|\.)pbxes\.com$ -(^|\.)pbxes\.org$ -(^|\.)pcanywhere\.net$ -(^|\.)pcc\.gov\.tw$ -(^|\.)pcdvd\.com\.tw$ -(^|\.)pchome\.com\.tw$ -(^|\.)pcij\.org$ -(^|\.)pcstore\.com\.tw$ -(^|\.)pct\.org\.tw$ -(^|\.)pdetails\.com$ -(^|\.)pdproxy\.com$ -(^|\.)pds\.nasa\.gov$ -(^|\.)peace\.ca$ -(^|\.)peacefire\.org$ -(^|\.)peacehall\.com$ -(^|\.)pearlher\.org$ -(^|\.)peeasian\.com$ -(^|\.)pekingduck\.org$ -(^|\.)pemulihan\.or\.id$ -(^|\.)pen\.io$ -(^|\.)penchinese\.com$ -(^|\.)penchinese\.net$ -(^|\.)pengyulong\.com$ -(^|\.)penisbot\.com$ -(^|\.)penthouse\.com$ -(^|\.)pentoy\.hk$ -(^|\.)peoplebookcafe\.com$ -(^|\.)peoplenews\.tw$ -(^|\.)peopo\.org$ -(^|\.)percy\.in$ -(^|\.)perfectgirls\.net$ -(^|\.)perfectvpn\.net$ -(^|\.)periscope\.tv$ -(^|\.)persecutionblog\.com$ -(^|\.)persiankitty\.com$ -(^|\.)pfd\.org\.hk$ -(^|\.)phapluan\.org$ -(^|\.)phayul\.com$ -(^|\.)philborges\.com$ -(^|\.)philly\.com$ -(^|\.)phmsociety\.org$ -(^|\.)phncdn\.com$ -(^|\.)phobos\.apple\.com$ -(^|\.)phosphation13\.rssing\.com$ -(^|\.)photodharma\.net$ -(^|\.)photofocus\.com$ -(^|\.)phuquocservices\.com$ -(^|\.)picacomic\.com$ -(^|\.)picacomiccn\.com$ -(^|\.)picasaweb\.com$ -(^|\.)picidae\.net$ -(^|\.)pictures\.playboy\.com$ -(^|\.)picturesocial\.com$ -(^|\.)pin-cong\.com$ -(^|\.)pin6\.com$ -(^|\.)ping\.fm$ -(^|\.)pinimg\.com$ -(^|\.)pinkrod\.com$ -(^|\.)pinoy-n\.com$ -(^|\.)pinterest\.at$ -(^|\.)pinterest\.co\.kr$ -(^|\.)pinterest\.co\.uk$ -(^|\.)pinterest\.com$ -(^|\.)pinterest\.de$ -(^|\.)pinterest\.dk$ -(^|\.)pinterest\.fr$ -(^|\.)pinterest\.jp$ -(^|\.)pinterest\.nl$ -(^|\.)pinterest\.se$ -(^|\.)pioneer-worker\.forums-free\.com$ -(^|\.)pipii\.tv$ -(^|\.)piposay\.com$ -(^|\.)piraattilahti\.org$ -(^|\.)piring\.com$ -(^|\.)pixelqi\.com$ -(^|\.)pixiv\.net$ -(^|\.)pixnet\.net$ -(^|\.)pk\.com$ -(^|\.)placemix\.com$ -(^|\.)playboy\.com$ -(^|\.)playboyplus\.com$ -(^|\.)player\.fm$ -(^|\.)playno1\.com$ -(^|\.)playpcesor\.com$ -(^|\.)plays\.com\.tw$ -(^|\.)plm\.org\.hk$ -(^|\.)plunder\.com$ -(^|\.)plus28\.com$ -(^|\.)plusbb\.com$ -(^|\.)pmatehunter\.com$ -(^|\.)pmates\.com$ -(^|\.)po2b\.com$ -(^|\.)pobieramy\.top$ -(^|\.)podictionary\.com$ -(^|\.)pokerstars\.net$ -(^|\.)politicalchina\.org$ -(^|\.)politicalconsultation\.org$ -(^|\.)poloniex\.com$ -(^|\.)polymer-project\.org$ -(^|\.)polymerhk\.com$ -(^|\.)popo\.tw$ -(^|\.)popvote\.hk$ -(^|\.)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$ -(^|\.)potvpn\.com$ -(^|\.)power\.com$ -(^|\.)powerapple\.com$ -(^|\.)powercx\.com$ -(^|\.)powerphoto\.org$ -(^|\.)prayforchina\.net$ -(^|\.)premeforwindows7\.com$ -(^|\.)presentationzen\.com$ -(^|\.)presidentlee\.tw$ -(^|\.)prestige-av\.com$ -(^|\.)prisoner-state-secret-journal-premier$ -(^|\.)prisoneralert\.com$ -(^|\.)pritunl\.com$ -(^|\.)privacybox\.de$ -(^|\.)private\.com$ -(^|\.)privateinternetaccess\.com$ -(^|\.)privatepaste\.com$ -(^|\.)privatetunnel\.com$ -(^|\.)privatevpn\.com$ -(^|\.)procopytips\.com$ -(^|\.)prosiben\.de$ -(^|\.)provideocoalition\.com$ -(^|\.)provpnaccounts\.com$ -(^|\.)proxfree\.com$ -(^|\.)proxifier\.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$ -(^|\.)psiphon\.ca$ -(^|\.)psiphon\.civisec\.org$ -(^|\.)psiphon3\.com$ -(^|\.)psiphontoday\.com$ -(^|\.)pts\.org\.tw$ -(^|\.)ptt\.cc$ -(^|\.)pttvan\.org$ -(^|\.)pubu\.com\.tw$ -(^|\.)puffinbrowser\.com$ -(^|\.)puffstore\.com$ -(^|\.)pullfolio\.com$ -(^|\.)pulse\.yahoo\.com$ -(^|\.)punyu\.com$ -(^|\.)pure18\.com$ -(^|\.)pureconcepts\.net$ -(^|\.)pureinsight\.org$ -(^|\.)purepdf\.com$ -(^|\.)purevpn\.com$ -(^|\.)purplelotus\.org$ -(^|\.)pursuestar\.com$ -(^|\.)pushchinawall\.com$ -(^|\.)pussyspace\.com$ -(^|\.)putihome\.org$ -(^|\.)putlocker\.com$ -(^|\.)putty\.org$ -(^|\.)puuko\.com$ -(^|\.)pwned\.com$ -(^|\.)python\.com$ -(^|\.)python\.com\.tw$ -(^|\.)pythonhackers\.com$ -(^|\.)q%3dfreedom$ -(^|\.)q%3dtriangle$ -(^|\.)q=freedom$ -(^|\.)q=triangle$ -(^|\.)qanote\.com$ -(^|\.)qgirl\.com\.tw$ -(^|\.)qhigh\.com$ -(^|\.)qi-gong\.me$ -(^|\.)qiandao\.today$ -(^|\.)qiangyou\.org$ -(^|\.)qidian\.ca$ -(^|\.)qienkuen\.org$ -(^|\.)qiwen\.lu$ -(^|\.)qixianglu\.cn$ -(^|\.)qkshare\.com$ -(^|\.)qoos\.com$ -(^|\.)qpoe\.com$ -(^|\.)qq\.co\.za$ -(^|\.)qstatus\.com$ -(^|\.)qtrac\.eu$ -(^|\.)qtweeter\.com$ -(^|\.)quannengshen\.org$ -(^|\.)quantumbooter\.net$ -(^|\.)questvisual\.com$ -(^|\.)quitccp\.net$ -(^|\.)quitccp\.org$ -(^|\.)quora\.com$ -(^|\.)quran\.com$ -(^|\.)quranexplorer\.com$ -(^|\.)qusi8\.net$ -(^|\.)qvodzy\.org$ -(^|\.)qxbbs\.org$ -(^|\.)r18\.com$ -(^|\.)ra\.gg$ -(^|\.)radicalparty\.org$ -(^|\.)radiko\.jp$ -(^|\.)radioaustralia\.net\.au$ -(^|\.)radiohilight\.net$ -(^|\.)radiovaticana\.org$ -(^|\.)radiovncr\.com$ -(^|\.)rael\.org$ -(^|\.)raggedbanner\.com$ -(^|\.)raidcall\.com\.tw$ -(^|\.)raidtalk\.com\.tw$ -(^|\.)rainbowplan\.org$ -(^|\.)raizoji\.or\.jp$ -(^|\.)ramcity\.com\.au$ -(^|\.)rangwang\.biz$ -(^|\.)rangzen\.com$ -(^|\.)rangzen\.net$ -(^|\.)rangzen\.org$ -(^|\.)ranyunfei\.com$ -(^|\.)rapbull\.net$ -(^|\.)rapidgator\.net$ -(^|\.)rapidmoviez\.com$ -(^|\.)rapidvpn\.com$ -(^|\.)raremovie\.cc$ -(^|\.)raremovie\.net$ -(^|\.)rawgit\.com$ -(^|\.)rawgithub\.com$ -(^|\.)razyboard\.com$ -(^|\.)rcinet\.ca$ -(^|\.)rconversation\.blogs\.com$ -(^|\.)rd\.com$ -(^|\.)rdio\.com$ -(^|\.)read01\.com$ -(^|\.)read100\.com$ -(^|\.)readingtimes\.com\.tw$ -(^|\.)readmoo\.com$ -(^|\.)readydown\.com$ -(^|\.)realcourage\.org$ -(^|\.)realforum\.zkiz\.com$ -(^|\.)realitykings\.com$ -(^|\.)realraptalk\.com$ -(^|\.)realsexpass\.com$ -(^|\.)rebatesrule\.net$ -(^|\.)recordhistory\.org$ -(^|\.)recovery\.org\.tw$ -(^|\.)recoveryversion\.com\.tw$ -(^|\.)red-lang\.org$ -(^|\.)redballoonsolidarity\.org$ -(^|\.)redchinacn\.net$ -(^|\.)redchinacn\.org$ -(^|\.)redhotlabs\.com$ -(^|\.)redtube\.com$ -(^|\.)referer\.us$ -(^|\.)reflectivecode\.com$ -(^|\.)registry\.google$ -(^|\.)relaxbbs\.com$ -(^|\.)relay\.com\.tw$ -(^|\.)releaseinternational\.org$ -(^|\.)religioustolerance\.org$ -(^|\.)remembering_tiananmen_20_years$ -(^|\.)renminbao\.com$ -(^|\.)renyurenquan\.org$ -(^|\.)research\.jmsc\.hku\.hk$ -(^|\.)resilio\.com$ -(^|\.)retweeteffect\.com$ -(^|\.)retweetist\.com$ -(^|\.)retweetrank\.com$ -(^|\.)reuters\.com$ -(^|\.)reutersmedia\.net$ -(^|\.)revleft\.com$ -(^|\.)revver\.com$ -(^|\.)rfa\.org$ -(^|\.)rfachina\.com$ -(^|\.)rfamobile\.org$ -(^|\.)rfaweb\.org$ -(^|\.)rferl\.org$ -(^|\.)rfi\.fr$ -(^|\.)rfi\.my$ -(^|\.)rigpa\.org$ -(^|\.)riku\.me$ -(^|\.)rileyguide\.com$ -(^|\.)ritouki\.jp$ -(^|\.)ritter\.vg$ -(^|\.)rlwlw\.com$ -(^|\.)rmjdw\.com$ -(^|\.)rmjdw132\.info$ -(^|\.)roadshow\.hk$ -(^|\.)roboforex\.com$ -(^|\.)robustnessiskey\.com$ -(^|\.)rocket-inc\.net$ -(^|\.)rocksdb\.org$ -(^|\.)rojo\.com$ -(^|\.)rolia\.net$ -(^|\.)ronjoneswriter\.com$ -(^|\.)roodo\.com$ -(^|\.)rosechina\.net$ -(^|\.)rotten\.com$ -(^|\.)rsf-chinese\.org$ -(^|\.)rsf\.org$ -(^|\.)rsgamen\.org$ -(^|\.)rssmeme\.com$ -(^|\.)rtalabel\.org$ -(^|\.)rthk\.hk$ -(^|\.)rthk\.org\.hk$ -(^|\.)rti\.org\.tw$ -(^|\.)rtycminnesota\.org$ -(^|\.)ruanyifeng\.com$ -(^|\.)rukor\.org$ -(^|\.)rushbee\.com$ -(^|\.)ruten\.com\.tw$ -(^|\.)rutube\.ru$ -(^|\.)ruyiseek\.com$ -(^|\.)rxhj\.net$ -(^|\.)s-cute\.com$ -(^|\.)s-dragon\.org$ -(^|\.)s1\.nudezz\.com$ -(^|\.)s1heng\.com$ -(^|\.)s1s1s1\.com$ -(^|\.)s3-ap-northeast-1\.amazonaws\.com$ -(^|\.)s3-ap-southeast-2\.amazonaws\.com$ -(^|\.)s8forum\.com$ -(^|\.)sa\.hao123\.com$ -(^|\.)sacks\.com$ -(^|\.)sacom\.hk$ -(^|\.)sadistic-v\.com$ -(^|\.)sadpanda\.us$ -(^|\.)safervpn\.com$ -(^|\.)saintyculture\.com$ -(^|\.)saiq\.me$ -(^|\.)sakuralive\.com$ -(^|\.)sakya\.org$ -(^|\.)salvation\.org\.hk$ -(^|\.)samair\.ru$ -(^|\.)sambhota\.org$ -(^|\.)sanmin\.com\.tw$ -(^|\.)sapikachu\.net$ -(^|\.)saveliuxiaobo\.com$ -(^|\.)savemedia\.com$ -(^|\.)savethedate\.foo$ -(^|\.)savetibet\.de$ -(^|\.)savetibet\.fr$ -(^|\.)savetibet\.nl$ -(^|\.)savetibet\.org$ -(^|\.)savetibet\.ru$ -(^|\.)savetibetstore\.org$ -(^|\.)savevid\.com$ -(^|\.)say2\.info$ -(^|\.)sbme\.me$ -(^|\.)sbs\.com\.au$ -(^|\.)scasino\.com$ -(^|\.)schema\.org$ -(^|\.)sciencenets\.com$ -(^|\.)scieron\.com$ -(^|\.)scmp\.com$ -(^|\.)scmpchinese\.com$ -(^|\.)scramble\.io$ -(^|\.)scribd\.com$ -(^|\.)scriptspot\.com$ -(^|\.)seapuff\.com$ -(^|\.)search$ -(^|\.)search\.aol\.com$ -(^|\.)search\.yahoo\.co\.jp$ -(^|\.)searchtruth\.com$ -(^|\.)secretchina\.com$ -(^|\.)secretgarden\.no$ -(^|\.)secretsline\.biz$ -(^|\.)secure\.hustler\.com$ -(^|\.)secure\.logmein\.com$ -(^|\.)secure\.raxcdn\.com$ -(^|\.)securetunnel\.com$ -(^|\.)securitykiss\.com$ -(^|\.)seed4\.me$ -(^|\.)seesmic\.com$ -(^|\.)seevpn\.com$ -(^|\.)seezone\.net$ -(^|\.)sejie\.com$ -(^|\.)sellclassics\.com$ -(^|\.)sendsmtp\.com$ -(^|\.)sendspace\.com$ -(^|\.)servehttp\.com$ -(^|\.)serveuser\.com$ -(^|\.)serveusers\.com$ -(^|\.)sesawe\.net$ -(^|\.)sesawe\.org$ -(^|\.)sethwklein\.net$ -(^|\.)setn\.com$ -(^|\.)settv\.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$ -(^|\.)sfileydy\.com$ -(^|\.)sfshibao\.com$ -(^|\.)sftindia\.org$ -(^|\.)sftuk\.org$ -(^|\.)shadeyouvpn\.com$ -(^|\.)shadow\.ma$ -(^|\.)shadowsky\.xyz$ -(^|\.)shadowsocks-r\.com$ -(^|\.)shadowsocks\.asia$ -(^|\.)shadowsocks\.com$ -(^|\.)shadowsocks\.com\.hk$ -(^|\.)shadowsocks\.org$ -(^|\.)shadowsocks9\.com$ -(^|\.)shambalapost\.com$ -(^|\.)shambhalasun\.com$ -(^|\.)shangfang\.org$ -(^|\.)shapeservices\.com$ -(^|\.)share\.dmhy\.org$ -(^|\.)share\.ovi\.com$ -(^|\.)share\.youthwant\.com\.tw$ -(^|\.)sharebee\.com$ -(^|\.)sharecool\.org$ -(^|\.)sharpdaily\.com\.hk$ -(^|\.)sharpdaily\.hk$ -(^|\.)sharpdaily\.tw$ -(^|\.)shat-tibet\.com$ -(^|\.)shattered\.io$ -(^|\.)sheikyermami\.com$ -(^|\.)shellfire\.de$ -(^|\.)shenshou\.org$ -(^|\.)shenyun\.com$ -(^|\.)shenyunperformingarts\.org$ -(^|\.)shenzhoufilm\.com$ -(^|\.)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$ -(^|\.)shopping\.com$ -(^|\.)showbiz\.omy\.sg$ -(^|\.)showhaotu\.com$ -(^|\.)showtime\.jp$ -(^|\.)shutterstock\.com$ -(^|\.)shwchurch\.org$ -(^|\.)shwchurch3\.com$ -(^|\.)siddharthasintent\.org$ -(^|\.)sidelinesnews\.com$ -(^|\.)sidelinessportseatery\.com$ -(^|\.)sierrafriendsoftibet\.org$ -(^|\.)sijihuisuo\.club$ -(^|\.)sijihuisuo\.com$ -(^|\.)silkbook\.com$ -(^|\.)simbolostwitter\.com$ -(^|\.)simplecd\.org$ -(^|\.)simpleproductivityblog\.com$ -(^|\.)sinchew\.com\.my$ -(^|\.)singaporepools\.com\.sg$ -(^|\.)singfortibet\.com$ -(^|\.)singpao\.com\.hk$ -(^|\.)singtao\.com$ -(^|\.)singtaousa\.com$ -(^|\.)sino-monthly\.com$ -(^|\.)sinoants\.com$ -(^|\.)sinocast\.com$ -(^|\.)sinocism\.com$ -(^|\.)sinomontreal\.ca$ -(^|\.)sinonet\.ca$ -(^|\.)sinopitt\.info$ -(^|\.)sinoquebec\.com$ -(^|\.)sipml5\.org$ -(^|\.)sis\.xxx$ -(^|\.)sis001\.com$ -(^|\.)sis001\.us$ -(^|\.)site90\.net$ -(^|\.)sitebro\.tw$ -(^|\.)sitekreator\.com$ -(^|\.)siteks\.uk\.to$ -(^|\.)sitemaps\.org$ -(^|\.)sixth\.biz$ -(^|\.)sjrt\.org$ -(^|\.)sjum\.cn$ -(^|\.)sketchappsources\.com$ -(^|\.)skimtube\.com$ -(^|\.)skybet\.com$ -(^|\.)skyking\.com\.tw$ -(^|\.)skyvegas\.com$ -(^|\.)skyxvpn\.com$ -(^|\.)slacker\.com$ -(^|\.)slaytizle\.com$ -(^|\.)sleazydream\.com$ -(^|\.)slheng\.com$ -(^|\.)slickvpn\.com$ -(^|\.)slideshare\.net$ -(^|\.)slinkset\.com$ -(^|\.)slutload\.com$ -(^|\.)slutmoonbeam\.com$ -(^|\.)slyip\.com$ -(^|\.)slyip\.net$ -(^|\.)sm-miracle\.com$ -(^|\.)smartdnsproxy\.com$ -(^|\.)smarthide\.com$ -(^|\.)smchbooks\.com$ -(^|\.)smh\.com\.au$ -(^|\.)smhric\.org$ -(^|\.)smith\.edu$ -(^|\.)smyxy\.org$ -(^|\.)snapchat\.com$ -(^|\.)snaptu\.com$ -(^|\.)sndcdn\.com$ -(^|\.)sneakme\.net$ -(^|\.)snowlionpub\.com$ -(^|\.)sobees\.com$ -(^|\.)soc\.mil$ -(^|\.)socialwhale\.com$ -(^|\.)sockscap64\.com$ -(^|\.)sockslist\.net$ -(^|\.)socrec\.org$ -(^|\.)sod\.co\.jp$ -(^|\.)sodatea\.github\.io$ -(^|\.)softether-download\.com$ -(^|\.)softether\.co\.jp$ -(^|\.)softether\.org$ -(^|\.)softwarebychuck\.com$ -(^|\.)softwaredownload\.gitbooks\.io$ -(^|\.)sogclub\.com$ -(^|\.)sogrady\.me$ -(^|\.)soh\.tw$ -(^|\.)sohcradio\.com$ -(^|\.)sohfrance\.org$ -(^|\.)sokamonline\.com$ -(^|\.)sokmil\.com$ -(^|\.)solarsystem\.nasa\.gov$ -(^|\.)solidaritetibet\.org$ -(^|\.)solidfiles\.com$ -(^|\.)somee\.com$ -(^|\.)songjianjun\.com$ -(^|\.)sonicbbs\.cc$ -(^|\.)sonidodelaesperanza\.org$ -(^|\.)sopcast\.com$ -(^|\.)sopcast\.org$ -(^|\.)sorazone\.net$ -(^|\.)sorting-algorithms\.com$ -(^|\.)sos\.org$ -(^|\.)sosreader\.com$ -(^|\.)sostibet\.org$ -(^|\.)soubory\.com$ -(^|\.)soul-plus\.net$ -(^|\.)soulcaliburhentai\.net$ -(^|\.)soumo\.info$ -(^|\.)soundcloud\.com$ -(^|\.)soundofhope\.kr$ -(^|\.)soundofhope\.org$ -(^|\.)soup\.io$ -(^|\.)soupofmedia\.com$ -(^|\.)sourceforge\.net$ -(^|\.)sourcewadio\.com$ -(^|\.)southnews\.com\.tw$ -(^|\.)sowers\.org\.hk$ -(^|\.)spankbang\.com$ -(^|\.)spankingtube\.com$ -(^|\.)spankwire\.com$ -(^|\.)spb\.com$ -(^|\.)speakerdeck\.com$ -(^|\.)specxinzl\.jigsy\.com$ -(^|\.)speedify\.com$ -(^|\.)spem\.at$ -(^|\.)spencertipping\.com$ -(^|\.)spicevpn\.com$ -(^|\.)spideroak\.com$ -(^|\.)spike\.com$ -(^|\.)sports\.williamhill\.com$ -(^|\.)spotflux\.com$ -(^|\.)spotify\.com$ -(^|\.)spreadshirt\.es$ -(^|\.)spring4u\.info$ -(^|\.)springboardplatform\.com$ -(^|\.)sprite\.org$ -(^|\.)sproutcore\.com$ -(^|\.)sproxy\.info$ -(^|\.)squirly\.info$ -(^|\.)srcf\.ucam\.org$ -(^|\.)srocket\.us$ -(^|\.)ss-link\.com$ -(^|\.)ss\.carryzhou\.com$ -(^|\.)ss\.levyhsu\.com$ -(^|\.)ssglobal\.co$ -(^|\.)ssglobal\.me$ -(^|\.)ssh91\.com$ -(^|\.)ssl\.webpack\.de$ -(^|\.)ssl443\.org$ -(^|\.)sspro\.ml$ -(^|\.)sss\.camp$ -(^|\.)sstmlt\.moe$ -(^|\.)sstmlt\.net$ -(^|\.)stackoverflow\.com$ -(^|\.)stage64\.hk$ -(^|\.)standupfortibet\.org$ -(^|\.)stanford\.edu$ -(^|\.)starfishfx\.com$ -(^|\.)starp2p\.com$ -(^|\.)startpage\.com$ -(^|\.)startuplivingchina\.com$ -(^|\.)stat\.gov\.tw$ -(^|\.)static-economist\.com$ -(^|\.)static\.comico\.tw$ -(^|\.)static01\.nyt\.com$ -(^|\.)staticflickr\.com$ -(^|\.)statueofdemocracy\.org$ -(^|\.)stc\.com\.sa$ -(^|\.)steamcommunity\.com$ -(^|\.)steel-storm\.com$ -(^|\.)steganos\.com$ -(^|\.)steganos\.net$ -(^|\.)stepchina\.com$ -(^|\.)stephaniered\.com$ -(^|\.)sthoo\.com$ -(^|\.)stickam\.com$ -(^|\.)stickeraction\.com$ -(^|\.)stileproject\.com$ -(^|\.)sto\.cc$ -(^|\.)stoporganharvesting\.org$ -(^|\.)stoptibetcrisis\.net$ -(^|\.)storagenewsletter\.com$ -(^|\.)store\.steampowered\.com$ -(^|\.)stories\.google$ -(^|\.)storify\.com$ -(^|\.)storm\.mg$ -(^|\.)stormmediagroup\.com$ -(^|\.)stoweboyd\.com$ -(^|\.)stranabg\.com$ -(^|\.)straplessdildo\.com$ -(^|\.)streamingthe\.net$ -(^|\.)streema\.com$ -(^|\.)strikingly\.com$ -(^|\.)strongvpn\.com$ -(^|\.)strongwindpress\.com$ -(^|\.)student\.tw$ -(^|\.)studentsforafreetibet\.org$ -(^|\.)stumbleupon\.com$ -(^|\.)stupidvideos\.com$ -(^|\.)subacme\.rerouted\.org$ -(^|\.)successfn\.com$ -(^|\.)sugarsync\.com$ -(^|\.)sugobbs\.com$ -(^|\.)sugumiru18\.com$ -(^|\.)suissl\.com$ -(^|\.)sujiatun\.wordpress\.com$ -(^|\.)sulian\.me$ -(^|\.)summify\.com$ -(^|\.)sumrando\.com$ -(^|\.)sun1911\.com$ -(^|\.)sunmedia\.ca$ -(^|\.)sunporno\.com$ -(^|\.)sunskyforum\.com$ -(^|\.)sunta\.com\.tw$ -(^|\.)sunvpn\.net$ -(^|\.)sunwinism\.joinbbs\.net$ -(^|\.)suoluo\.org$ -(^|\.)superfreevpn\.com$ -(^|\.)superokayama\.com$ -(^|\.)superpages\.com$ -(^|\.)supervpn\.net$ -(^|\.)suppig\.net$ -(^|\.)suprememastertv\.com$ -(^|\.)surfeasy\.com$ -(^|\.)surfeasy\.com\.au$ -(^|\.)suroot\.com$ -(^|\.)surrenderat20\.net$ -(^|\.)suyangg\.com$ -(^|\.)svsfx\.com$ -(^|\.)swagbucks\.com$ -(^|\.)swissvpn\.net$ -(^|\.)switch1\.jp$ -(^|\.)switchvpn\.net$ -(^|\.)sydneytoday\.com$ -(^|\.)sylfoundation\.org$ -(^|\.)syncback\.com$ -(^|\.)synergyse\.com$ -(^|\.)sysresccd\.org$ -(^|\.)sytes\.net$ -(^|\.)szbbs\.net$ -(^|\.)szetowah\.org\.hk$ -(^|\.)t-g\.com$ -(^|\.)t\.co$ -(^|\.)t\.me$ -(^|\.)t\.orzdream\.com$ -(^|\.)t35\.com$ -(^|\.)t66y\.com$ -(^|\.)taa-usa\.org$ -(^|\.)taaze\.tw$ -(^|\.)tabtter\.jp$ -(^|\.)tacc\.cwb\.gov\.tw$ -(^|\.)tacem\.org$ -(^|\.)taconet\.com\.tw$ -(^|\.)taedp\.org\.tw$ -(^|\.)tafm\.org$ -(^|\.)tagwa\.org\.au$ -(^|\.)tagwalk\.com$ -(^|\.)tahr\.org\.tw$ -(^|\.)taipei\.gov\.tw$ -(^|\.)taipeisociety\.org$ -(^|\.)taiwan-sex\.com$ -(^|\.)taiwanbible\.com$ -(^|\.)taiwancon\.com$ -(^|\.)taiwandaily\.net$ -(^|\.)taiwandc\.org$ -(^|\.)taiwanjobs\.gov\.tw$ -(^|\.)taiwanjustice\.com$ -(^|\.)taiwankiss\.com$ -(^|\.)taiwannation\.50webs\.com$ -(^|\.)taiwannation\.com$ -(^|\.)taiwannation\.com\.tw$ -(^|\.)taiwanncf\.org\.tw$ -(^|\.)taiwannews\.com\.tw$ -(^|\.)taiwantp\.net$ -(^|\.)taiwantt\.org\.tw$ -(^|\.)taiwanus\.net$ -(^|\.)taiwanyes\.com$ -(^|\.)taiwanyes\.ning\.com$ -(^|\.)talk853\.com$ -(^|\.)talkboxapp\.com$ -(^|\.)talkonly\.net$ -(^|\.)tamiaode\.tk$ -(^|\.)tanc\.org$ -(^|\.)tangben\.com$ -(^|\.)tangren\.us$ -(^|\.)taoism\.net$ -(^|\.)taolun\.info$ -(^|\.)tapanwap\.com$ -(^|\.)tapatalk\.com$ -(^|\.)tarr\.uspto\.gov$ -(^|\.)tascn\.com\.au$ -(^|\.)taup\.net$ -(^|\.)taweet\.com$ -(^|\.)tbcollege\.org$ -(^|\.)tbi\.org\.hk$ -(^|\.)tbicn\.org$ -(^|\.)tbjyt\.org$ -(^|\.)tbpic\.info$ -(^|\.)tbrc\.org$ -(^|\.)tbs-rainbow\.org$ -(^|\.)tbsec\.org$ -(^|\.)tbskkinabalu\.page\.tl$ -(^|\.)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$ -(^|\.)teachparentstech\.org$ -(^|\.)teamamericany\.com$ -(^|\.)tech2\.in\.com$ -(^|\.)teck\.in$ -(^|\.)teeniefuck\.net$ -(^|\.)teensinasia\.com$ -(^|\.)telecomspace\.com$ -(^|\.)telegram\.dog$ -(^|\.)telegram\.me$ -(^|\.)telegram\.org$ -(^|\.)telegramdownload\.com$ -(^|\.)telegraph\.co\.uk$ -(^|\.)telesco\.pe$ -(^|\.)tellme\.pw$ -(^|\.)tenacy\.com$ -(^|\.)tensorflow\.org$ -(^|\.)tenzinpalmo\.com$ -(^|\.)tew\.org$ -(^|\.)th\.hao123\.com$ -(^|\.)thaicn\.com$ -(^|\.)thb\.gov\.tw$ -(^|\.)theatrum-belli\.com$ -(^|\.)thebcomplex\.com$ -(^|\.)theblemish\.com$ -(^|\.)thebobs\.com$ -(^|\.)thebodyshop-usa\.com$ -(^|\.)thecenter\.mit\.edu$ -(^|\.)thechinabeat\.org$ -(^|\.)thedalailamamovie\.com$ -(^|\.)thedw\.us$ -(^|\.)thefacebook\.com$ -(^|\.)thefrontier\.hk$ -(^|\.)thegioitinhoc\.vn$ -(^|\.)thegly\.com$ -(^|\.)thehots\.info$ -(^|\.)thehousenews\.com$ -(^|\.)thehun\.net$ -(^|\.)theinitium\.com$ -(^|\.)thenewslens\.com$ -(^|\.)thepiratebay\.org$ -(^|\.)theportalwiki\.com$ -(^|\.)thereallove\.kr$ -(^|\.)therock\.net\.nz$ -(^|\.)thespeeder\.com$ -(^|\.)thestandnews\.com$ -(^|\.)thetibetcenter\.org$ -(^|\.)thetibetconnection\.org$ -(^|\.)thetibetmuseum\.org$ -(^|\.)thetibetpost\.com$ -(^|\.)thetinhat\.com$ -(^|\.)thetrotskymovie\.com$ -(^|\.)thevivekspot\.com$ -(^|\.)thewgo\.org$ -(^|\.)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-info\.net$ -(^|\.)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$ -(^|\.)tibetanfeministcollective\.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$ -(^|\.)tibetlibre\.free\.fr$ -(^|\.)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$ -(^|\.)tiltbrush\.com$ -(^|\.)timdir\.com$ -(^|\.)time\.com$ -(^|\.)times\.hinet\.net$ -(^|\.)timesofindia\.indiatimes\.com$ -(^|\.)timsah\.com$ -(^|\.)tintuc101\.com$ -(^|\.)tiny\.cc$ -(^|\.)tinychat\.com$ -(^|\.)tinypaste\.com$ -(^|\.)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$ -(^|\.)tongil\.or\.kr$ -(^|\.)tono-oka\.jp$ -(^|\.)tonyyan\.net$ -(^|\.)toodoc\.com$ -(^|\.)toonel\.net$ -(^|\.)top\.tv$ -(^|\.)top81\.ws$ -(^|\.)topic\.youthwant\.com\.tw$ -(^|\.)topnews\.in$ -(^|\.)toppornsites\.com$ -(^|\.)topshareware\.com$ -(^|\.)topsy\.com$ -(^|\.)toptip\.ca$ -(^|\.)tor\.blingblingsquad\.net$ -(^|\.)tor\.cn\.uptodown\.com$ -(^|\.)tor\.updatestar\.com$ -(^|\.)tora\.to$ -(^|\.)torcn\.com$ -(^|\.)torguard\.net$ -(^|\.)torproject\.org$ -(^|\.)torrentprivacy\.com$ -(^|\.)torrentproject\.se$ -(^|\.)torrenty\.org$ -(^|\.)torrentz\.eu$ -(^|\.)torvpn\.com$ -(^|\.)tosh\.comedycentral\.com$ -(^|\.)totalvpn\.com$ -(^|\.)toutiaoabc\.com$ -(^|\.)towngain\.com$ -(^|\.)toypark\.in$ -(^|\.)toythieves\.com$ -(^|\.)toytractorshow\.com$ -(^|\.)tparents\.org$ -(^|\.)tpi\.org\.tw$ -(^|\.)tracfone\.com$ -(^|\.)traffichaus\.com$ -(^|\.)trans\.wenweipo\.com$ -(^|\.)transparency\.org$ -(^|\.)treemall\.com\.tw$ -(^|\.)trendsmap\.com$ -(^|\.)trialofccp\.org$ -(^|\.)trickip\.net$ -(^|\.)trickip\.org$ -(^|\.)trimondi\.de$ -(^|\.)trouw\.nl$ -(^|\.)trt\.net\.tr$ -(^|\.)trtc\.com\.tw$ -(^|\.)truebuddha-md\.org$ -(^|\.)trulyergonomic\.com$ -(^|\.)truth101\.co\.tv$ -(^|\.)truthontour\.org$ -(^|\.)truveo\.com$ -(^|\.)tryheart\.jp$ -(^|\.)tsctv\.net$ -(^|\.)tsdr\.uspto\.gov$ -(^|\.)tsemtulku\.com$ -(^|\.)tsquare\.tv$ -(^|\.)tsu\.org\.tw$ -(^|\.)tsunagarumon\.com$ -(^|\.)tt-rss\.org$ -(^|\.)tt1069\.com$ -(^|\.)tttan\.com$ -(^|\.)tu8964\.com$ -(^|\.)tubaholic\.com$ -(^|\.)tube\.com$ -(^|\.)tube8\.com$ -(^|\.)tube911\.com$ -(^|\.)tubecup\.com$ -(^|\.)tubegals\.com$ -(^|\.)tubeislam\.com$ -(^|\.)tubestack\.com$ -(^|\.)tubewolf\.com$ -(^|\.)tui\.orzdream\.com$ -(^|\.)tuibeitu\.net$ -(^|\.)tuidang\.net$ -(^|\.)tuidang\.org$ -(^|\.)tuidang\.se$ -(^|\.)tuitwit\.com$ -(^|\.)tumblr\.com$ -(^|\.)tumutanzi\.com$ -(^|\.)tumview\.com$ -(^|\.)tunein\.com$ -(^|\.)tunnelbear\.com$ -(^|\.)tunnelr\.com$ -(^|\.)tuo8\.blue$ -(^|\.)tuo8\.cc$ -(^|\.)tuo8\.club$ -(^|\.)tuo8\.fit$ -(^|\.)tuo8\.hk$ -(^|\.)tuo8\.in$ -(^|\.)tuo8\.ninja$ -(^|\.)tuo8\.org$ -(^|\.)tuo8\.pw$ -(^|\.)tuo8\.red$ -(^|\.)tuo8\.space$ -(^|\.)turansam\.org$ -(^|\.)turbobit\.net$ -(^|\.)turbohide\.com$ -(^|\.)turbotwitter\.com$ -(^|\.)turntable\.fm$ -(^|\.)tushycash\.com$ -(^|\.)tuvpn\.com$ -(^|\.)tuzaijidi\.com$ -(^|\.)tv\.com$ -(^|\.)tvants\.com$ -(^|\.)tvboxnow\.com$ -(^|\.)tvider\.com$ -(^|\.)tvmost\.com\.hk$ -(^|\.)tvplayvideos\.com$ -(^|\.)tvunetworks\.com$ -(^|\.)tw-blog\.com$ -(^|\.)tw-npo\.org$ -(^|\.)tw\.answers\.yahoo\.com$ -(^|\.)tw\.bid\.yahoo\.com$ -(^|\.)tw\.gigacircle\.com$ -(^|\.)tw\.hao123\.com$ -(^|\.)tw\.jiepang\.com$ -(^|\.)tw\.knowledge\.yahoo\.com$ -(^|\.)tw\.mall\.yahoo\.com$ -(^|\.)tw\.mobi\.yahoo\.com$ -(^|\.)tw\.money\.yahoo\.com$ -(^|\.)tw\.myblog\.yahoo\.com$ -(^|\.)tw\.news\.yahoo\.com$ -(^|\.)tw\.streetvoice\.com$ -(^|\.)tw\.tomonews\.net$ -(^|\.)tw\.voa\.mobi$ -(^|\.)tw\.yahoo\.com$ -(^|\.)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$ -(^|\.)tweets\.seraph\.me$ -(^|\.)tweettunnel\.com$ -(^|\.)tweetwally\.com$ -(^|\.)tweetymail\.com$ -(^|\.)tweez\.net$ -(^|\.)twelve\.today$ -(^|\.)twerkingbutt\.com$ -(^|\.)twftp\.org$ -(^|\.)twgreatdaily\.com$ -(^|\.)twibase\.com$ -(^|\.)twibble\.de$ -(^|\.)twibbon\.com$ -(^|\.)twibs\.com$ -(^|\.)twicsy\.com$ -(^|\.)twiends\.com$ -(^|\.)twifan\.com$ -(^|\.)twiffo\.com$ -(^|\.)twiggit\.org$ -(^|\.)twilightsex\.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$ -(^|\.)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$ -(^|\.)twskype\.com$ -(^|\.)twstar\.net$ -(^|\.)twt\.tl$ -(^|\.)twtkr\.com$ -(^|\.)twtr2src\.ogaoga\.org$ -(^|\.)twtrland\.com$ -(^|\.)twttr\.com$ -(^|\.)twurl\.nl$ -(^|\.)twyac\.org$ -(^|\.)txxx\.com$ -(^|\.)tycool\.com$ -(^|\.)typepad\.com$ -(^|\.)u9un\.com$ -(^|\.)ub0\.cc$ -(^|\.)ubddns\.org$ -(^|\.)uberproxy\.net$ -(^|\.)uc-japan\.org$ -(^|\.)ucdc1998\.org$ -(^|\.)uderzo\.it$ -(^|\.)udn\.com$ -(^|\.)udn\.com\.tw$ -(^|\.)udnbkk\.com$ -(^|\.)uforadio\.com\.tw$ -(^|\.)ufreevpn\.com$ -(^|\.)ugo\.com$ -(^|\.)uhdwallpapers\.org$ -(^|\.)uhrp\.org$ -(^|\.)uighur\.narod\.ru$ -(^|\.)uighur\.nl$ -(^|\.)uighurbiz\.net$ -(^|\.)ukcdp\.co\.uk$ -(^|\.)ukliferadio\.co\.uk$ -(^|\.)ulike\.net$ -(^|\.)ulop\.net$ -(^|\.)ultrareach$ -(^|\.)ultrasurf$ -(^|\.)ultravpn\.fr$ -(^|\.)ultraxs\.com$ -(^|\.)umich\.edu$ -(^|\.)unblock-us\.com$ -(^|\.)unblock\.cn\.com$ -(^|\.)unblockdmm\.com$ -(^|\.)unblocker\.yt$ -(^|\.)unblocksit\.es$ -(^|\.)uncyclomedia\.org$ -(^|\.)uncyclopedia\.hk$ -(^|\.)uncyclopedia\.tw$ -(^|\.)underwoodammo\.com$ -(^|\.)unholyknight\.com$ -(^|\.)uni\.cc$ -(^|\.)unification\.net$ -(^|\.)unification\.org\.tw$ -(^|\.)unitedsocialpress\.com$ -(^|\.)unix100\.com$ -(^|\.)unknownspace\.org$ -(^|\.)unodedos\.com$ -(^|\.)unpo\.org$ -(^|\.)unseen\.is$ -(^|\.)untraceable\.us$ -(^|\.)uocn\.org$ -(^|\.)upcoming\.yahoo\.com$ -(^|\.)updates\.tdesktop\.com$ -(^|\.)upholdjustice\.org$ -(^|\.)upload4u\.info$ -(^|\.)uploaded\.net$ -(^|\.)uploaded\.to$ -(^|\.)uploadstation\.com$ -(^|\.)upmedia\.mg$ -(^|\.)upornia\.com$ -(^|\.)uproxy\.org$ -(^|\.)upwill\.org$ -(^|\.)ur7s\.com$ -(^|\.)urbansurvival\.com$ -(^|\.)urchin\.com$ -(^|\.)urlborg\.com$ -(^|\.)urlparser\.com$ -(^|\.)us\.to$ -(^|\.)usacn\.com$ -(^|\.)usaip\.eu$ -(^|\.)userapi\.nytlog\.com$ -(^|\.)users\.skynet\.be$ -(^|\.)usfk\.mil$ -(^|\.)ushuarencity\.echainhost\.com$ -(^|\.)usinfo\.state\.gov$ -(^|\.)usma\.edu$ -(^|\.)usmc\.mil$ -(^|\.)usmgtcg\.ning\.com$ -(^|\.)usno\.navy\.mil$ -(^|\.)usocctn\.com$ -(^|\.)ustream\.tv$ -(^|\.)usunitednews\.com$ -(^|\.)usus\.cc$ -(^|\.)utopianpal\.com$ -(^|\.)uu-gg\.com$ -(^|\.)uvwxyz\.xyz$ -(^|\.)uwants\.com$ -(^|\.)uwants\.net$ -(^|\.)uyghur-j\.org$ -(^|\.)uyghur\.co\.uk$ -(^|\.)uyghuramerican\.org$ -(^|\.)uyghurcanadiansociety\.org$ -(^|\.)uyghurcongress\.org$ -(^|\.)uyghurensemble\.co\.uk$ -(^|\.)uyghurpen\.org$ -(^|\.)uyghurpress\.com$ -(^|\.)uyghurstudies\.org$ -(^|\.)uygur\.fc2web\.com$ -(^|\.)uygur\.org$ -(^|\.)uymaarip\.com$ -(^|\.)v2ex\.com$ -(^|\.)v2ray\.com$ -(^|\.)van001\.com$ -(^|\.)van698\.com$ -(^|\.)vanemu\.cn$ -(^|\.)vanilla-jp\.com$ -(^|\.)vanpeople\.com$ -(^|\.)vansky\.com$ -(^|\.)vatn\.org$ -(^|\.)vcf-online\.org$ -(^|\.)vcfbuilder\.org$ -(^|\.)vds\.rightster\.com$ -(^|\.)vegas\.williamhill\.com$ -(^|\.)vegasred\.com$ -(^|\.)velkaepocha\.sk$ -(^|\.)venbbs\.com$ -(^|\.)venchina\.com$ -(^|\.)venetianmacao\.com$ -(^|\.)ventureswell\.com$ -(^|\.)veoh\.com$ -(^|\.)vermonttibet\.org$ -(^|\.)versavpn\.com$ -(^|\.)verybs\.com$ -(^|\.)vevo\.com$ -(^|\.)vft\.com\.tw$ -(^|\.)viber\.com$ -(^|\.)vica\.info$ -(^|\.)victimsofcommunism\.org$ -(^|\.)vid\.me$ -(^|\.)vidble\.com$ -(^|\.)video\.aol\.ca$ -(^|\.)video\.aol\.co\.uk$ -(^|\.)video\.aol\.com$ -(^|\.)video\.ap\.org$ -(^|\.)video\.fdbox\.com$ -(^|\.)video\.foxbusiness\.com$ -(^|\.)video\.pbs\.org$ -(^|\.)video\.yahoo\.com$ -(^|\.)videobam\.com$ -(^|\.)videodetective\.com$ -(^|\.)videomega\.tv$ -(^|\.)videomo\.com$ -(^|\.)videopediaworld\.com$ -(^|\.)videopress\.com$ -(^|\.)vidinfo\.org$ -(^|\.)vietdaikynguyen\.com$ -(^|\.)vijayatemple\.org$ -(^|\.)vimeo\.com$ -(^|\.)vimperator\.org$ -(^|\.)vincnd\.com$ -(^|\.)vine\.co$ -(^|\.)vinniev\.com$ -(^|\.)vip-enterprise\.com$ -(^|\.)visibletweets\.com$ -(^|\.)vital247\.org$ -(^|\.)viu\.com$ -(^|\.)viu\.tv$ -(^|\.)vivahentai4u\.net$ -(^|\.)vivatube\.com$ -(^|\.)vivthomas\.com$ -(^|\.)vizvaz\.com$ -(^|\.)vjmedia\.com\.hk$ -(^|\.)vllcs\.org$ -(^|\.)vlog\.xuite\.net$ -(^|\.)vmixcore\.com$ -(^|\.)vn\.hao123\.com$ -(^|\.)vnet\.link$ -(^|\.)voa-11\.akacast\.akamaistream\.net$ -(^|\.)voacantonese\.com$ -(^|\.)voachinese\.com$ -(^|\.)voachineseblog\.com$ -(^|\.)voagd\.com$ -(^|\.)voanews\.com$ -(^|\.)voatibetan\.com$ -(^|\.)voatibetanenglish\.com$ -(^|\.)vocativ\.com$ -(^|\.)vocn\.tv$ -(^|\.)vod\.wwe\.com$ -(^|\.)vot\.org$ -(^|\.)vovo2000\.com$ -(^|\.)voxer\.com$ -(^|\.)voy\.com$ -(^|\.)vpn\.ac$ -(^|\.)vpn\.cjb\.net$ -(^|\.)vpn\.cmu\.edu$ -(^|\.)vpn\.sv\.cmu\.edu$ -(^|\.)vpn4all\.com$ -(^|\.)vpnaccount\.org$ -(^|\.)vpnaccounts\.com$ -(^|\.)vpnbook\.com$ -(^|\.)vpncomparison\.org$ -(^|\.)vpncoupons\.com$ -(^|\.)vpncup\.com$ -(^|\.)vpndada\.com$ -(^|\.)vpnfan\.com$ -(^|\.)vpnfire\.com$ -(^|\.)vpnforgame\.net$ -(^|\.)vpngate\.jp$ -(^|\.)vpngate\.net$ -(^|\.)vpngratis\.net$ -(^|\.)vpnhq\.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$ -(^|\.)vtunnel\.com$ -(^|\.)vuku\.cc$ -(^|\.)w\.idaiwan\.com$ -(^|\.)w3schools\.com$ -(^|\.)waffle1999\.com$ -(^|\.)wahas\.com$ -(^|\.)waigaobu\.com$ -(^|\.)waikeung\.org$ -(^|\.)wailaike\.net$ -(^|\.)waiwaier\.com$ -(^|\.)wallmama\.com$ -(^|\.)wallornot\.org$ -(^|\.)wallpapercasa\.com$ -(^|\.)wallproxy\.com$ -(^|\.)waltermartin\.com$ -(^|\.)waltermartin\.org$ -(^|\.)wanderinghorse\.net$ -(^|\.)wangafu\.net$ -(^|\.)wangjinbo\.org$ -(^|\.)wanglixiong\.com$ -(^|\.)wango\.org$ -(^|\.)wangruoshui\.net$ -(^|\.)want-daily\.com$ -(^|\.)wanz-factory\.com$ -(^|\.)wapedia\.mobi$ -(^|\.)warbler\.iconfactory\.net$ -(^|\.)waselpro\.com$ -(^|\.)washeng\.net$ -(^|\.)watch8x\.com$ -(^|\.)watchinese\.com$ -(^|\.)watchmygf\.net$ -(^|\.)wattpad\.com$ -(^|\.)wav\.tv$ -(^|\.)waveprotocol\.org$ -(^|\.)waymo\.com$ -(^|\.)wda\.gov\.tw$ -(^|\.)wdf5\.com$ -(^|\.)wearehairy\.com$ -(^|\.)wearn\.com$ -(^|\.)web2project\.net$ -(^|\.)webbang\.net$ -(^|\.)webevader\.org$ -(^|\.)webfreer\.com$ -(^|\.)webjb\.org$ -(^|\.)weblagu\.com$ -(^|\.)webmproject\.org$ -(^|\.)webrtc\.org$ -(^|\.)webrush\.net$ -(^|\.)webs-tv\.net$ -(^|\.)website\.informer\.com$ -(^|\.)websitepulse\.com$ -(^|\.)webwarper\.net$ -(^|\.)webworkerdaily\.com$ -(^|\.)weekmag\.info$ -(^|\.)wefightcensorship\.org$ -(^|\.)wefong\.com$ -(^|\.)weiboleak\.com$ -(^|\.)weiboscope\.jmsc\.hku\.hk$ -(^|\.)weihuo\.org$ -(^|\.)weijingsheng\.org$ -(^|\.)weiming\.info$ -(^|\.)weiquanwang\.org$ -(^|\.)weisuo\.ws$ -(^|\.)welovecock\.com$ -(^|\.)wemigrate\.org$ -(^|\.)wengewang\.com$ -(^|\.)wengewang\.org$ -(^|\.)wenhui\.ch$ -(^|\.)wenxuecity\.com$ -(^|\.)wenyunchao\.com$ -(^|\.)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\.net$ -(^|\.)wheatseeds\.org$ -(^|\.)wheelockslatin\.com$ -(^|\.)whereiswerner\.com$ -(^|\.)wheretowatch\.com$ -(^|\.)whippedass\.com$ -(^|\.)whitebear\.freebearblog\.org$ -(^|\.)whodns\.xyz$ -(^|\.)whoer\.net$ -(^|\.)whotalking\.com$ -(^|\.)whylover\.com$ -(^|\.)whyx\.org$ -(^|\.)widevine\.com$ -(^|\.)wikaba\.com$ -(^|\.)wiki\.cnitter\.com$ -(^|\.)wiki\.esu\.im$ -(^|\.)wiki\.gamerp\.jp$ -(^|\.)wiki\.jqueryui\.com$ -(^|\.)wiki\.keso\.cn$ -(^|\.)wiki\.moegirl\.org$ -(^|\.)wiki\.oauth\.net$ -(^|\.)wiki\.phonegap\.com$ -(^|\.)wikileaks-forum\.com$ -(^|\.)wikileaks\.ch$ -(^|\.)wikileaks\.com$ -(^|\.)wikileaks\.de$ -(^|\.)wikileaks\.eu$ -(^|\.)wikileaks\.lu$ -(^|\.)wikileaks\.org$ -(^|\.)wikileaks\.pl$ -(^|\.)wikilivres\.info$ -(^|\.)wikimapia\.org$ -(^|\.)wikiwiki\.jp$ -(^|\.)wildammo\.com$ -(^|\.)willw\.net$ -(^|\.)windowsphoneme\.com$ -(^|\.)windscribe\.com$ -(^|\.)wingamestore\.com$ -(^|\.)wingy\.site$ -(^|\.)winning11\.com$ -(^|\.)winwhispers\.info$ -(^|\.)wire\.com$ -(^|\.)wiredbytes\.com$ -(^|\.)wiredpen\.com$ -(^|\.)wisdompubs\.org$ -(^|\.)wisevid\.com$ -(^|\.)withgoogle\.com$ -(^|\.)withyoutube\.com$ -(^|\.)witnessleeteaching\.com$ -(^|\.)witopia\.net$ -(^|\.)wizcrafts\.net$ -(^|\.)wjbk\.org$ -(^|\.)wlcnew\.jigsy\.com$ -(^|\.)wlx\.sowiki\.net$ -(^|\.)wn\.com$ -(^|\.)wnacg\.com$ -(^|\.)wnacg\.org$ -(^|\.)wo\.tc$ -(^|\.)wo3ttt\.wordpress\.com$ -(^|\.)woeser\.com$ -(^|\.)woesermiddle-way\.net$ -(^|\.)wokar\.org$ -(^|\.)wolfax\.com$ -(^|\.)woolyss\.com$ -(^|\.)woopie\.jp$ -(^|\.)woopie\.tv$ -(^|\.)wordpress\.com$ -(^|\.)workatruna\.com$ -(^|\.)workerdemo\.org\.hk$ -(^|\.)workersthebig\.net$ -(^|\.)worldcat\.org$ -(^|\.)worldjournal\.com$ -(^|\.)worldvpn\.net$ -(^|\.)wow-life\.net$ -(^|\.)wow\.com$ -(^|\.)wowgirls\.com$ -(^|\.)wowlegacy\.ml$ -(^|\.)wowporn\.com$ -(^|\.)wowrk\.com$ -(^|\.)woxinghuiguo\.com$ -(^|\.)woyaolian\.org$ -(^|\.)wozy\.in$ -(^|\.)wp\.com$ -(^|\.)wpoforum\.com$ -(^|\.)wqyd\.org$ -(^|\.)wrchina\.org$ -(^|\.)wretch\.cc$ -(^|\.)writer\.zoho\.com$ -(^|\.)wsgzao\.github\.io$ -(^|\.)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$ -(^|\.)wuu\.wikipedia\.org$ -(^|\.)wuw\.red$ -(^|\.)wuyanblog\.com$ -(^|\.)wwitv\.com$ -(^|\.)www\.ajsands\.com$ -(^|\.)www\.americorps\.gov$ -(^|\.)www\.antd\.org$ -(^|\.)www\.aolnews\.com$ -(^|\.)www\.businessinsider\.com\.au$ -(^|\.)www\.citizenlab\.org$ -(^|\.)www\.cmoinc\.org$ -(^|\.)www\.cool18\.com$ -(^|\.)www\.dmm\.com$ -(^|\.)www\.dwheeler\.com$ -(^|\.)www\.eastturkistan\.net$ -(^|\.)www\.ftchinese\.com$ -(^|\.)www\.gmiddle\.com$ -(^|\.)www\.gmiddle\.net$ -(^|\.)www\.hustlercash\.com$ -(^|\.)www\.idlcoyote\.com$ -(^|\.)www\.imdb\.com$ -(^|\.)www\.kindleren\.com$ -(^|\.)www\.klip\.me$ -(^|\.)www\.lamenhu\.com$ -(^|\.)www\.lib\.virginia\.edu$ -(^|\.)www\.linksalpha\.com$ -(^|\.)www\.m-sport\.co\.uk$ -(^|\.)www\.metro\.taipei$ -(^|\.)www\.monlamit\.org$ -(^|\.)www\.moztw\.org$ -(^|\.)www\.nbc\.com$ -(^|\.)www\.orchidbbs\.com$ -(^|\.)www\.owind\.com$ -(^|\.)www\.oxid\.it$ -(^|\.)www\.powerpointninja\.com$ -(^|\.)www\.s4miniarchive\.com$ -(^|\.)www\.sciencemag\.org$ -(^|\.)www\.shadowsocks\.com$ -(^|\.)www\.shwchurch\.org$ -(^|\.)www\.skype\.com$ -(^|\.)www\.tablesgenerator\.com$ -(^|\.)www\.taiwanonline\.cc$ -(^|\.)www\.taup\.org\.tw$ -(^|\.)www\.thechinastory\.org$ -(^|\.)www\.wan-press\.org$ -(^|\.)www\.wangruowang\.org$ -(^|\.)www\.websnapr\.com$ -(^|\.)www\.zensur\.freerk\.com$ -(^|\.)www1\.american\.edu$ -(^|\.)www1\.biz$ -(^|\.)www2\.ohchr\.org$ -(^|\.)www2\.rocketbbs\.com$ -(^|\.)wwwhost\.biz$ -(^|\.)wzyboy\.im$ -(^|\.)x-art\.com$ -(^|\.)x-berry\.com$ -(^|\.)x-wall\.org$ -(^|\.)x\.company$ -(^|\.)x1949x\.com$ -(^|\.)x24hr\.com$ -(^|\.)x365x\.com$ -(^|\.)xa\.yimg\.com$ -(^|\.)xanga\.com$ -(^|\.)xbabe\.com$ -(^|\.)xbookcn\.com$ -(^|\.)xcafe\.in$ -(^|\.)xcity\.jp$ -(^|\.)xcritic\.com$ -(^|\.)xerotica\.com$ -(^|\.)xfinity\.com$ -(^|\.)xfm\.pp\.ru$ -(^|\.)xgmyd\.com$ -(^|\.)xhamster\.com$ -(^|\.)xianchawang\.net$ -(^|\.)xianjian\.tw$ -(^|\.)xianqiao\.net$ -(^|\.)xiaobaiwu\.com$ -(^|\.)xiaochuncnjp\.com$ -(^|\.)xiaod\.in$ -(^|\.)xiaohexie\.com$ -(^|\.)xiaolan\.me$ -(^|\.)xiaoma\.org$ -(^|\.)xiezhua\.com$ -(^|\.)xihua\.es$ -(^|\.)xing\.com$ -(^|\.)xinhuanet\.org$ -(^|\.)xinmiao\.com\.hk$ -(^|\.)xinqimeng\.over-blog\.com$ -(^|\.)xinsheng\.net$ -(^|\.)xinshijue\.com$ -(^|\.)xinyubbs\.net$ -(^|\.)xiongpian\.com$ -(^|\.)xiuren\.org$ -(^|\.)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--czq75pvv1aj5c\.org$ -(^|\.)xn--i2ru8q2qg\.com$ -(^|\.)xn--ngstr-lra8j\.com$ -(^|\.)xn--p8j9a0d9c9a\.xn--q9jyb4c$ -(^|\.)xnxx\.com$ -(^|\.)xpdo\.net$ -(^|\.)xpud\.org$ -(^|\.)xrentdvd\.com$ -(^|\.)xskywalker\.com$ -(^|\.)xskywalker\.net$ -(^|\.)xtube\.com$ -(^|\.)xuchao\.net$ -(^|\.)xuchao\.org$ -(^|\.)xuehua\.us$ -(^|\.)xuzhiyong\.net$ -(^|\.)xvideo\.cc$ -(^|\.)xvideos\.com$ -(^|\.)xvideos\.es$ -(^|\.)xxbbx\.com$ -(^|\.)xxlmovies\.com$ -(^|\.)xxuz\.com$ -(^|\.)xxx\.com$ -(^|\.)xxx\.xxx$ -(^|\.)xxxfuckmom\.com$ -(^|\.)xxxx\.com\.au$ -(^|\.)xxxy\.biz$ -(^|\.)xxxy\.info$ -(^|\.)xxxymovies\.com$ -(^|\.)xys\.dxiong\.com$ -(^|\.)xys\.org$ -(^|\.)xysblogs\.org$ -(^|\.)xyy69\.com$ -(^|\.)xyy69\.info$ -(^|\.)yahoo\.com\.hk$ -(^|\.)yakbutterblues\.com$ -(^|\.)yam\.com$ -(^|\.)yam\.org\.tw$ -(^|\.)yanghengjun\.com$ -(^|\.)yangjianli\.com$ -(^|\.)yasni\.co\.uk$ -(^|\.)yayabay\.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$ -(^|\.)yilubbs\.com$ -(^|\.)yingsuoss\.com$ -(^|\.)yinlei\.org$ -(^|\.)yipub\.com$ -(^|\.)yizhihongxing\.com$ -(^|\.)yobt\.com$ -(^|\.)yobt\.tv$ -(^|\.)yogichen\.org$ -(^|\.)yong\.hu$ -(^|\.)yorkbbs\.ca$ -(^|\.)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$ -(^|\.)youthnetradio\.org$ -(^|\.)youtu\.be$ -(^|\.)youtube-nocookie\.com$ -(^|\.)youtube\.com$ -(^|\.)youtubecn\.com$ -(^|\.)youtubeeducation\.com$ -(^|\.)youtubegaming\.com$ -(^|\.)youversion\.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$ -(^|\.)yzzk\.com$ -(^|\.)zacebook\.com$ -(^|\.)zalmos\.com$ -(^|\.)zannel\.com$ -(^|\.)zaobao\.com\.sg$ -(^|\.)zaozon\.com$ -(^|\.)zapto\.org$ -(^|\.)zattoo\.com$ -(^|\.)zdnet\.com\.tw$ -(^|\.)zello\.com$ -(^|\.)zengjinyan\.org$ -(^|\.)zenmate\.com$ -(^|\.)zenmate\.com\.ru$ -(^|\.)zeronet\.io$ -(^|\.)zeutch\.com$ -(^|\.)zfreet\.com$ -(^|\.)zgsddh\.com$ -(^|\.)zgzcjj\.net$ -(^|\.)zh-yue\.wikipedia\.org$ -(^|\.)zh\.ecdm\.wikia\.com$ -(^|\.)zh\.m\.wikipedia\.org$ -(^|\.)zh\.pokerstrategy\.com$ -(^|\.)zh\.uncyclopedia\.wikia\.com$ -(^|\.)zh\.wikinews\.org$ -(^|\.)zh\.wikipedia\.org$ -(^|\.)zh\.wikisource\.org$ -(^|\.)zhanbin\.net$ -(^|\.)zhangboli\.net$ -(^|\.)zhangtianliang\.com$ -(^|\.)zhanlve\.org$ -(^|\.)zhao\.1984\.city$ -(^|\.)zhao\.jinhai\.de$ -(^|\.)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$ -(^|\.)ziddu\.com$ -(^|\.)zillionk\.com$ -(^|\.)zim\.vn$ -(^|\.)zinio\.com$ -(^|\.)ziporn\.com$ -(^|\.)zippyshare\.com$ -(^|\.)zkaip\.com$ -(^|\.)zmw\.cn$ -(^|\.)zodgame\.us$ -(^|\.)zomobo\.net$ -(^|\.)zonaeuropa\.com$ -(^|\.)zonghexinwen\.com$ -(^|\.)zonghexinwen\.net$ -(^|\.)zoogvpn\.com$ -(^|\.)zootool\.com$ -(^|\.)zoozle\.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$ -(^|\.)zyzc9\.com$ -(^|\.)zzcartoon\.com$ -(^|\.)zzux\.com$ diff --git a/client/android/assets/acl/bypass-lan.acl b/client/android/assets/acl/bypass-lan.acl deleted file mode 100644 index df9a21da0..000000000 --- a/client/android/assets/acl/bypass-lan.acl +++ /dev/null @@ -1,17 +0,0 @@ -[proxy_all] - -[bypass_list] -0.0.0.0/8 -10.0.0.0/8 -100.64.0.0/10 -127.0.0.0/8 -169.254.0.0/16 -172.16.0.0/12 -192.0.0.0/29 -192.0.2.0/24 -192.88.99.0/24 -192.168.0.0/16 -198.18.0.0/15 -198.51.100.0/24 -203.0.113.0/24 -224.0.0.0/3 diff --git a/client/android/assets/acl/china-list.acl b/client/android/assets/acl/china-list.acl deleted file mode 100644 index 4d76a47ca..000000000 --- a/client/android/assets/acl/china-list.acl +++ /dev/null @@ -1,5245 +0,0 @@ -[bypass_all] - -[proxy_list] -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.32.0/19 -8.208.64.0/18 -8.208.128.0/17 -8.209.0.0/16 -8.210.0.0/15 -8.212.0.0/14 -8.216.0.0/13 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.251.240.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -65.55.60.184/30 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.119.224.0/22 -103.120.52.0/22 -103.120.72.0/22 -103.120.76.0/24 -103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 -103.121.52.0/22 -103.121.92.0/22 -103.121.160.0/21 -103.121.250.0/24 -103.121.252.0/22 -103.129.52.0/22 -103.129.148.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.197.104.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -130.214.218.0/23 -131.228.96.0/24 -131.253.12.0/29 -131.253.12.80/28 -131.253.12.240/29 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -147.243.13.32/27 -147.243.13.64/27 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.158.0.0/16 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.32.136.0/21 -152.32.144.0/20 -152.32.160.0/19 -152.32.192.0/18 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -188.65.16.0/22 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.1.0/24 -202.95.2.0/23 -202.95.4.0/22 -202.95.8.0/21 -202.95.16.0/20 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 diff --git a/client/android/assets/acl/gfwlist.acl b/client/android/assets/acl/gfwlist.acl deleted file mode 100644 index 2567a2642..000000000 --- a/client/android/assets/acl/gfwlist.acl +++ /dev/null @@ -1,5492 +0,0 @@ -# -# GFW list from https://github.com/gfwlist/gfwlist/blob/master/gfwlist.txt -# updated on 2019-02-21 -# - -[bypass_all] - -[proxy_list] -# Telegram IPs$ -91.108.4.0/22 -91.108.8.0/21 -91.108.16.0/21 -91.108.36.0/22 -91.108.56.0/22 -109.239.140.0/24 -149.154.160.0/20 - -1.1.1.1 -14.102.250.18 -14.102.250.19 -174.142.105.153 -50.7.31.230 -67.220.91.15 -67.220.91.18 -67.220.91.23 -69.65.19.160 -72.52.81.22 -85.17.73.31 -(^|\.)030buy\.com$ -(^|\.)0rz\.tw$ -(^|\.)1-apple\.com\.tw$ -(^|\.)10\.tt$ -(^|\.)1000giri\.net$ -(^|\.)100ke\.org$ -(^|\.)10conditionsoflove\.com$ -(^|\.)10musume\.com$ -(^|\.)123rf\.com$ -(^|\.)12bet\.com$ -(^|\.)12vpn\.com$ -(^|\.)12vpn\.net$ -(^|\.)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$ -(^|\.)1984bbs\.com$ -(^|\.)1984bbs\.org$ -(^|\.)1989report\.hkja\.org\.hk$ -(^|\.)1991way\.com$ -(^|\.)1998cdp\.org$ -(^|\.)1bao\.org$ -(^|\.)1dumb\.com$ -(^|\.)1e100\.net$ -(^|\.)1eew\.com$ -(^|\.)1mobile\.com$ -(^|\.)1pondo\.tv$ -(^|\.)2-hand\.info$ -(^|\.)2000fun\.com$ -(^|\.)2008xianzhang\.info$ -(^|\.)2017\.hk$ -(^|\.)21andy\.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$ -(^|\.)43110\.cf$ -(^|\.)466453\.com$ -(^|\.)4bluestones\.biz$ -(^|\.)4chan\.com$ -(^|\.)4dq\.com$ -(^|\.)4everproxy\.com$ -(^|\.)4irc\.com$ -(^|\.)4mydomain\.com$ -(^|\.)4pu\.com$ -(^|\.)4rbtv\.com$ -(^|\.)4shared\.com$ -(^|\.)51\.ca$ -(^|\.)51jav\.org$ -(^|\.)51luoben\.com$ -(^|\.)5278\.cc$ -(^|\.)5299\.tv$ -(^|\.)56cun04\.jigsy\.com$ -(^|\.)5aimiku\.com$ -(^|\.)5i01\.com$ -(^|\.)5isotoi5\.org$ -(^|\.)5maodang\.com$ -(^|\.)63i\.com$ -(^|\.)64memo$ -(^|\.)64museum\.org$ -(^|\.)64tianwang\.com$ -(^|\.)64wiki\.com$ -(^|\.)66\.ca$ -(^|\.)666kb\.com$ -(^|\.)6park\.com$ -(^|\.)6parker\.com$ -(^|\.)7capture\.com$ -(^|\.)7cow\.com$ -(^|\.)8-d\.com$ -(^|\.)85cc\.net$ -(^|\.)85cc\.us$ -(^|\.)85st\.com$ -(^|\.)881903\.com$ -(^|\.)888\.com$ -(^|\.)888poker\.com$ -(^|\.)89-64\.org$ -(^|\.)89\.64\.charter\.constitutionalism\.solutions$ -(^|\.)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$ -(^|\.)a-normal-day\.com$ -(^|\.)a248\.e\.akamai\.net$ -(^|\.)a5\.com\.ru$ -(^|\.)aamacau\.com$ -(^|\.)abc\.com$ -(^|\.)abc\.net\.au$ -(^|\.)abc\.pp\.ru$ -(^|\.)abc\.xyz$ -(^|\.)abchinese\.com$ -(^|\.)abclite\.net$ -(^|\.)abebooks\.com$ -(^|\.)abematv\.akamaized\.net$ -(^|\.)abitno\.linpie\.com$ -(^|\.)ablwang\.com$ -(^|\.)aboluowang\.com$ -(^|\.)aboutgfw\.com$ -(^|\.)abs\.edu$ -(^|\.)ac\.jiruan\.net$ -(^|\.)accim\.org$ -(^|\.)aceros-de-hispania\.com$ -(^|\.)acevpn\.com$ -(^|\.)acg18\.me$ -(^|\.)acgkj\.com$ -(^|\.)acmedia365\.com$ -(^|\.)acmetoy\.com$ -(^|\.)acnw\.com\.au$ -(^|\.)actfortibet\.org$ -(^|\.)actimes\.com\.au$ -(^|\.)activpn\.com$ -(^|\.)aculo\.us$ -(^|\.)adcex\.com$ -(^|\.)addictedtocoffee\.de$ -(^|\.)adelaidebbs\.com$ -(^|\.)admin\.recaptcha\.net$ -(^|\.)admob\.com$ -(^|\.)adpl\.org\.hk$ -(^|\.)ads-twitter\.com$ -(^|\.)adsense\.com$ -(^|\.)adult-sex-games\.com$ -(^|\.)adult\.friendfinder\.com$ -(^|\.)adultfriendfinder\.com$ -(^|\.)adultkeep\.net$ -(^|\.)advanscene\.com$ -(^|\.)advertfan\.com$ -(^|\.)ae\.hao123\.com$ -(^|\.)ae\.org$ -(^|\.)aenhancers\.com$ -(^|\.)aex\.com$ -(^|\.)af\.mil$ -(^|\.)afantibbs\.com$ -(^|\.)agnesb\.fr$ -(^|\.)agoogleaday\.com$ -(^|\.)agro\.hk$ -(^|\.)ahr0chm6ly95zwnslm5lda$ -(^|\.)ai-kan\.net$ -(^|\.)ai-wen\.net$ -(^|\.)ai\.binwang\.me$ -(^|\.)ai\.google$ -(^|\.)aiph\.net$ -(^|\.)airasia\.com$ -(^|\.)airconsole\.com$ -(^|\.)airvpn\.org$ -(^|\.)aisex\.com$ -(^|\.)ait\.org\.tw$ -(^|\.)aiweiwei\.com$ -(^|\.)aiweiweiblog\.com$ -(^|\.)akademiye\.org$ -(^|\.)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$ -(^|\.)alkasir\.com$ -(^|\.)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$ -(^|\.)ameblo\.jp$ -(^|\.)americangreencard\.com$ -(^|\.)americanunfinished\.com$ -(^|\.)amiblockedornot\.com$ -(^|\.)amigobbs\.net$ -(^|\.)amitabhafoundation\.us$ -(^|\.)amnesty\.org$ -(^|\.)amnesty\.org\.hk$ -(^|\.)amnesty\.tw$ -(^|\.)amnestyusa\.org$ -(^|\.)amnyemachen\.org$ -(^|\.)amoiist\.com$ -(^|\.)ampproject\.org$ -(^|\.)amtb-taipei\.org$ -(^|\.)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$ -(^|\.)animeshippuuden\.com$ -(^|\.)aniscartujo\.com$ -(^|\.)annatam\.com$ -(^|\.)anobii\.com$ -(^|\.)anontext\.com$ -(^|\.)anonymise\.us$ -(^|\.)anonymitynetwork\.com$ -(^|\.)anonymizer\.com$ -(^|\.)anpopo\.com$ -(^|\.)answering-islam\.org$ -(^|\.)anthonycalzadilla\.com$ -(^|\.)anti1984\.com$ -(^|\.)antichristendom\.com$ -(^|\.)antiwave\.net$ -(^|\.)anyporn\.com$ -(^|\.)anysex\.com$ -(^|\.)aobo\.com\.au$ -(^|\.)aofriend\.com$ -(^|\.)aofriend\.com\.au$ -(^|\.)aojiao\.org$ -(^|\.)aolchannels\.aol\.com$ -(^|\.)aomiwang\.com$ -(^|\.)apartmentratings\.com$ -(^|\.)apartments\.com$ -(^|\.)apetube\.com$ -(^|\.)api-secure\.recaptcha\.net$ -(^|\.)api-verify\.recaptcha\.net$ -(^|\.)api\.ai$ -(^|\.)api\.dropboxapi\.com$ -(^|\.)api\.linksalpha\.com$ -(^|\.)api\.proxlet\.com$ -(^|\.)api\.pureapk\.com$ -(^|\.)api\.recaptcha\.net$ -(^|\.)apiary\.io$ -(^|\.)apidocs\.linksalpha\.com$ -(^|\.)apigee\.com$ -(^|\.)apk-dl\.com$ -(^|\.)apkdler\.com$ -(^|\.)apkmirror\.com$ -(^|\.)apkmonk\.com$ -(^|\.)apkplz\.com$ -(^|\.)apkpure\.com$ -(^|\.)aplusvpn\.com$ -(^|\.)app\.box\.com$ -(^|\.)app\.heywire\.com$ -(^|\.)app\.smartmailcloud\.com$ -(^|\.)app\.tutanota\.com$ -(^|\.)appdownloader\.net$ -(^|\.)appledaily\.com$ -(^|\.)appledaily\.com\.hk$ -(^|\.)appledaily\.com\.tw$ -(^|\.)appshopper\.com$ -(^|\.)appsocks\.net$ -(^|\.)appspot\.com$ -(^|\.)appsto\.re$ -(^|\.)aptoide\.com$ -(^|\.)ar\.hao123\.com$ -(^|\.)archive\.fo$ -(^|\.)archive\.is$ -(^|\.)archive\.li$ -(^|\.)archive\.org$ -(^|\.)archive\.today$ -(^|\.)archives\.gov$ -(^|\.)archives\.gov\.tw$ -(^|\.)arctosia\.com$ -(^|\.)areca-backup\.org$ -(^|\.)arena\.taipei$ -(^|\.)arethusa\.su$ -(^|\.)arlingtoncemetery\.mil$ -(^|\.)army\.mil$ -(^|\.)art4tibet1998\.org$ -(^|\.)arte\.tv$ -(^|\.)artofpeacefoundation\.org$ -(^|\.)artsy\.net$ -(^|\.)asacp\.org$ -(^|\.)asdfg\.jp$ -(^|\.)asg\.to$ -(^|\.)asia-gaming\.com$ -(^|\.)asiaharvest\.org$ -(^|\.)asianews\.it$ -(^|\.)asiansexdiary\.com$ -(^|\.)asianspiss\.com$ -(^|\.)asianwomensfilm\.de$ -(^|\.)asiatgp\.com$ -(^|\.)asiatoday\.us$ -(^|\.)askstudent\.com$ -(^|\.)askynz\.net$ -(^|\.)assembla\.com$ -(^|\.)assets\.bwbx\.io$ -(^|\.)assimp\.org$ -(^|\.)astrill\.com$ -(^|\.)atc\.org\.au$ -(^|\.)atchinese\.com$ -(^|\.)atdmt\.com$ -(^|\.)atgfw\.org$ -(^|\.)athenaeizou\.com$ -(^|\.)atlanta168\.com$ -(^|\.)atlaspost\.com$ -(^|\.)atnext\.com$ -(^|\.)authorizeddns\.net$ -(^|\.)authorizeddns\.org$ -(^|\.)authorizeddns\.us$ -(^|\.)autodraw\.com$ -(^|\.)av-e-body\.com$ -(^|\.)av\.com$ -(^|\.)av\.movie$ -(^|\.)av\.nightlife141\.com$ -(^|\.)avaaz\.org$ -(^|\.)avbody\.tv$ -(^|\.)avcity\.tv$ -(^|\.)avcool\.com$ -(^|\.)avdb\.in$ -(^|\.)avdb\.tv$ -(^|\.)avfantasy\.com$ -(^|\.)avgle\.com$ -(^|\.)avidemux\.org$ -(^|\.)avmo\.pw$ -(^|\.)avmoo\.com$ -(^|\.)avmoo\.net$ -(^|\.)avmoo\.pw$ -(^|\.)avoision\.com$ -(^|\.)avyahoo\.com$ -(^|\.)axureformac\.com$ -(^|\.)azerbaycan\.tv$ -(^|\.)azerimix\.com$ -(^|\.)azubu\.tv$ -(^|\.)b0ne\.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$ -(^|\.)bandwagonhost\.com$ -(^|\.)bangbrosnetwork\.com$ -(^|\.)bangchen\.net$ -(^|\.)bangdream\.space$ -(^|\.)bangyoulater\.com$ -(^|\.)bankmobilevibe\.com$ -(^|\.)bannedbook\.org$ -(^|\.)bannednews\.org$ -(^|\.)banorte\.com$ -(^|\.)baramangaonline\.com$ -(^|\.)barenakedislam\.com$ -(^|\.)barnabu\.co\.uk$ -(^|\.)bartvpn\.com$ -(^|\.)bash-hackers\.org$ -(^|\.)bastillepost\.com$ -(^|\.)bayvoice\.net$ -(^|\.)bb-chat\.tv$ -(^|\.)bb\.ttv\.com\.tw$ -(^|\.)bbc\.co\.uk$ -(^|\.)bbc\.com$ -(^|\.)bbc\.in$ -(^|\.)bbcchinese\.com$ -(^|\.)bbchat\.tv$ -(^|\.)bbci\.co\.uk$ -(^|\.)bbg\.gov$ -(^|\.)bbkz\.com$ -(^|\.)bbnradio\.org$ -(^|\.)bbs-tw\.com$ -(^|\.)bbs\.brockbbs\.com$ -(^|\.)bbs\.cantonese\.asia$ -(^|\.)bbs\.ecstart\.com$ -(^|\.)bbs\.hanminzu\.org$ -(^|\.)bbs\.hasi\.wang$ -(^|\.)bbs\.huasing\.org$ -(^|\.)bbs\.junglobal\.net$ -(^|\.)bbs\.kimy\.com\.tw$ -(^|\.)bbs\.mikocon\.com$ -(^|\.)bbs\.morbell\.com$ -(^|\.)bbs\.mychat\.to$ -(^|\.)bbs\.netbig\.com$ -(^|\.)bbs\.ozchinese\.com$ -(^|\.)bbs\.qmzdd\.com$ -(^|\.)bbs\.sina\.com$ -(^|\.)bbs\.sina\.com%2f$ -(^|\.)bbs\.skykiwi\.com$ -(^|\.)bbs\.sou-tong\.org$ -(^|\.)bbs\.tuitui\.info$ -(^|\.)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$ -(^|\.)beijingspring\.com$ -(^|\.)beijingzx\.org$ -(^|\.)belamionline\.com$ -(^|\.)bell\.wiki$ -(^|\.)bemywife\.cc$ -(^|\.)beric\.me$ -(^|\.)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$ -(^|\.)big\.one$ -(^|\.)bigfools\.com$ -(^|\.)bigjapanesesex\.com$ -(^|\.)bigmoney\.biz$ -(^|\.)bignews\.org$ -(^|\.)bigsound\.org$ -(^|\.)biliworld\.com$ -(^|\.)billypan\.com$ -(^|\.)binance\.com$ -(^|\.)binux\.me$ -(^|\.)bipic\.net$ -(^|\.)bird\.so$ -(^|\.)bit-z\.com$ -(^|\.)bit\.do$ -(^|\.)bit\.ly$ -(^|\.)bitc\.bme\.emory\.edu$ -(^|\.)bitcointalk\.org$ -(^|\.)bitcoinworld\.com$ -(^|\.)bitfinex\.com$ -(^|\.)bithumb\.com$ -(^|\.)bitinka\.com\.ar$ -(^|\.)bitmex\.com$ -(^|\.)bitshare\.com$ -(^|\.)bitsnoop\.com$ -(^|\.)bitvise\.com$ -(^|\.)bizhat\.com$ -(^|\.)bjnewlife\.org$ -(^|\.)bjs\.org$ -(^|\.)bjzc\.org$ -(^|\.)bl-doujinsouko\.com$ -(^|\.)blacklogic\.com$ -(^|\.)blackvpn\.com$ -(^|\.)blewpass\.com$ -(^|\.)blinkx\.com$ -(^|\.)blinw\.com$ -(^|\.)blip\.tv$ -(^|\.)blockcn\.com$ -(^|\.)blockless\.com$ -(^|\.)blog\.calibre-ebook\.com$ -(^|\.)blog\.cnyes\.com$ -(^|\.)blog\.daum\.net$ -(^|\.)blog\.de$ -(^|\.)blog\.exblog\.co\.jp$ -(^|\.)blog\.excite\.co\.jp$ -(^|\.)blog\.expofutures\.com$ -(^|\.)blog\.fizzik\.com$ -(^|\.)blog\.foolsmountain\.com$ -(^|\.)blog\.fuckgfw233\.org$ -(^|\.)blog\.goo\.ne\.jp$ -(^|\.)blog\.google$ -(^|\.)blog\.inoreader\.com$ -(^|\.)blog\.istef\.info$ -(^|\.)blog\.jackjia\.com$ -(^|\.)blog\.jp$ -(^|\.)blog\.kangye\.org$ -(^|\.)blog\.lester850\.info$ -(^|\.)blog\.martinoei\.com$ -(^|\.)blog\.pathtosharepoint\.com$ -(^|\.)blog\.pentalogic\.net$ -(^|\.)blog\.qooza\.hk$ -(^|\.)blog\.ranxiang\.com$ -(^|\.)blog\.sina\.com\.tw$ -(^|\.)blog\.sogoo\.org$ -(^|\.)blog\.soylent\.com$ -(^|\.)blog\.syx86\.cn$ -(^|\.)blog\.syx86\.com$ -(^|\.)blog\.taragana\.com$ -(^|\.)blog\.tiney\.com$ -(^|\.)blog\.xuite\.net$ -(^|\.)blog\.youthwant\.com\.tw$ -(^|\.)blog\.youxu\.info$ -(^|\.)blogblog\.com$ -(^|\.)blogcatalog\.com$ -(^|\.)blogcity\.me$ -(^|\.)blogdns\.org$ -(^|\.)blogger\.com$ -(^|\.)blogimg\.jp$ -(^|\.)bloglines\.com$ -(^|\.)bloglovin\.com$ -(^|\.)blogs\.icerocket\.com$ -(^|\.)blogs\.libraryinformationtechnology\.com$ -(^|\.)blogs\.tampabay\.com$ -(^|\.)blogs\.yahoo\.co\.jp$ -(^|\.)blogspot\.com$ -(^|\.)blogspot\.hk$ -(^|\.)blogspot\.jp$ -(^|\.)blogspot\.tw$ -(^|\.)blogtd\.net$ -(^|\.)blogtd\.org$ -(^|\.)bloodshed\.net$ -(^|\.)bloomberg\.cn$ -(^|\.)bloomberg\.com$ -(^|\.)bloomberg\.de$ -(^|\.)bloombergview\.com$ -(^|\.)bloomfortune\.com$ -(^|\.)blueangellive\.com$ -(^|\.)bmfinn\.com$ -(^|\.)bnews\.co$ -(^|\.)bnn\.co$ -(^|\.)bnrmetal\.com$ -(^|\.)boardreader\.com$ -(^|\.)bod\.asia$ -(^|\.)bodog88\.com$ -(^|\.)bolehvpn\.net$ -(^|\.)bolin\.netfirms\.com$ -(^|\.)bonbonme\.com$ -(^|\.)bonbonsex\.com$ -(^|\.)bonfoundation\.org$ -(^|\.)bongacams\.com$ -(^|\.)boobstagram\.com$ -(^|\.)book\.com\.tw$ -(^|\.)book\.zi5\.me$ -(^|\.)bookepub\.com$ -(^|\.)books\.com\.tw$ -(^|\.)booktopia\.com\.au$ -(^|\.)boomssr\.com$ -(^|\.)bot\.nu$ -(^|\.)botanwang\.com$ -(^|\.)bowenpress\.com$ -(^|\.)boxpn\.com$ -(^|\.)boxun$ -(^|\.)boxun\.com$ -(^|\.)boxun\.tv$ -(^|\.)boxunblog\.com$ -(^|\.)boxunclub\.com$ -(^|\.)boyangu\.com$ -(^|\.)boyfriendtv\.com$ -(^|\.)boysfood\.com$ -(^|\.)boysmaster\.com$ -(^|\.)br\.hao123\.com$ -(^|\.)br\.st$ -(^|\.)brainyquote\.com$ -(^|\.)brandonhutchinson\.com$ -(^|\.)braumeister\.org$ -(^|\.)bravotube\.net$ -(^|\.)brazzers\.com$ -(^|\.)break\.com$ -(^|\.)breakgfw\.com$ -(^|\.)breaking911\.com$ -(^|\.)breakingtweets\.com$ -(^|\.)breakwall\.net$ -(^|\.)briefdream\.com$ -(^|\.)briian\.com$ -(^|\.)brizzly\.com$ -(^|\.)brkmd\.com$ -(^|\.)broadbook\.com$ -(^|\.)broadpressinc\.com$ -(^|\.)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$ -(^|\.)bullog\.org$ -(^|\.)bullogger\.com$ -(^|\.)bunbunhk\.com$ -(^|\.)busayari\.com$ -(^|\.)businessinsider\.com$ -(^|\.)businessweek\.com$ -(^|\.)busu\.org$ -(^|\.)busytrade\.com$ -(^|\.)buugaa\.com$ -(^|\.)buy\.yahoo\.com\.tw$ -(^|\.)buzzhand\.com$ -(^|\.)buzzhand\.net$ -(^|\.)buzzorange\.com$ -(^|\.)bvpn\.com$ -(^|\.)bwgyhw\.com$ -(^|\.)bwh1\.net$ -(^|\.)bwsj\.hk$ -(^|\.)bx\.in\.th$ -(^|\.)bx\.tl$ -(^|\.)bynet\.co\.il$ -(^|\.)c-est-simple\.com$ -(^|\.)c-spanvideo\.org$ -(^|\.)c100tibet\.org$ -(^|\.)c1522\.mooo\.com$ -(^|\.)c2cx\.com$ -(^|\.)cablegatesearch\.net$ -(^|\.)cachinese\.com$ -(^|\.)cacnw\.com$ -(^|\.)cactusvpn\.com$ -(^|\.)cafepress\.com$ -(^|\.)cahr\.org\.tw$ -(^|\.)calameo\.com$ -(^|\.)calebelston\.com$ -(^|\.)calgarychinese\.ca$ -(^|\.)calgarychinese\.com$ -(^|\.)calgarychinese\.net$ -(^|\.)cam4\.com$ -(^|\.)cam4\.jp$ -(^|\.)cam4\.sg$ -(^|\.)camfrog\.com$ -(^|\.)cams\.com$ -(^|\.)cams\.org\.sg$ -(^|\.)canadameet\.com$ -(^|\.)canalporno\.com$ -(^|\.)canyu\.org$ -(^|\.)cao\.im$ -(^|\.)caobian\.info$ -(^|\.)caochangqing\.com$ -(^|\.)cap\.org\.hk$ -(^|\.)carabinasypistolas\.com$ -(^|\.)cardinalkungfoundation\.org$ -(^|\.)carfax\.com$ -(^|\.)cari\.com\.my$ -(^|\.)caribbeancom\.com$ -(^|\.)carmotorshow\.com$ -(^|\.)cartoonmovement\.com$ -(^|\.)casadeltibetbcn\.org$ -(^|\.)casatibet\.org\.mx$ -(^|\.)casino\.williamhill\.com$ -(^|\.)casinobellini\.com$ -(^|\.)casinoking\.com$ -(^|\.)casinoriva\.com$ -(^|\.)castbox\.fm$ -(^|\.)catch22\.net$ -(^|\.)catchgod\.com$ -(^|\.)catfightpayperview\.xxx$ -(^|\.)catholic\.org\.hk$ -(^|\.)catholic\.org\.tw$ -(^|\.)cathvoice\.org\.tw$ -(^|\.)cattt\.com$ -(^|\.)cbc\.ca$ -(^|\.)cbs\.ntu\.edu\.tw$ -(^|\.)cbsnews\.com$ -(^|\.)cbtc\.org\.hk$ -(^|\.)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$ -(^|\.)cdn$ -(^|\.)cdn-apple\.com$ -(^|\.)cdn-images\.mailchimp\.com$ -(^|\.)cdn\.assets\.lfpcontent\.com$ -(^|\.)cdn\.helixstudios\.net$ -(^|\.)cdn\.printfriendly\.com$ -(^|\.)cdn\.seatguru\.com$ -(^|\.)cdn\.softlayer\.net$ -(^|\.)cdn1\.lp\.saboom\.com$ -(^|\.)cdnews\.com\.tw$ -(^|\.)cdninstagram\.com$ -(^|\.)cdp1989\.org$ -(^|\.)cdp1998\.org$ -(^|\.)cdp2006\.org$ -(^|\.)cdpa\.url\.tw$ -(^|\.)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$ -(^|\.)certificate\.revocationcheck\.com$ -(^|\.)cfhks\.org\.hk$ -(^|\.)cfos\.de$ -(^|\.)cftfc\.com$ -(^|\.)cgdepot\.org$ -(^|\.)cgst\.edu$ -(^|\.)ch\.shvoong\.com$ -(^|\.)change\.org$ -(^|\.)changeip\.name$ -(^|\.)changeip\.net$ -(^|\.)changeip\.org$ -(^|\.)changp\.com$ -(^|\.)changsa\.net$ -(^|\.)channel8news\.sg$ -(^|\.)chaoex\.com$ -(^|\.)chapm25\.com$ -(^|\.)chatnook\.com$ -(^|\.)chaturbate\.com$ -(^|\.)chengmingmag\.com$ -(^|\.)chenguangcheng\.com$ -(^|\.)chenpokong\.com$ -(^|\.)chenpokong\.net$ -(^|\.)chenshan20042005\.wordpress\.com$ -(^|\.)cherrysave\.com$ -(^|\.)chhongbi\.org$ -(^|\.)chicagoncmtv\.com$ -(^|\.)china-mmm\.jp\.net$ -(^|\.)china-mmm\.net$ -(^|\.)china-mmm\.sa\.com$ -(^|\.)china-review\.com\.ua$ -(^|\.)china-week\.com$ -(^|\.)china\.hket\.com$ -(^|\.)china\.ucanews\.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$ -(^|\.)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$ -(^|\.)chinaview\.wordpress\.com$ -(^|\.)chinaway\.org$ -(^|\.)chinaworker\.info$ -(^|\.)chinaxchina\.com$ -(^|\.)chinayouth\.org\.hk$ -(^|\.)chinayuanmin\.org$ -(^|\.)chinese-hermit\.net$ -(^|\.)chinese-leaders\.org$ -(^|\.)chinese-memorial\.org$ -(^|\.)chinese\.donga\.com$ -(^|\.)chinese\.engadget\.com$ -(^|\.)chinese\.irib\.ir$ -(^|\.)chinese\.soifind\.com$ -(^|\.)chinesedaily\.com$ -(^|\.)chinesedailynews\.com$ -(^|\.)chinesedemocracy\.com$ -(^|\.)chinesegay\.org$ -(^|\.)chinesen\.de$ -(^|\.)chinesenews\.net\.au$ -(^|\.)chinesepen\.org$ -(^|\.)chinesetalks\.net$ -(^|\.)chineseupress\.com$ -(^|\.)chingcheong\.com$ -(^|\.)chinman\.net$ -(^|\.)chithu\.org$ -(^|\.)chn\.chosun\.com$ -(^|\.)chobit\.cc$ -(^|\.)chrdnet\.com$ -(^|\.)christianfreedom\.org$ -(^|\.)christianstudy\.com$ -(^|\.)christiantimes\.org\.hk$ -(^|\.)christusrex\.org$ -(^|\.)chrlawyers\.hk$ -(^|\.)chrome\.com$ -(^|\.)chromecast\.com$ -(^|\.)chromeexperiments\.com$ -(^|\.)chromercise\.com$ -(^|\.)chromestatus\.com$ -(^|\.)chromium\.org$ -(^|\.)chuang-yen\.org$ -(^|\.)chubold\.com$ -(^|\.)chubun\.com$ -(^|\.)chuizi\.net$ -(^|\.)churchinhongkong\.org$ -(^|\.)chushigangdrug\.ch$ -(^|\.)cienen\.com$ -(^|\.)cineastentreff\.de$ -(^|\.)cipfg\.org$ -(^|\.)circlethebayfortibet\.org$ -(^|\.)cirosantilli\.com$ -(^|\.)citizencn\.com$ -(^|\.)citizenlab\.org$ -(^|\.)citizenscommission\.hk$ -(^|\.)citizensradio\.org$ -(^|\.)city365\.ca$ -(^|\.)city9x\.com$ -(^|\.)citypopulation\.de$ -(^|\.)citytalk\.tw$ -(^|\.)civicparty\.hk$ -(^|\.)civildisobediencemovement\.org$ -(^|\.)civilhrfront\.org$ -(^|\.)civiliangunner\.com$ -(^|\.)civilmedia\.tw$ -(^|\.)ck101\.com$ -(^|\.)cl\.d0z\.net$ -(^|\.)clarionproject\.org$ -(^|\.)classicalguitarblog\.net$ -(^|\.)clb\.org\.hk$ -(^|\.)cldr\.unicode\.org$ -(^|\.)cleansite\.biz$ -(^|\.)cleansite\.info$ -(^|\.)cleansite\.us$ -(^|\.)clearharmony\.net$ -(^|\.)clearsurance\.com$ -(^|\.)clearwisdom\.net$ -(^|\.)clementine-player\.org$ -(^|\.)cling\.omy\.sg$ -(^|\.)clinica-tibet\.ru$ -(^|\.)clipfish\.de$ -(^|\.)cloakpoint\.com$ -(^|\.)cloud\.feedly\.com$ -(^|\.)cloud\.mail\.ru$ -(^|\.)club1069\.com$ -(^|\.)clyp\.it$ -(^|\.)cmcn\.org$ -(^|\.)cmi\.org\.tw$ -(^|\.)cmp\.hku\.hk$ -(^|\.)cms\.gov$ -(^|\.)cmule\.com$ -(^|\.)cmule\.org$ -(^|\.)cmx\.im$ -(^|\.)cn-proxy\.com$ -(^|\.)cn\.calameo\.com$ -(^|\.)cn\.dayabook\.com$ -(^|\.)cn\.fmnnow\.com$ -(^|\.)cn\.freeones\.com$ -(^|\.)cn\.giganews\.com$ -(^|\.)cn\.ibtimes\.com$ -(^|\.)cn\.nytstyle\.com$ -(^|\.)cn\.sandscotaicentral\.com$ -(^|\.)cn\.shafaqna\.com$ -(^|\.)cn\.streetvoice\.com$ -(^|\.)cn\.thegay\.com$ -(^|\.)cn\.uncyclopedia\.wikia\.com$ -(^|\.)cn\.uptodown\.com$ -(^|\.)cn\.voa\.mobi$ -(^|\.)cn2\.streetvoice\.com$ -(^|\.)cn6\.eu$ -(^|\.)cna\.com\.tw$ -(^|\.)cnabc\.com$ -(^|\.)cnbbnews\.wordpress\.com$ -(^|\.)cnd\.org$ -(^|\.)cnex\.org\.cn$ -(^|\.)cnineu\.com$ -(^|\.)cnn\.com$ -(^|\.)cnnews\.chosun\.com$ -(^|\.)cnpolitics\.org$ -(^|\.)cnproxy\.com$ -(^|\.)co\.ng\.mil$ -(^|\.)coat\.co\.jp$ -(^|\.)cobinhood\.com$ -(^|\.)cochina\.co$ -(^|\.)cochina\.org$ -(^|\.)code1984\.com$ -(^|\.)codeshare\.io$ -(^|\.)codeskulptor\.org$ -(^|\.)coin2co\.in$ -(^|\.)coinbene\.com$ -(^|\.)coinegg\.com$ -(^|\.)coinex\.com$ -(^|\.)coingi\.com$ -(^|\.)coinrail\.co\.kr$ -(^|\.)cointiger\.com$ -(^|\.)cointobe\.com$ -(^|\.)coinut\.com$ -(^|\.)collateralmurder\.com$ -(^|\.)collateralmurder\.org$ -(^|\.)com\.google$ -(^|\.)comefromchina\.com$ -(^|\.)comic-mega\.me$ -(^|\.)commandarms\.com$ -(^|\.)commentshk\.com$ -(^|\.)communistcrimes\.org$ -(^|\.)community\.windy\.com$ -(^|\.)communitychoicecu\.com$ -(^|\.)compileheart\.com$ -(^|\.)compress\.to$ -(^|\.)connect\.facebook\.net$ -(^|\.)conoha\.jp$ -(^|\.)contactmagazine\.net$ -(^|\.)contests\.twilio\.com$ -(^|\.)convio\.net$ -(^|\.)coobay\.com$ -(^|\.)coolaler\.com$ -(^|\.)coolder\.com$ -(^|\.)coolloud\.org\.tw$ -(^|\.)coolncute\.com$ -(^|\.)coolstuffinc\.com$ -(^|\.)corumcollege\.com$ -(^|\.)cos-moe\.com$ -(^|\.)cosmic\.monar\.ch$ -(^|\.)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$ -(^|\.)crrev\.com$ -(^|\.)crucial\.com$ -(^|\.)csdparty\.com$ -(^|\.)css\.pixnet\.in$ -(^|\.)csuchen\.de$ -(^|\.)csw\.org\.uk$ -(^|\.)ct\.org\.tw$ -(^|\.)ctao\.org$ -(^|\.)ctfriend\.net$ -(^|\.)cthlo\.github\.io$ -(^|\.)ctitv\.com\.tw$ -(^|\.)cts\.com\.tw$ -(^|\.)cuhkacs\.org$ -(^|\.)cuihua\.org$ -(^|\.)cuiweiping\.net$ -(^|\.)culture\.tw$ -(^|\.)cumlouder\.com$ -(^|\.)curvefish\.com$ -(^|\.)cusu\.hk$ -(^|\.)cutscenes\.net$ -(^|\.)cw\.com\.tw$ -(^|\.)cyberghost\.natado\.com$ -(^|\.)cyberghostvpn\.com$ -(^|\.)cynscribe\.com$ -(^|\.)cytode\.us$ -(^|\.)d-fukyu\.com$ -(^|\.)d100\.net$ -(^|\.)d1b183sg0nvnuh\.cloudfront\.net$ -(^|\.)d1c37gjwa26taa\.cloudfront\.net$ -(^|\.)d2bay\.com$ -(^|\.)d2pass\.com$ -(^|\.)d3c33hcgiwev3\.cloudfront\.net$ -(^|\.)d3rhr7kgmtrq1v\.cloudfront\.net$ -(^|\.)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$ -(^|\.)dailymotion\.com$ -(^|\.)dailynews\.sina\.com$ -(^|\.)dailynews\.sina\.com%2f$ -(^|\.)dailyview\.tw$ -(^|\.)daiphapinfo\.net$ -(^|\.)dajiyuan\.com$ -(^|\.)dajiyuan\.de$ -(^|\.)dajiyuan\.eu$ -(^|\.)dajusha\.baywords\.com$ -(^|\.)dalailama-archives\.org$ -(^|\.)dalailama\.com$ -(^|\.)dalailama\.mn$ -(^|\.)dalailama\.ru$ -(^|\.)dalailama\.usc\.edu$ -(^|\.)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$ -(^|\.)danbooru\.donmai\.us$ -(^|\.)danke4china\.net$ -(^|\.)danwei\.org$ -(^|\.)daodu14\.jigsy\.com$ -(^|\.)daolan\.net$ -(^|\.)daozhongxing\.org$ -(^|\.)darktech\.org$ -(^|\.)darktoy\.net$ -(^|\.)darpa\.mil$ -(^|\.)dastrassi\.org$ -(^|\.)data-vocabulary\.org$ -(^|\.)data\.flurry\.com$ -(^|\.)data\.gov\.tw$ -(^|\.)david-kilgour\.com$ -(^|\.)dawangidc\.com$ -(^|\.)daxa\.cn$ -(^|\.)daylife\.com$ -(^|\.)db\.tt$ -(^|\.)dbc\.hk$ -(^|\.)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$ -(^|\.)deaftone\.com$ -(^|\.)debug\.com$ -(^|\.)deck\.ly$ -(^|\.)decodet\.co$ -(^|\.)deepmind\.com$ -(^|\.)deezer\.com$ -(^|\.)definebabe\.com$ -(^|\.)deja\.com$ -(^|\.)delcamp\.net$ -(^|\.)delicious\.com$ -(^|\.)demo\.opera-mini\.net$ -(^|\.)democrats\.org$ -(^|\.)depositphotos\.com$ -(^|\.)derekhsu\.homeip\.net$ -(^|\.)desc\.se$ -(^|\.)design\.google$ -(^|\.)desipro\.de$ -(^|\.)dessci\.com$ -(^|\.)destiny\.xfiles\.to$ -(^|\.)destroy-china\.jp$ -(^|\.)deutsche-welle\.de$ -(^|\.)developers\.box\.net$ -(^|\.)devio\.us$ -(^|\.)devpn\.com$ -(^|\.)dfas\.mil$ -(^|\.)dfn\.org$ -(^|\.)dharamsalanet\.com$ -(^|\.)dharmakara\.net$ -(^|\.)dhcp\.biz$ -(^|\.)diaoyuislands\.org$ -(^|\.)dictionary\.goo\.ne\.jp$ -(^|\.)difangwenge\.org$ -(^|\.)digiland\.tw$ -(^|\.)digisfera\.com$ -(^|\.)digitalnomadsproject\.org$ -(^|\.)diigo\.com$ -(^|\.)dilber\.se$ -(^|\.)dingchin\.com\.tw$ -(^|\.)dipity\.com$ -(^|\.)directcreative\.com$ -(^|\.)discoins\.com$ -(^|\.)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$ -(^|\.)dl\.box\.net$ -(^|\.)dlsite\.com$ -(^|\.)dlyoutube\.com$ -(^|\.)dm530\.net$ -(^|\.)dmcdn\.net$ -(^|\.)dmm\.co\.jp$ -(^|\.)dns-dns\.com$ -(^|\.)dns-stuff\.com$ -(^|\.)dns04\.com$ -(^|\.)dns05\.com$ -(^|\.)dns1\.us$ -(^|\.)dns2\.us$ -(^|\.)dns2go\.com$ -(^|\.)dnscrypt\.org$ -(^|\.)dnset\.com$ -(^|\.)dnsrd\.com$ -(^|\.)dnssec\.net$ -(^|\.)dnvod\.tv$ -(^|\.)doctorvoice\.org$ -(^|\.)dogfartnetwork\.com$ -(^|\.)dojin\.com$ -(^|\.)dok-forum\.net$ -(^|\.)dolc\.de$ -(^|\.)dolf\.org\.hk$ -(^|\.)dollf\.com$ -(^|\.)domain\.club\.tw$ -(^|\.)domainhelp\.search\.com$ -(^|\.)domains\.google$ -(^|\.)domaintoday\.com\.au$ -(^|\.)dongtaiwang\.com$ -(^|\.)dongtaiwang\.net$ -(^|\.)dongyangjing\.com$ -(^|\.)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$ -(^|\.)download\.aircrack-ng\.org$ -(^|\.)download\.cnet\.com$ -(^|\.)download\.ithome\.com\.tw$ -(^|\.)dphk\.org$ -(^|\.)dpp\.org\.tw$ -(^|\.)dpr\.info$ -(^|\.)dragonex\.io$ -(^|\.)dragonsprings\.org$ -(^|\.)dreamamateurs\.com$ -(^|\.)drepung\.org$ -(^|\.)drgan\.net$ -(^|\.)drmingxia\.org$ -(^|\.)dropbooks\.tv$ -(^|\.)dropbox\.com$ -(^|\.)dropboxusercontent\.com$ -(^|\.)drsunacademy\.com$ -(^|\.)drtuber\.com$ -(^|\.)dscn\.info$ -(^|\.)dsmtp\.com$ -(^|\.)dstk\.dk$ -(^|\.)dtdns\.net$ -(^|\.)dtiblog\.com$ -(^|\.)dtic\.mil$ -(^|\.)dtwang\.org$ -(^|\.)duanzhihu\.com$ -(^|\.)duck\.com$ -(^|\.)duckdns\.org$ -(^|\.)duckduckgo-owned-server\.yahoo\.net$ -(^|\.)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$ -(^|\.)dvdpac\.com$ -(^|\.)dvorak\.org$ -(^|\.)dw-world\.com$ -(^|\.)dw-world\.de$ -(^|\.)dw\.com$ -(^|\.)dw\.de$ -(^|\.)dwnews\.com$ -(^|\.)dwnews\.net$ -(^|\.)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$ -(^|\.)dynupdate\.no-ip\.com$ -(^|\.)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$ -(^|\.)eastturkistancc\.org$ -(^|\.)eastturkistangovernmentinexile\.us$ -(^|\.)easyca\.ca$ -(^|\.)easypic\.com$ -(^|\.)ebony-beauty\.com$ -(^|\.)ebook\.hyread\.com\.tw$ -(^|\.)ebookbrowse\.com$ -(^|\.)ebookee\.com$ -(^|\.)ebtcbank\.com$ -(^|\.)ecfa\.org\.tw$ -(^|\.)echofon\.com$ -(^|\.)ecimg\.tw$ -(^|\.)ecministry\.net$ -(^|\.)economist\.com$ -(^|\.)ecsm\.vs\.com$ -(^|\.)edgecastcdn\.net$ -(^|\.)edicypages\.com$ -(^|\.)edmontonchina\.cn$ -(^|\.)edmontonservice\.com$ -(^|\.)edns\.biz$ -(^|\.)edoors\.com$ -(^|\.)edubridge\.com$ -(^|\.)edupro\.org$ -(^|\.)eeas\.europa\.eu$ -(^|\.)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$ -(^|\.)embr\.in$ -(^|\.)emilylau\.org\.hk$ -(^|\.)empfil\.com$ -(^|\.)emule-ed2k\.com$ -(^|\.)emulefans\.com$ -(^|\.)emuparadise\.me$ -(^|\.)en\.favotter\.net$ -(^|\.)en\.hao123\.com$ -(^|\.)enanyang\.my$ -(^|\.)enewstree\.com$ -(^|\.)enfal\.de$ -(^|\.)engagedaily\.org$ -(^|\.)englishforeveryone\.org$ -(^|\.)englishfromengland\.co\.uk$ -(^|\.)englishpen\.org$ -(^|\.)enlighten\.org\.tw$ -(^|\.)entermap\.com$ -(^|\.)entnt\.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$ -(^|\.)esurance\.com$ -(^|\.)etaa\.org\.au$ -(^|\.)etadult\.com$ -(^|\.)etaiwannews\.com$ -(^|\.)etherdelta\.com$ -(^|\.)etizer\.org$ -(^|\.)etokki\.com$ -(^|\.)etools\.ncol\.com$ -(^|\.)etowns\.net$ -(^|\.)etowns\.org$ -(^|\.)ettoday\.net$ -(^|\.)etvonline\.hk$ -(^|\.)eu\.org$ -(^|\.)eucasino\.com$ -(^|\.)eulam\.com$ -(^|\.)eurekavpt\.com$ -(^|\.)euronews\.com$ -(^|\.)evchk\.wikia\.com$ -(^|\.)evschool\.net$ -(^|\.)exblog\.jp$ -(^|\.)exchristian\.hk$ -(^|\.)exmo\.com$ -(^|\.)exmormon\.org$ -(^|\.)expatshield\.com$ -(^|\.)expecthim\.com$ -(^|\.)expekt\.com$ -(^|\.)experts-univers\.com$ -(^|\.)exploader\.net$ -(^|\.)expressvpn\.com$ -(^|\.)exrates\.me$ -(^|\.)extmatrix\.com$ -(^|\.)extremetube\.com$ -(^|\.)exx\.com$ -(^|\.)eyevio\.jp$ -(^|\.)eyny\.com$ -(^|\.)ezpc\.tk$ -(^|\.)ezpeer\.com$ -(^|\.)ezua\.com$ -(^|\.)fa\.gov\.tw$ -(^|\.)facebook\.br$ -(^|\.)facebook\.com$ -(^|\.)facebook\.design$ -(^|\.)facebook\.hu$ -(^|\.)facebook\.in$ -(^|\.)facebook\.nl$ -(^|\.)facebook\.se$ -(^|\.)facebookmail\.com$ -(^|\.)facebookquotes4u\.com$ -(^|\.)faceless\.me$ -(^|\.)facesofnyfw\.com$ -(^|\.)facesoftibetanselfimmolators\.info$ -(^|\.)fail\.hk$ -(^|\.)faith100\.org$ -(^|\.)faithfuleye\.com$ -(^|\.)faiththedog\.info$ -(^|\.)fakku\.net$ -(^|\.)falsefire\.com$ -(^|\.)falun-co\.org$ -(^|\.)falun-ny\.net$ -(^|\.)falun\.caltech\.edu$ -(^|\.)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$ -(^|\.)fangbinxing\.com$ -(^|\.)fangeming\.com$ -(^|\.)fangeqiang\.com$ -(^|\.)fanglizhi\.info$ -(^|\.)fangmincn\.org$ -(^|\.)fangong\.forums-free\.com$ -(^|\.)fangong\.org$ -(^|\.)fangongheike\.com$ -(^|\.)fanhaodang\.com$ -(^|\.)fanqiang\.tk$ -(^|\.)fanqianghou\.com$ -(^|\.)fanqiangyakexi\.net$ -(^|\.)fanqiangzhe\.com$ -(^|\.)fanswong\.com$ -(^|\.)fanyue\.info$ -(^|\.)fapdu\.com$ -(^|\.)faproxy\.com$ -(^|\.)faqserv\.com$ -(^|\.)fartit\.com$ -(^|\.)farwestchina\.com$ -(^|\.)fast\.wistia\.com$ -(^|\.)fastpic\.ru$ -(^|\.)fastssh\.com$ -(^|\.)faststone\.org$ -(^|\.)fatbtc\.com$ -(^|\.)favstar\.fm$ -(^|\.)fawanghuihui\.org$ -(^|\.)faydao\.com$ -(^|\.)fb\.com$ -(^|\.)fb\.me$ -(^|\.)fbaddins\.com$ -(^|\.)fbcdn\.net$ -(^|\.)fbsbx\.com$ -(^|\.)fbworkmail\.com$ -(^|\.)fc2\.com$ -(^|\.)fc2blog\.net$ -(^|\.)fc2china\.com$ -(^|\.)fc2cn\.com$ -(^|\.)fda\.gov\.tw$ -(^|\.)fdc64\.de$ -(^|\.)fdc64\.org$ -(^|\.)fdc89\.jp$ -(^|\.)feedburner\.com$ -(^|\.)feeds\.fileforum\.com$ -(^|\.)feelssh\.com$ -(^|\.)feer\.com$ -(^|\.)feifeiss\.com$ -(^|\.)feitian-california\.org$ -(^|\.)feitianacademy\.org$ -(^|\.)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$ -(^|\.)files2me\.com$ -(^|\.)fileserve\.com$ -(^|\.)filesor\.com$ -(^|\.)fillthesquare\.org$ -(^|\.)filmingfortibet\.org$ -(^|\.)filmy\.olabloga\.pl$ -(^|\.)filthdump\.com$ -(^|\.)financetwitter\.com$ -(^|\.)finchvpn\.com$ -(^|\.)findmespot\.com$ -(^|\.)findyoutube\.com$ -(^|\.)findyoutube\.net$ -(^|\.)fingerdaily\.com$ -(^|\.)finler\.net$ -(^|\.)firearmsworld\.net$ -(^|\.)firebaseio\.com$ -(^|\.)fireofliberty\.org$ -(^|\.)firetweet\.io$ -(^|\.)firstfivefollowers\.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$ -(^|\.)flyvpn\.com$ -(^|\.)flyzy2005\.com$ -(^|\.)fnac\.be$ -(^|\.)fnac\.com$ -(^|\.)fochk\.org$ -(^|\.)focustaiwan\.tw$ -(^|\.)focusvpn\.com$ -(^|\.)fofg-europe\.net$ -(^|\.)fofg\.org$ -(^|\.)fofldfradio\.org$ -(^|\.)fooooo\.com$ -(^|\.)footwiball\.com$ -(^|\.)foreignpolicy\.com$ -(^|\.)forum\.baby-kingdom\.com$ -(^|\.)forum\.cyberctm\.com$ -(^|\.)forum\.idsam\.com$ -(^|\.)forum\.my903\.com$ -(^|\.)forum\.mymaji\.com$ -(^|\.)forum\.omy\.sg$ -(^|\.)forum\.palmislife\.com$ -(^|\.)forum\.setty\.com\.tw$ -(^|\.)forum\.sina\.com\.hk$ -(^|\.)forum\.slime\.com\.tw$ -(^|\.)forum\.tvb\.com$ -(^|\.)forum\.xinbao\.de$ -(^|\.)forum4hk\.com$ -(^|\.)fotile\.me$ -(^|\.)fourface\.nodesnoop\.com$ -(^|\.)fourthinternational\.org$ -(^|\.)foxdie\.us$ -(^|\.)foxgay\.com$ -(^|\.)foxsub\.com$ -(^|\.)foxtang\.com$ -(^|\.)fpmt-osel\.org$ -(^|\.)fpmt\.org$ -(^|\.)fpmt\.tw$ -(^|\.)fpmtmexico\.org$ -(^|\.)fq\.wikia\.com$ -(^|\.)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$ -(^|\.)freebrowser\.org$ -(^|\.)freechal\.com$ -(^|\.)freechina\.net$ -(^|\.)freechina\.news$ -(^|\.)freechinaforum\.org$ -(^|\.)freechinaweibo\.com$ -(^|\.)freeddns\.com$ -(^|\.)freeddns\.org$ -(^|\.)freedomchina\.info$ -(^|\.)freedomcollection\.org$ -(^|\.)freedomhouse\.org$ -(^|\.)freedominfonetweb\.wordpress\.com$ -(^|\.)freedomsherald\.org$ -(^|\.)freeforums\.org$ -(^|\.)freefq\.com$ -(^|\.)freefuckvids\.com$ -(^|\.)freegao\.com$ -(^|\.)freeilhamtohti\.org$ -(^|\.)freekwonpyong\.org$ -(^|\.)freelotto\.com$ -(^|\.)freeman2\.com$ -(^|\.)freemoren\.com$ -(^|\.)freemorenews\.com$ -(^|\.)freemuse\.org$ -(^|\.)freenet$ -(^|\.)freenet-china\.org$ -(^|\.)freenetproject\.org$ -(^|\.)freenewscn\.com$ -(^|\.)freeopenvpn\.com$ -(^|\.)freeoz\.org$ -(^|\.)freessh\.us$ -(^|\.)freetcp\.com$ -(^|\.)freetibet\.net$ -(^|\.)freetibet\.org$ -(^|\.)freetibetanheroes\.org$ -(^|\.)freeviewmovies\.com$ -(^|\.)freevpn\.me$ -(^|\.)freevpn\.nl$ -(^|\.)freewallpaper4\.me$ -(^|\.)freewebs\.com$ -(^|\.)freewechat\.com$ -(^|\.)freeweibo\.com$ -(^|\.)freewww\.biz$ -(^|\.)freewww\.info$ -(^|\.)freexinwen\.com$ -(^|\.)freeyellow\.com$ -(^|\.)freeyoutubeproxy\.net$ -(^|\.)friendfeed-media\.com$ -(^|\.)friendfeed\.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$ -(^|\.)fucd\.com$ -(^|\.)fuckcnnic\.net$ -(^|\.)fuckgfw\.org$ -(^|\.)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$ -(^|\.)gabocorp\.com$ -(^|\.)gaeproxy\.com$ -(^|\.)gaforum\.org$ -(^|\.)galaxymacau\.com$ -(^|\.)galenwu\.com$ -(^|\.)galstars\.net$ -(^|\.)game735\.com$ -(^|\.)gamebase\.com\.tw$ -(^|\.)gamejolt\.com$ -(^|\.)gamer-cds\.cdn\.hinet\.net$ -(^|\.)gamer\.com\.tw$ -(^|\.)gamer2-cds\.cdn\.hinet\.net$ -(^|\.)gamez\.com\.tw$ -(^|\.)gamousa\.com$ -(^|\.)ganges\.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$ -(^|\.)gcmasia\.com$ -(^|\.)gcpnews\.com$ -(^|\.)gcr\.io$ -(^|\.)gdbt\.net$ -(^|\.)gdzf\.org$ -(^|\.)geek-art\.net$ -(^|\.)geekerhome\.com$ -(^|\.)geekheart\.info$ -(^|\.)gekikame\.com$ -(^|\.)gelbooru\.com$ -(^|\.)geocities\.co\.jp$ -(^|\.)geocities\.com$ -(^|\.)geocities\.jp$ -(^|\.)gerefoundation\.org$ -(^|\.)get\.app$ -(^|\.)get\.how$ -(^|\.)get\.page$ -(^|\.)getastrill\.com$ -(^|\.)getchu\.com$ -(^|\.)getcloak\.com$ -(^|\.)getfoxyproxy\.org$ -(^|\.)getfreedur\.com$ -(^|\.)getgom\.com$ -(^|\.)geti2p\.net$ -(^|\.)getiton\.com$ -(^|\.)getjetso\.com$ -(^|\.)getlantern\.org$ -(^|\.)getmdl\.io$ -(^|\.)getoutline\.org$ -(^|\.)getsocialscope\.com$ -(^|\.)getsync\.com$ -(^|\.)gettrials\.com$ -(^|\.)gettyimages\.com$ -(^|\.)getuploader\.com$ -(^|\.)gfbv\.de$ -(^|\.)gfgold\.com\.hk$ -(^|\.)gfsale\.com$ -(^|\.)gfw\.org\.ua$ -(^|\.)gfw\.press$ -(^|\.)ggpht\.com$ -(^|\.)ggssl\.com$ -(^|\.)ghostpath\.com$ -(^|\.)ghut\.org$ -(^|\.)giantessnight\.com$ -(^|\.)gifree\.com$ -(^|\.)giga-web\.jp$ -(^|\.)gigporno\.ru$ -(^|\.)girlbanker\.com$ -(^|\.)git\.io$ -(^|\.)github\.com$ -(^|\.)gizlen\.net$ -(^|\.)gjczz\.com$ -(^|\.)glass8\.eu$ -(^|\.)global\.bing\.com$ -(^|\.)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$ -(^|\.)gmbd\.cn$ -(^|\.)gmhz\.org$ -(^|\.)gmll\.org$ -(^|\.)gmodules\.com$ -(^|\.)gmozomg\.izihost\.org$ -(^|\.)gnci\.org\.hk$ -(^|\.)go-pki\.com$ -(^|\.)go\.nesnode\.com$ -(^|\.)go141\.com$ -(^|\.)goagent\.biz$ -(^|\.)goagent\.codeplex\.com$ -(^|\.)goagentplus\.com$ -(^|\.)gobet\.cc$ -(^|\.)godfootsteps\.org$ -(^|\.)godns\.work$ -(^|\.)godoc\.org$ -(^|\.)godsdirectcontact\.co\.uk$ -(^|\.)godsdirectcontact\.org$ -(^|\.)godsdirectcontact\.org\.tw$ -(^|\.)godsimmediatecontact\.com$ -(^|\.)gogotunnel\.com$ -(^|\.)gohappy\.com\.tw$ -(^|\.)gojet\.krtco\.com\.tw$ -(^|\.)gokbayrak\.com$ -(^|\.)golang\.org$ -(^|\.)goldbet\.com$ -(^|\.)goldbetsports\.com$ -(^|\.)goldeneyevault\.com$ -(^|\.)goldenfrog\.com$ -(^|\.)goldjizz\.com$ -(^|\.)goldstep\.net$ -(^|\.)goldwave\.com$ -(^|\.)gongm\.in$ -(^|\.)gongmeng\.info$ -(^|\.)gongminliliang\.com$ -(^|\.)gongwt\.com$ -(^|\.)goo\.gl$ -(^|\.)gooday\.xyz$ -(^|\.)gooddns\.info$ -(^|\.)goodreaders\.com$ -(^|\.)goodreads\.com$ -(^|\.)goodtv\.com\.tw$ -(^|\.)goodtv\.tv$ -(^|\.)goofind\.com$ -(^|\.)google\.ae$ -(^|\.)google\.am$ -(^|\.)google\.as$ -(^|\.)google\.at$ -(^|\.)google\.az$ -(^|\.)google\.ba$ -(^|\.)google\.be$ -(^|\.)google\.bg$ -(^|\.)google\.ca$ -(^|\.)google\.calstate\.edu$ -(^|\.)google\.cd$ -(^|\.)google\.ci$ -(^|\.)google\.co\.id$ -(^|\.)google\.co\.jp$ -(^|\.)google\.co\.kr$ -(^|\.)google\.co\.ma$ -(^|\.)google\.co\.uk$ -(^|\.)google\.com$ -(^|\.)google\.de$ -(^|\.)google\.dj$ -(^|\.)google\.dk$ -(^|\.)google\.es$ -(^|\.)google\.fi$ -(^|\.)google\.fm$ -(^|\.)google\.fr$ -(^|\.)google\.gg$ -(^|\.)google\.gl$ -(^|\.)google\.gr$ -(^|\.)google\.ie$ -(^|\.)google\.is$ -(^|\.)google\.it$ -(^|\.)google\.jo$ -(^|\.)google\.kz$ -(^|\.)google\.lv$ -(^|\.)google\.mn$ -(^|\.)google\.ms$ -(^|\.)google\.nl$ -(^|\.)google\.no$ -(^|\.)google\.nu$ -(^|\.)google\.ro$ -(^|\.)google\.ru$ -(^|\.)google\.rw$ -(^|\.)google\.sc$ -(^|\.)google\.sh$ -(^|\.)google\.sk$ -(^|\.)google\.sm$ -(^|\.)google\.sn$ -(^|\.)google\.tk$ -(^|\.)google\.tm$ -(^|\.)google\.to$ -(^|\.)google\.tt$ -(^|\.)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$ -(^|\.)googlegroups\.com$ -(^|\.)googlehosted\.com$ -(^|\.)googleideas\.com$ -(^|\.)googleinsidesearch\.com$ -(^|\.)googlelabs\.com$ -(^|\.)googlemail\.com$ -(^|\.)googlemashups\.com$ -(^|\.)googlepagecreator\.com$ -(^|\.)googleplay\.com$ -(^|\.)googleplus\.com$ -(^|\.)googlescholar\.com$ -(^|\.)googlesile\.com$ -(^|\.)googlesource\.com$ -(^|\.)googleusercontent\.com$ -(^|\.)googlevideo\.com$ -(^|\.)googleweblight\.com$ -(^|\.)googlezip\.net$ -(^|\.)gopetition\.com$ -(^|\.)goproxing\.net$ -(^|\.)goregrish\.com$ -(^|\.)gospelherald\.com$ -(^|\.)got-game\.org$ -(^|\.)gotdns\.ch$ -(^|\.)gotgeeks\.com$ -(^|\.)gotrusted\.com$ -(^|\.)gotw\.ca$ -(^|\.)gov\.taipei$ -(^|\.)gov\.tw$ -(^|\.)gr8domain\.biz$ -(^|\.)gr8name\.biz$ -(^|\.)grammaly\.com$ -(^|\.)grandtrial\.org$ -(^|\.)grangorz\.org$ -(^|\.)graphis\.ne\.jp$ -(^|\.)graphql\.org$ -(^|\.)greasespot\.net$ -(^|\.)great-firewall\.com$ -(^|\.)great-roc\.org$ -(^|\.)greatfire\.org$ -(^|\.)greatfire\.us7\.list-manage\.com$ -(^|\.)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$ -(^|\.)groups\.google\.cn$ -(^|\.)grow\.google$ -(^|\.)gs-discuss\.com$ -(^|\.)gsp\.target\.com$ -(^|\.)gstatic\.com$ -(^|\.)gtricks\.com$ -(^|\.)gts-vpn\.com$ -(^|\.)gu-chu-sum\.org$ -(^|\.)guaguass\.com$ -(^|\.)guaguass\.org$ -(^|\.)guancha\.org$ -(^|\.)guaneryu\.com$ -(^|\.)guangming\.com\.my$ -(^|\.)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$ -(^|\.)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$ -(^|\.)hackthatphone\.net$ -(^|\.)hahaxixi\.github\.io$ -(^|\.)hahlo\.com$ -(^|\.)hakkatv\.org\.tw$ -(^|\.)handcraftedsoftware\.org$ -(^|\.)hanunyi\.com$ -(^|\.)hao\.news$ -(^|\.)haoel\.github\.io$ -(^|\.)happy-vpn\.com$ -(^|\.)haproxy\.org$ -(^|\.)hardsextube\.com$ -(^|\.)harunyahya\.com$ -(^|\.)hautelook\.com$ -(^|\.)hautelookcdn\.com$ -(^|\.)have8\.com$ -(^|\.)hbg\.com$ -(^|\.)hbo\.com$ -(^|\.)hclips\.com$ -(^|\.)hd\.stheadline\.com$ -(^|\.)hdlt\.me$ -(^|\.)hdtvb\.net$ -(^|\.)hdzog\.com$ -(^|\.)heartyit\.com$ -(^|\.)heavy-r\.com$ -(^|\.)hec\.su$ -(^|\.)hecaitou\.net$ -(^|\.)hechaji\.com$ -(^|\.)heeact\.edu\.tw$ -(^|\.)hegre-art\.com$ -(^|\.)heix\.pp\.ru$ -(^|\.)helloandroid\.com$ -(^|\.)helloqueer\.com$ -(^|\.)helloss\.pw$ -(^|\.)hellotxt\.com$ -(^|\.)hellouk\.org$ -(^|\.)help\.linksalpha\.com$ -(^|\.)helpeachpeople\.com$ -(^|\.)helplinfen\.com$ -(^|\.)helpster\.de$ -(^|\.)helpzhuling\.org$ -(^|\.)hentai\.to$ -(^|\.)hentaitube\.tv$ -(^|\.)hentaivideoworld\.com$ -(^|\.)heqinglian\.net$ -(^|\.)heungkongdiscuss\.com$ -(^|\.)hexieshe\.com$ -(^|\.)hexieshe\.xyz$ -(^|\.)hexxeh\.net$ -(^|\.)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$ -(^|\.)hihiforum\.com$ -(^|\.)hihistory\.net$ -(^|\.)hiitch\.com$ -(^|\.)hikinggfw\.org$ -(^|\.)hilive\.tv$ -(^|\.)himalayan-foundation\.org$ -(^|\.)himalayanglacier\.com$ -(^|\.)himemix\.com$ -(^|\.)himemix\.net$ -(^|\.)hitbtc\.com$ -(^|\.)hitomi\.la$ -(^|\.)hiwifi\.com$ -(^|\.)hizb-ut-tahrir\.info$ -(^|\.)hizb-ut-tahrir\.org$ -(^|\.)hizbuttahrir\.org$ -(^|\.)hjclub\.info$ -(^|\.)hk-pub\.com$ -(^|\.)hk\.frienddy\.com$ -(^|\.)hk\.geocities\.com$ -(^|\.)hk\.gradconnection\.com$ -(^|\.)hk\.hao123img\.com$ -(^|\.)hk\.jiepang\.com$ -(^|\.)hk\.knowledge\.yahoo\.com$ -(^|\.)hk\.myblog\.yahoo\.com$ -(^|\.)hk\.news\.yahoo\.com$ -(^|\.)hk\.rd\.yahoo\.com$ -(^|\.)hk\.search\.yahoo\.com$ -(^|\.)hk\.video\.news\.yahoo\.com$ -(^|\.)hk\.yahoo\.com$ -(^|\.)hk01\.com$ -(^|\.)hk32168\.com$ -(^|\.)hka8964\.wordpress\.com$ -(^|\.)hkacg\.com$ -(^|\.)hkacg\.net$ -(^|\.)hkanews\.wordpress\.com$ -(^|\.)hkatvnews\.com$ -(^|\.)hkbc\.net$ -(^|\.)hkbf\.org$ -(^|\.)hkbookcity\.com$ -(^|\.)hkchurch\.org$ -(^|\.)hkci\.org\.hk$ -(^|\.)hkcmi\.edu$ -(^|\.)hkcnews\.com$ -(^|\.)hkcoc\.com$ -(^|\.)hkcoc\.weather\.com\.hk$ -(^|\.)hkdailynews\.com\.hk$ -(^|\.)hkday\.net$ -(^|\.)hkdf\.org$ -(^|\.)hkej\.com$ -(^|\.)hkepc\.com$ -(^|\.)hkfaa\.com$ -(^|\.)hkfreezone\.com$ -(^|\.)hkfront\.org$ -(^|\.)hkgalden\.com$ -(^|\.)hkgolden\.com$ -(^|\.)hkgreenradio\.org$ -(^|\.)hkheadline\.com$ -(^|\.)hkhkhk\.com$ -(^|\.)hkhrc\.org\.hk$ -(^|\.)hkhrm\.org\.hk$ -(^|\.)hkip\.org\.uk$ -(^|\.)hkjc\.com$ -(^|\.)hkjp\.org$ -(^|\.)hklft\.com$ -(^|\.)hklts\.org\.hk$ -(^|\.)hkptu\.org$ -(^|\.)hkreporter\.com$ -(^|\.)hkreporter\.loved\.hk$ -(^|\.)hkupop\.hku\.hk$ -(^|\.)hkusu\.net$ -(^|\.)hkvwet\.com$ -(^|\.)hkwcc\.org\.hk$ -(^|\.)hkzone\.org$ -(^|\.)hmonghot\.com$ -(^|\.)hmv\.co\.jp$ -(^|\.)hmvdigital\.ca$ -(^|\.)hmvdigital\.com$ -(^|\.)hnjhj\.com$ -(^|\.)hnntube\.com$ -(^|\.)hola\.com$ -(^|\.)hola\.org$ -(^|\.)holymountaincn\.com$ -(^|\.)holyspiritspeaks\.org$ -(^|\.)home\.sina\.com$ -(^|\.)home\.so-net\.net\.tw$ -(^|\.)homedepot\.com$ -(^|\.)homeperversion\.com$ -(^|\.)homeservershow\.com$ -(^|\.)hongkongfp\.com$ -(^|\.)hongmeimei\.com$ -(^|\.)hongzhi\.li$ -(^|\.)hootsuite\.com$ -(^|\.)hoovers\.com$ -(^|\.)hopedialogue\.org$ -(^|\.)hopto\.org$ -(^|\.)hornygamer\.com$ -(^|\.)hornytrip\.com$ -(^|\.)hotav\.tv$ -(^|\.)hotels\.cn$ -(^|\.)hotfrog\.com\.tw$ -(^|\.)hotgoo\.com$ -(^|\.)hotpornshow\.com$ -(^|\.)hotpot\.hk$ -(^|\.)hotshame\.com$ -(^|\.)hotspotshield\.com$ -(^|\.)hotvpn\.com$ -(^|\.)hougaige\.com$ -(^|\.)howtoforge\.com$ -(^|\.)hoxx\.com$ -(^|\.)hpa\.gov\.tw$ -(^|\.)hqcdp\.org$ -(^|\.)hqjapanesesex\.com$ -(^|\.)hqmovies\.com$ -(^|\.)hqsbnet\.wordpress\.com$ -(^|\.)hqsbonline\.wordpress\.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$ -(^|\.)https$ -(^|\.)https443\.net$ -(^|\.)https443\.org$ -(^|\.)hua-yue\.net$ -(^|\.)huaglad\.com$ -(^|\.)huanghuagang\.org$ -(^|\.)huangyiyu\.com$ -(^|\.)huaren\.us$ -(^|\.)huaren4us\.com$ -(^|\.)huashangnews\.com$ -(^|\.)huaxia-news\.com$ -(^|\.)huaxiabao\.org$ -(^|\.)huaxin\.ph$ -(^|\.)huayuworld\.org$ -(^|\.)hudatoriq\.web\.id$ -(^|\.)hudson\.org$ -(^|\.)huffingtonpost\.com$ -(^|\.)hugoroy\.eu$ -(^|\.)huhaitai\.com$ -(^|\.)huhamhire\.com$ -(^|\.)huiyi\.in$ -(^|\.)hulkshare\.com$ -(^|\.)hulu\.com$ -(^|\.)huluim\.com$ -(^|\.)hum$ -(^|\.)humanrightsbriefing\.org$ -(^|\.)hung-ya\.com$ -(^|\.)hungerstrikeforaids\.org$ -(^|\.)huobi\.com$ -(^|\.)huobi\.pro$ -(^|\.)huobipro\.com$ -(^|\.)huping\.net$ -(^|\.)hurgokbayrak\.com$ -(^|\.)hurriyet\.com\.tr$ -(^|\.)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$ -(^|\.)i-cable\.com$ -(^|\.)i-part\.com\.tw$ -(^|\.)i\.lithium\.com$ -(^|\.)i1\.hk$ -(^|\.)i2p2\.de$ -(^|\.)i2runner\.com$ -(^|\.)i818hk\.com$ -(^|\.)iam\.soy$ -(^|\.)iamtopone\.com$ -(^|\.)iask\.bz$ -(^|\.)iask\.ca$ -(^|\.)iav19\.com$ -(^|\.)ibiblio\.org$ -(^|\.)iblist\.com$ -(^|\.)iblogserv-f\.net$ -(^|\.)ibros\.org$ -(^|\.)ibvpn\.com$ -(^|\.)icams\.com$ -(^|\.)ice\.audionow\.com$ -(^|\.)icij\.org$ -(^|\.)icl-fi\.org$ -(^|\.)icoco\.com$ -(^|\.)iconpaper\.org$ -(^|\.)icu-project\.org$ -(^|\.)id\.hao123\.com$ -(^|\.)id\.heroku\.com$ -(^|\.)iddddg\.com$ -(^|\.)idemocracy\.asia$ -(^|\.)identi\.ca$ -(^|\.)idiomconnection\.com$ -(^|\.)idouga\.com$ -(^|\.)idreamx\.com$ -(^|\.)idv\.tw$ -(^|\.)ieasy5\.com$ -(^|\.)ied2k\.net$ -(^|\.)ienergy1\.com$ -(^|\.)if\.ttt$ -(^|\.)ifan\.cz\.cc$ -(^|\.)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$ -(^|\.)iipdigital\.usembassy\.gov$ -(^|\.)ikstar\.com$ -(^|\.)ikwb\.com$ -(^|\.)illusionfactory\.com$ -(^|\.)ilove80\.be$ -(^|\.)ilovelongtoes\.com$ -(^|\.)im\.tv$ -(^|\.)im88\.tw$ -(^|\.)imageab\.com$ -(^|\.)imagefap\.com$ -(^|\.)imageflea\.com$ -(^|\.)images-gaytube\.com$ -(^|\.)images\.comico\.tw$ -(^|\.)imageshack\.us$ -(^|\.)imagevenue\.com$ -(^|\.)imagezilla\.net$ -(^|\.)imb\.org$ -(^|\.)imdb\.com$ -(^|\.)img$ -(^|\.)img\.dlsite\.jp$ -(^|\.)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$ -(^|\.)in99\.org$ -(^|\.)incapdns\.net$ -(^|\.)incloak\.com$ -(^|\.)incredibox\.fr$ -(^|\.)indiandefensenews\.in$ -(^|\.)indiemerch\.com$ -(^|\.)info-graf\.fr$ -(^|\.)initiativesforchina\.org$ -(^|\.)inkui\.com$ -(^|\.)inmediahk\.net$ -(^|\.)innermongolia\.org$ -(^|\.)inote\.tw$ -(^|\.)insecam\.org$ -(^|\.)insidevoa\.com$ -(^|\.)instagram\.com$ -(^|\.)instanthq\.com$ -(^|\.)institut-tibetain\.org$ -(^|\.)international-news\.newsmagazine\.asia$ -(^|\.)internet\.org$ -(^|\.)internetdefenseleague\.org$ -(^|\.)internetfreedom\.org$ -(^|\.)internetpopculture\.com$ -(^|\.)inthenameofconfuciusmovie\.com$ -(^|\.)investigating\.wordpress\.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$ -(^|\.)iredmail\.org$ -(^|\.)ironbigfools\.compython\.net$ -(^|\.)ironpython\.net$ -(^|\.)ironsocket\.com$ -(^|\.)is-a-hunter\.com$ -(^|\.)is\.gd$ -(^|\.)isaacmao\.com$ -(^|\.)isasecret\.com$ -(^|\.)isc\.sans\.edu$ -(^|\.)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$ -(^|\.)istiqlalhewer\.com$ -(^|\.)istockphoto\.com$ -(^|\.)isunaffairs\.com$ -(^|\.)isuntv\.com$ -(^|\.)itaboo\.info$ -(^|\.)itaiwan\.gov\.tw$ -(^|\.)italiatibet\.org$ -(^|\.)itasoftware\.com$ -(^|\.)itemdb\.com$ -(^|\.)ithelp\.ithome\.com\.tw$ -(^|\.)its\.caltech\.edu$ -(^|\.)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$ -(^|\.)izaobao\.us$ -(^|\.)izles\.net$ -(^|\.)izlesem\.org$ -(^|\.)j\.mp$ -(^|\.)ja\.wikipedia\.org$ -(^|\.)jamaat\.org$ -(^|\.)jamyangnorbu\.com$ -(^|\.)jandyx\.com$ -(^|\.)janwongphoto\.com$ -(^|\.)japan-whores\.com$ -(^|\.)japanfirst\.asianfreeforum\.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$ -(^|\.)jiehua\.cz$ -(^|\.)jieshibaobao\.com$ -(^|\.)jigglegifs\.com$ -(^|\.)jigong1024\.com$ -(^|\.)jihadintel\.meforum\.org$ -(^|\.)jihadology\.net$ -(^|\.)jiji\.com$ -(^|\.)jims\.net$ -(^|\.)jinbushe\.org$ -(^|\.)jingpin\.org$ -(^|\.)jingsim\.org$ -(^|\.)jinpianwang\.com$ -(^|\.)jinroukong\.com$ -(^|\.)jintian\.net$ -(^|\.)jinx\.com$ -(^|\.)jitouch\.com$ -(^|\.)jizzthis\.com$ -(^|\.)jjgirls\.com$ -(^|\.)jkb\.cc$ -(^|\.)jkforum\.net$ -(^|\.)jkub\.com$ -(^|\.)jma\.go\.jp$ -(^|\.)jmscult\.com$ -(^|\.)joachims\.org$ -(^|\.)jobnewera\.wordpress\.com$ -(^|\.)jobso\.tv$ -(^|\.)joinmastodon\.org$ -(^|\.)journalchretien\.net$ -(^|\.)journalofdemocracy\.org$ -(^|\.)joymiihub\.com$ -(^|\.)joyourself\.com$ -(^|\.)jp\.hao123\.com$ -(^|\.)jpl\.nasa\.gov$ -(^|\.)jpopforum\.net$ -(^|\.)jtvnw\.net$ -(^|\.)jubushoushen\.com$ -(^|\.)juhuaren\.com$ -(^|\.)jukujo-club\.com$ -(^|\.)juliepost\.com$ -(^|\.)juliereyc\.com$ -(^|\.)junauza\.com$ -(^|\.)june4commemoration\.org$ -(^|\.)junefourth-20\.net$ -(^|\.)jungleheart\.com$ -(^|\.)juoaa\.com$ -(^|\.)justdied\.com$ -(^|\.)justfreevpn\.com$ -(^|\.)justicefortenzin\.org$ -(^|\.)justpaste\.it$ -(^|\.)justtristan\.com$ -(^|\.)juyuange\.org$ -(^|\.)juziyue\.com$ -(^|\.)jwmusic\.org$ -(^|\.)jyxf\.net$ -(^|\.)k-doujin\.net$ -(^|\.)ka-wai\.com$ -(^|\.)kagyu\.org$ -(^|\.)kagyu\.org\.za$ -(^|\.)kagyumonlam\.org$ -(^|\.)kagyunews\.com\.hk$ -(^|\.)kagyuoffice\.org$ -(^|\.)kagyuoffice\.org\.tw$ -(^|\.)kaiyuan\.de$ -(^|\.)kakao\.com$ -(^|\.)kalachakralugano\.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$ -(^|\.)kb\.monitorware\.com$ -(^|\.)kba-tx\.org$ -(^|\.)kcoolonline\.com$ -(^|\.)kebrum\.com$ -(^|\.)kechara\.com$ -(^|\.)keepandshare\.com$ -(^|\.)keezmovies\.com$ -(^|\.)kendatire\.com$ -(^|\.)kendincos\.net$ -(^|\.)kenengba\.com$ -(^|\.)keontech\.net$ -(^|\.)kepard\.com$ -(^|\.)kex\.com$ -(^|\.)keycdn\.com$ -(^|\.)khabdha\.org$ -(^|\.)khatrimaza\.org$ -(^|\.)khmusic\.com\.tw$ -(^|\.)kichiku-doujinko\.com$ -(^|\.)kik\.com$ -(^|\.)killwall\.com$ -(^|\.)kindleren\.com$ -(^|\.)kineox\.free\.fr$ -(^|\.)kingdomsalvation\.org$ -(^|\.)kinghost\.com$ -(^|\.)kingstone\.com\.tw$ -(^|\.)kink\.com$ -(^|\.)kinmen\.org\.tw$ -(^|\.)kinmen\.travel$ -(^|\.)kir\.jp$ -(^|\.)kissbbao\.cn$ -(^|\.)kiwi\.kz$ -(^|\.)kk-whys\.co\.jp$ -(^|\.)kkbox\.com$ -(^|\.)kknews\.cc$ -(^|\.)kmuh\.org\.tw$ -(^|\.)knowledgerush\.com$ -(^|\.)kobo\.com$ -(^|\.)kobobooks\.com$ -(^|\.)kodingen\.com$ -(^|\.)kompozer\.net$ -(^|\.)konachan\.com$ -(^|\.)kone\.com$ -(^|\.)koolsolutions\.com$ -(^|\.)koornk\.com$ -(^|\.)koranmandarin\.com$ -(^|\.)korenan2\.com$ -(^|\.)ksdl\.org$ -(^|\.)ksnews\.com\.tw$ -(^|\.)kspcoin\.com$ -(^|\.)ktzhk\.com$ -(^|\.)kucoin\.com$ -(^|\.)kui\.name$ -(^|\.)kun\.im$ -(^|\.)kurashsultan\.com$ -(^|\.)kurtmunger\.com$ -(^|\.)kusocity\.com$ -(^|\.)kwcg\.ca$ -(^|\.)kwongwah\.com\.my$ -(^|\.)kxsw\.life$ -(^|\.)kyofun\.com$ -(^|\.)kyohk\.net$ -(^|\.)kyoyue\.com$ -(^|\.)kyzyhello\.com$ -(^|\.)kzeng\.info$ -(^|\.)la-forum\.org$ -(^|\.)labiennale\.org$ -(^|\.)ladbrokes\.com$ -(^|\.)lagranepoca\.com$ -(^|\.)lalulalu\.com$ -(^|\.)lama\.com\.tw$ -(^|\.)lamayeshe\.com$ -(^|\.)lamnia\.co\.uk$ -(^|\.)lamrim\.com$ -(^|\.)lanterncn\.cn$ -(^|\.)lantosfoundation\.org$ -(^|\.)laod\.cn$ -(^|\.)laogai\.org$ -(^|\.)laomiu\.com$ -(^|\.)laoyang\.info$ -(^|\.)laptoplockdown\.com$ -(^|\.)laqingdan\.net$ -(^|\.)larsgeorge\.com$ -(^|\.)lastcombat\.com$ -(^|\.)lastfm\.es$ -(^|\.)latelinenews\.com$ -(^|\.)latibet\.org$ -(^|\.)lbank\.info$ -(^|\.)ld\.hao123img\.com$ -(^|\.)le-vpn\.com$ -(^|\.)leafyvpn\.net$ -(^|\.)lecloud\.net$ -(^|\.)leeao\.com\.cn$ -(^|\.)lefora\.com$ -(^|\.)left21\.hk$ -(^|\.)legalporno\.com$ -(^|\.)legaltech\.law\.com$ -(^|\.)legsjapan\.com$ -(^|\.)leirentv\.ca$ -(^|\.)leisurecafe\.ca$ -(^|\.)leisurepro\.com$ -(^|\.)lematin\.ch$ -(^|\.)lemonde\.fr$ -(^|\.)lenwhite\.com$ -(^|\.)lerosua\.org$ -(^|\.)lers\.google$ -(^|\.)lesoir\.be$ -(^|\.)letou\.com$ -(^|\.)letscorp\.net$ -(^|\.)lflink\.com$ -(^|\.)lflinkup\.com$ -(^|\.)lflinkup\.net$ -(^|\.)lflinkup\.org$ -(^|\.)lhakar\.org$ -(^|\.)lhasocialwork\.org$ -(^|\.)liangyou\.net$ -(^|\.)liangzhichuanmei\.com$ -(^|\.)lianyue\.net$ -(^|\.)liaowangxizang\.net$ -(^|\.)liberal\.org\.hk$ -(^|\.)libertytimes\.com\.tw$ -(^|\.)library\.usc\.cuhk\.edu\.hk$ -(^|\.)lidecheng\.com$ -(^|\.)lifemiles\.com$ -(^|\.)lighten\.org\.tw$ -(^|\.)lightnovel\.cn$ -(^|\.)lihkg\.com$ -(^|\.)like\.com$ -(^|\.)limiao\.net$ -(^|\.)line-apps\.com$ -(^|\.)line-scdn\.net$ -(^|\.)line\.me$ -(^|\.)line\.naver\.jp$ -(^|\.)linear-abematv\.akamaized\.net$ -(^|\.)linglingfa\.com$ -(^|\.)lingvodics\.com$ -(^|\.)link-o-rama\.com$ -(^|\.)linkideo\.com$ -(^|\.)linkuswell\.com$ -(^|\.)linux\.org\.hk$ -(^|\.)linuxtoy\.org$ -(^|\.)lionsroar\.com$ -(^|\.)lipuman\.com$ -(^|\.)liquidvpn\.com$ -(^|\.)listentoyoutube\.com$ -(^|\.)listorious\.com$ -(^|\.)lists\.w3\.org$ -(^|\.)liu-xiaobo\.org$ -(^|\.)liudejun\.com$ -(^|\.)liuhanyu\.com$ -(^|\.)liujianshu\.com$ -(^|\.)liuxiaobo\.net$ -(^|\.)liuxiaotong\.com$ -(^|\.)livecoin\.net$ -(^|\.)livedoor\.jp$ -(^|\.)liveleak\.com$ -(^|\.)livestation\.com$ -(^|\.)livestream\.com$ -(^|\.)livevideo\.com$ -(^|\.)livingonline\.us$ -(^|\.)livingstream\.com$ -(^|\.)liwangyang\.com$ -(^|\.)lizhizhuangbi\.com$ -(^|\.)lkcn\.net$ -(^|\.)llss\.me$ -(^|\.)load\.to$ -(^|\.)lobsangwangyal\.com$ -(^|\.)localbitcoins\.com$ -(^|\.)localdomain\.ws$ -(^|\.)localpresshk\.com$ -(^|\.)lockestek\.com$ -(^|\.)logbot\.net$ -(^|\.)login\.target\.com$ -(^|\.)logiqx\.com$ -(^|\.)londonchinese\.ca$ -(^|\.)longhair\.hk$ -(^|\.)longmusic\.com$ -(^|\.)longtermly\.net$ -(^|\.)longtoes\.com$ -(^|\.)lookpic\.com$ -(^|\.)looktoronto\.com$ -(^|\.)lotsawahouse\.org$ -(^|\.)lotuslight\.org\.hk$ -(^|\.)lotuslight\.org\.tw$ -(^|\.)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$ -(^|\.)luke54\.com$ -(^|\.)luke54\.org$ -(^|\.)lupm\.org$ -(^|\.)lushstories\.com$ -(^|\.)luxebc\.com$ -(^|\.)lvhai\.org$ -(^|\.)lvv2\.com$ -(^|\.)lyfhk\.net$ -(^|\.)lzmtnews\.org$ -(^|\.)m\.hkgalden\.com$ -(^|\.)m\.me$ -(^|\.)m\.plixi\.com$ -(^|\.)m\.slandr\.net$ -(^|\.)ma\.hao123\.com$ -(^|\.)macgamestore\.com$ -(^|\.)macrovpn\.com$ -(^|\.)macts\.com\.tw$ -(^|\.)mad-ar\.ch$ -(^|\.)madewithcode\.com$ -(^|\.)madonna-av\.com$ -(^|\.)madrau\.com$ -(^|\.)madthumbs\.com$ -(^|\.)magazines\.sina\.com\.tw$ -(^|\.)magic-net\.info$ -(^|\.)mahabodhi\.org$ -(^|\.)maiio\.net$ -(^|\.)mail-archive\.com$ -(^|\.)maildns\.xyz$ -(^|\.)maiplus\.com$ -(^|\.)maizhong\.org$ -(^|\.)makemymood\.com$ -(^|\.)makkahnewspaper\.com$ -(^|\.)makzhou\.warehouse333\.com$ -(^|\.)malaysiakini\.com$ -(^|\.)mamingzhe\.com$ -(^|\.)manchukuo\.net$ -(^|\.)mangafox\.com$ -(^|\.)mangafox\.me$ -(^|\.)maniash\.com$ -(^|\.)manicur4ik\.ru$ -(^|\.)mansion\.com$ -(^|\.)mansionpoker\.com$ -(^|\.)manta\.com$ -(^|\.)maplew\.com$ -(^|\.)marc\.info$ -(^|\.)marguerite\.su$ -(^|\.)martau\.com$ -(^|\.)martincartoons\.com$ -(^|\.)martsangkagyuofficial\.org$ -(^|\.)maruta\.be$ -(^|\.)marxist\.com$ -(^|\.)marxist\.net$ -(^|\.)marxists\.org$ -(^|\.)mash\.to$ -(^|\.)maskedip\.com$ -(^|\.)mastodon\.cloud$ -(^|\.)mastodon\.host$ -(^|\.)mastodon\.social$ -(^|\.)matainja\.com$ -(^|\.)material\.io$ -(^|\.)mathable\.io$ -(^|\.)mathiew-badimon\.com$ -(^|\.)matome-plus\.com$ -(^|\.)matome-plus\.net$ -(^|\.)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$ -(^|\.)me\.youthwant\.com\.tw$ -(^|\.)meansys\.com$ -(^|\.)media\.nu\.nl$ -(^|\.)media\.org\.hk$ -(^|\.)mediachinese\.com$ -(^|\.)mediafire\.com$ -(^|\.)mediafreakcity\.com$ -(^|\.)medium\.com$ -(^|\.)meetav\.com$ -(^|\.)meetup\.com$ -(^|\.)mefeedia\.com$ -(^|\.)mefound\.com$ -(^|\.)mega\.nz$ -(^|\.)megaproxy\.com$ -(^|\.)megarotic\.com$ -(^|\.)megavideo\.com$ -(^|\.)megurineluka\.com$ -(^|\.)meirixiaochao\.com$ -(^|\.)meltoday\.com$ -(^|\.)meme\.yahoo\.com$ -(^|\.)memehk\.com$ -(^|\.)memorybbs\.com$ -(^|\.)memri\.org$ -(^|\.)memrijttm\.org$ -(^|\.)mercatox\.com$ -(^|\.)mercyprophet\.org$ -(^|\.)mergersandinquisitions\.org$ -(^|\.)meridian-trust\.org$ -(^|\.)meripet\.biz$ -(^|\.)meripet\.com$ -(^|\.)merit-times\.com\.tw$ -(^|\.)meshrep\.com$ -(^|\.)mesotw\.com$ -(^|\.)messenger\.com$ -(^|\.)metacafe\.com$ -(^|\.)metart\.com$ -(^|\.)metarthunter\.com$ -(^|\.)meteorshowersonline\.com$ -(^|\.)metrohk\.com\.hk$ -(^|\.)metrolife\.ca$ -(^|\.)metroradio\.com\.hk$ -(^|\.)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$ -(^|\.)mike\.cz\.cc$ -(^|\.)mikesoltys\.com$ -(^|\.)milph\.net$ -(^|\.)milsurps\.com$ -(^|\.)mimiai\.net$ -(^|\.)mimivip\.com$ -(^|\.)mimivv\.com$ -(^|\.)mindrolling\.org$ -(^|\.)minghui-a\.org$ -(^|\.)minghui-b\.org$ -(^|\.)minghui-school\.org$ -(^|\.)minghui\.or\.kr$ -(^|\.)minghui\.org$ -(^|\.)minghuiyw\.wordpress\.com$ -(^|\.)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$ -(^|\.)mist\.vip$ -(^|\.)mitao\.com\.tw$ -(^|\.)mitbbs\.com$ -(^|\.)mitbbsau\.com$ -(^|\.)mixero\.com$ -(^|\.)mixpod\.com$ -(^|\.)mixx\.com$ -(^|\.)mizzmona\.com$ -(^|\.)mjib\.gov\.tw$ -(^|\.)mjlsh\.usc\.cuhk\.edu\.hk$ -(^|\.)mk5000\.com$ -(^|\.)mlcool\.com$ -(^|\.)mlzs\.work$ -(^|\.)mm-cg\.com$ -(^|\.)mmaaxx\.com$ -(^|\.)mmmca\.com$ -(^|\.)mnewstv\.com$ -(^|\.)mo\.nightlife141\.com$ -(^|\.)mobatek\.net$ -(^|\.)mobile01\.com$ -(^|\.)mobileways\.de$ -(^|\.)moby\.to$ -(^|\.)mobypicture\.com$ -(^|\.)moeaic\.gov\.tw$ -(^|\.)moeerolibrary\.com$ -(^|\.)mofa\.gov\.tw$ -(^|\.)mofaxiehui\.com$ -(^|\.)mofos\.com$ -(^|\.)mog\.com$ -(^|\.)mohu\.club$ -(^|\.)mohu\.ml$ -(^|\.)mojim\.com$ -(^|\.)mol\.gov\.tw$ -(^|\.)molihua\.org$ -(^|\.)mondex\.org$ -(^|\.)money-link\.com\.tw$ -(^|\.)moneyhome\.biz$ -(^|\.)monitorchina\.org$ -(^|\.)monster\.com$ -(^|\.)moodyz\.com$ -(^|\.)moonbbs\.com$ -(^|\.)moonbingo\.com$ -(^|\.)morningsun\.org$ -(^|\.)moroneta\.com$ -(^|\.)mos\.ru$ -(^|\.)motherless\.com$ -(^|\.)motiyun\.com$ -(^|\.)motor4ik\.ru$ -(^|\.)mousebreaker\.com$ -(^|\.)movements\.org$ -(^|\.)moviefap\.com$ -(^|\.)mp3buscador\.com$ -(^|\.)mp3ye\.eu$ -(^|\.)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$ -(^|\.)mswe1\.org$ -(^|\.)mthruf\.com$ -(^|\.)mtw\.tl$ -(^|\.)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$ -(^|\.)mx\.hao123\.com$ -(^|\.)mx981\.com$ -(^|\.)my-formosa\.com$ -(^|\.)my-private-network\.co\.uk$ -(^|\.)my-proxy\.com$ -(^|\.)my\.mail\.ru$ -(^|\.)my\.opera\.com$ -(^|\.)my\.pcloud\.com$ -(^|\.)my03\.com$ -(^|\.)myactimes\.com$ -(^|\.)myanniu\.com$ -(^|\.)myaudiocast\.com$ -(^|\.)myav\.com\.tw$ -(^|\.)mybbs\.us$ -(^|\.)mybet\.com$ -(^|\.)myca168\.com$ -(^|\.)mycanadanow\.com$ -(^|\.)mychinamyhome\.com$ -(^|\.)mychinanet\.com$ -(^|\.)mychinanews\.com$ -(^|\.)mychinese\.news$ -(^|\.)mycnnews\.com$ -(^|\.)mycould\.com$ -(^|\.)mydad\.info$ -(^|\.)myddns\.com$ -(^|\.)myeasytv\.com$ -(^|\.)myeclipseide\.com$ -(^|\.)myforum\.com\.hk$ -(^|\.)myforum\.com\.uk$ -(^|\.)myfreecams\.com$ -(^|\.)myfreepaysite\.com$ -(^|\.)myfreshnet\.com$ -(^|\.)myftp\.info$ -(^|\.)myftp\.name$ -(^|\.)myiphide\.com$ -(^|\.)mykomica\.org$ -(^|\.)mylftv\.com$ -(^|\.)mymediarom\.com$ -(^|\.)mymoe\.moe$ -(^|\.)mymom\.info$ -(^|\.)mymusic\.net\.tw$ -(^|\.)mynetav\.net$ -(^|\.)mynetav\.org$ -(^|\.)mynumber\.org$ -(^|\.)myparagliding\.com$ -(^|\.)mypicture\.info$ -(^|\.)mypop3\.net$ -(^|\.)mypop3\.org$ -(^|\.)mypopescu\.com$ -(^|\.)myradio\.hk$ -(^|\.)myreadingmanga\.info$ -(^|\.)mysecondarydns\.com$ -(^|\.)myshare\.url\.com\.tw$ -(^|\.)mysinablog\.com$ -(^|\.)mysite\.verizon\.net$ -(^|\.)myspace\.com$ -(^|\.)myspacecdn\.com$ -(^|\.)mytalkbox\.com$ -(^|\.)mytizi\.com$ -(^|\.)mywww\.biz$ -(^|\.)myz\.info$ -(^|\.)naacoalition\.org$ -(^|\.)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$ -(^|\.)nat\.gov\.tw$ -(^|\.)nat\.moe$ -(^|\.)national-lottery\.co\.uk$ -(^|\.)nationsonline\.org$ -(^|\.)nationwide\.com$ -(^|\.)naughtyamerica\.com$ -(^|\.)navyfamily\.navy\.mil$ -(^|\.)navyreserve\.navy\.mil$ -(^|\.)naweeklytimes\.com$ -(^|\.)nbtvpn\.com$ -(^|\.)nccwatch\.org\.tw$ -(^|\.)nch\.com\.tw$ -(^|\.)ncn\.org$ -(^|\.)nde\.de$ -(^|\.)ndr\.de$ -(^|\.)ned\.org$ -(^|\.)nekoslovakia\.net$ -(^|\.)nemesis2\.qx\.net$ -(^|\.)neo-miracle\.com$ -(^|\.)nepusoku\.com$ -(^|\.)net-fits\.pro$ -(^|\.)netbirds\.com$ -(^|\.)netcolony\.com$ -(^|\.)netflix\.com$ -(^|\.)netme\.cc$ -(^|\.)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$ -(^|\.)newipnow\.com$ -(^|\.)newlandmagazine\.com\.au$ -(^|\.)newnews\.ca$ -(^|\.)news\.cnyes\.com$ -(^|\.)news\.hk\.msn\.com$ -(^|\.)news\.hkpeanut\.com$ -(^|\.)news\.msn\.com\.tw$ -(^|\.)news\.nationalgeographic\.com$ -(^|\.)news\.now\.com$ -(^|\.)news\.now\.com%2fhome$ -(^|\.)news\.omy\.sg$ -(^|\.)news\.seehua\.com$ -(^|\.)news\.sina\.com\.hk$ -(^|\.)news\.sina\.com\.tw$ -(^|\.)news\.sinchew\.com\.my$ -(^|\.)news\.singtao\.ca$ -(^|\.)news\.tvb\.com$ -(^|\.)news\.tvbs\.com\.tw$ -(^|\.)news\.yahoo\.com$ -(^|\.)news100\.com\.tw$ -(^|\.)newsancai\.com$ -(^|\.)newschinacomment\.org$ -(^|\.)newscn\.org$ -(^|\.)newsdetox\.ca$ -(^|\.)newsdh\.com$ -(^|\.)newspeak\.cc$ -(^|\.)newstamago\.com$ -(^|\.)newstapa\.org$ -(^|\.)newstarnet\.com$ -(^|\.)newtaiwan\.com\.tw$ -(^|\.)newtalk\.tw$ -(^|\.)newyorktimes\.com$ -(^|\.)nexon\.com$ -(^|\.)next11\.co\.jp$ -(^|\.)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$ -(^|\.)nga\.mil$ -(^|\.)ngensis\.com$ -(^|\.)nhentai\.net$ -(^|\.)nhi\.gov\.tw$ -(^|\.)nhk-ondemand\.jp$ -(^|\.)nic\.cz\.cc$ -(^|\.)nic\.google$ -(^|\.)nic\.gov$ -(^|\.)nicovideo\.jp$ -(^|\.)nighost\.org$ -(^|\.)nikkei\.com$ -(^|\.)ninecommentaries\.com$ -(^|\.)ninjacloak\.com$ -(^|\.)ninjaproxy\.ninja$ -(^|\.)nintendium\.com$ -(^|\.)ninth\.biz$ -(^|\.)niu\.moe$ -(^|\.)niusnews\.com$ -(^|\.)njactb\.org$ -(^|\.)njuice\.com$ -(^|\.)nko\.navy\.mil$ -(^|\.)nlfreevpn\.com$ -(^|\.)no-ip\.org$ -(^|\.)nobel\.se$ -(^|\.)nobelprize\.org$ -(^|\.)nobodycanstop\.us$ -(^|\.)nofile\.io$ -(^|\.)nokogiri\.org$ -(^|\.)nokola\.com$ -(^|\.)noodlevpn\.com$ -(^|\.)norbulingka\.org$ -(^|\.)nordstrom\.com$ -(^|\.)nordstromimage\.com$ -(^|\.)nordstromrack\.com$ -(^|\.)nordvpn\.com$ -(^|\.)notify\.dropboxapi\.com$ -(^|\.)nottinghampost\.com$ -(^|\.)novelasia\.com$ -(^|\.)now\.com$ -(^|\.)now\.im$ -(^|\.)nownews\.com$ -(^|\.)nowtorrents\.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\.cz$ -(^|\.)ntdtv\.org$ -(^|\.)ntdtv\.ru$ -(^|\.)ntdtvla\.com$ -(^|\.)ntrfun\.com$ -(^|\.)ntsna\.gov\.tw$ -(^|\.)nubiles\.net$ -(^|\.)nuexpo\.com$ -(^|\.)nukistream\.com$ -(^|\.)nurgo-software\.com$ -(^|\.)nusatrip\.com$ -(^|\.)nutaku\.net$ -(^|\.)nuuvem\.com$ -(^|\.)nuvid\.com$ -(^|\.)nuzcom\.com$ -(^|\.)nvdst\.com$ -(^|\.)nvquan\.org$ -(^|\.)nvtongzhisheng\.org$ -(^|\.)nwtca\.org$ -(^|\.)ny\.stgloballink\.com$ -(^|\.)ny\.visiontimes\.com$ -(^|\.)nyaa\.eu$ -(^|\.)nydus\.ca$ -(^|\.)nylon-angel\.com$ -(^|\.)nylonstockingsonline\.com$ -(^|\.)nyt\.com$ -(^|\.)nytchina\.com$ -(^|\.)nytcn\.me$ -(^|\.)nytco\.com$ -(^|\.)nyti\.ms$ -(^|\.)nytimes\.com$ -(^|\.)nytimes\.map\.fastly\.net$ -(^|\.)nytimg\.com$ -(^|\.)nytstyle\.com$ -(^|\.)nzchinese\.com$ -(^|\.)nzchinese\.net\.nz$ -(^|\.)observechina\.net$ -(^|\.)obutu\.com$ -(^|\.)ocaspro\.com$ -(^|\.)occupytiananmen\.com$ -(^|\.)oclp\.hk$ -(^|\.)ocreampies\.com$ -(^|\.)ocry\.com$ -(^|\.)october-review\.org$ -(^|\.)oculus\.com$ -(^|\.)oculuscdn\.com$ -(^|\.)oex\.com$ -(^|\.)offbeatchina\.com$ -(^|\.)officeoftibet\.com$ -(^|\.)ofile\.org$ -(^|\.)ogaoga\.org$ -(^|\.)ogate\.org$ -(^|\.)oikos\.com\.tw$ -(^|\.)oiktv\.com$ -(^|\.)oizoblog\.com$ -(^|\.)ok\.ru$ -(^|\.)okayfreedom\.com$ -(^|\.)okex\.com$ -(^|\.)okk\.tw$ -(^|\.)old-cat\.net$ -(^|\.)old\.honeynet\.org$ -(^|\.)old\.nabble\.com$ -(^|\.)olumpo\.com$ -(^|\.)olympicwatch\.org$ -(^|\.)omgili\.com$ -(^|\.)omni7\.jp$ -(^|\.)omnitalk\.com$ -(^|\.)omnitalk\.org$ -(^|\.)on\.cc$ -(^|\.)on2\.com$ -(^|\.)onapp\.com$ -(^|\.)onedrive\.live\.com$ -(^|\.)onedumb\.com$ -(^|\.)onejav\.com$ -(^|\.)onion\.city$ -(^|\.)online\.recoveryversion\.org$ -(^|\.)onlinecha\.com$ -(^|\.)onlineyoutube\.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$ -(^|\.)openvpn\.net$ -(^|\.)openvpn\.org$ -(^|\.)openwebster\.com$ -(^|\.)openwrt\.org\.cn$ -(^|\.)opml\.radiotime\.com$ -(^|\.)opus-gaming\.com$ -(^|\.)organcare\.org\.tw$ -(^|\.)organharvestinvestigation\.net$ -(^|\.)organiccrap\.com$ -(^|\.)orgasm\.com$ -(^|\.)orgfree\.com$ -(^|\.)orient-doll\.com$ -(^|\.)orientaldaily\.com\.my$ -(^|\.)orn\.jp$ -(^|\.)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$ -(^|\.)overplay\.net$ -(^|\.)oversea\.istarshine\.com$ -(^|\.)ow\.ly$ -(^|\.)owl\.li$ -(^|\.)oyax\.com$ -(^|\.)oyghan\.com$ -(^|\.)ozchinese\.com$ -(^|\.)ozvoice\.org$ -(^|\.)ozxw\.com$ -(^|\.)ozyoyo\.com$ -(^|\.)pachosting\.com$ -(^|\.)pacificpoker\.com$ -(^|\.)packages\.debian\.org$ -(^|\.)packetix\.net$ -(^|\.)pacopacomama\.com$ -(^|\.)padmanet\.com$ -(^|\.)page\.bid\.yahoo\.com$ -(^|\.)page2rss\.com$ -(^|\.)pagodabox\.com$ -(^|\.)palacemoon\.com$ -(^|\.)paldengyal\.com$ -(^|\.)paljorpublications\.com$ -(^|\.)paltalk\.com$ -(^|\.)panamapapers\.sueddeutsche\.de$ -(^|\.)pandapow\.co$ -(^|\.)pandapow\.net$ -(^|\.)pandavpn-jp\.com$ -(^|\.)pandora\.com$ -(^|\.)pandora\.tv$ -(^|\.)panluan\.net$ -(^|\.)panoramio\.com$ -(^|\.)pao-pao\.net$ -(^|\.)paper\.li$ -(^|\.)paperb\.us$ -(^|\.)paradisehill\.cc$ -(^|\.)paradisepoker\.com$ -(^|\.)parkansky\.com$ -(^|\.)partycasino\.com$ -(^|\.)partypoker\.com$ -(^|\.)passion\.com$ -(^|\.)passiontimes\.hk$ -(^|\.)paste\.ee$ -(^|\.)pastebin\.com$ -(^|\.)pastie\.org$ -(^|\.)pbs\.org$ -(^|\.)pbwiki\.com$ -(^|\.)pbworks\.com$ -(^|\.)pbxes\.com$ -(^|\.)pbxes\.org$ -(^|\.)pcanywhere\.net$ -(^|\.)pcc\.gov\.tw$ -(^|\.)pcdvd\.com\.tw$ -(^|\.)pchome\.com\.tw$ -(^|\.)pcij\.org$ -(^|\.)pcstore\.com\.tw$ -(^|\.)pct\.org\.tw$ -(^|\.)pdetails\.com$ -(^|\.)pdproxy\.com$ -(^|\.)pds\.nasa\.gov$ -(^|\.)peace\.ca$ -(^|\.)peacefire\.org$ -(^|\.)peacehall\.com$ -(^|\.)pearlher\.org$ -(^|\.)peeasian\.com$ -(^|\.)pekingduck\.org$ -(^|\.)pemulihan\.or\.id$ -(^|\.)pen\.io$ -(^|\.)penchinese\.com$ -(^|\.)penchinese\.net$ -(^|\.)pengyulong\.com$ -(^|\.)penisbot\.com$ -(^|\.)penthouse\.com$ -(^|\.)pentoy\.hk$ -(^|\.)peoplebookcafe\.com$ -(^|\.)peoplenews\.tw$ -(^|\.)peopo\.org$ -(^|\.)percy\.in$ -(^|\.)perfectgirls\.net$ -(^|\.)perfectvpn\.net$ -(^|\.)periscope\.tv$ -(^|\.)persecutionblog\.com$ -(^|\.)persiankitty\.com$ -(^|\.)pfd\.org\.hk$ -(^|\.)phapluan\.org$ -(^|\.)phayul\.com$ -(^|\.)philborges\.com$ -(^|\.)philly\.com$ -(^|\.)phmsociety\.org$ -(^|\.)phncdn\.com$ -(^|\.)phobos\.apple\.com$ -(^|\.)phosphation13\.rssing\.com$ -(^|\.)photodharma\.net$ -(^|\.)photofocus\.com$ -(^|\.)phuquocservices\.com$ -(^|\.)picacomic\.com$ -(^|\.)picacomiccn\.com$ -(^|\.)picasaweb\.com$ -(^|\.)picidae\.net$ -(^|\.)pictures\.playboy\.com$ -(^|\.)picturesocial\.com$ -(^|\.)pin-cong\.com$ -(^|\.)pin6\.com$ -(^|\.)pincong\.rocks$ -(^|\.)ping\.fm$ -(^|\.)pinimg\.com$ -(^|\.)pinkrod\.com$ -(^|\.)pinoy-n\.com$ -(^|\.)pinterest\.at$ -(^|\.)pinterest\.co\.kr$ -(^|\.)pinterest\.co\.uk$ -(^|\.)pinterest\.com$ -(^|\.)pinterest\.de$ -(^|\.)pinterest\.dk$ -(^|\.)pinterest\.fr$ -(^|\.)pinterest\.jp$ -(^|\.)pinterest\.nl$ -(^|\.)pinterest\.se$ -(^|\.)pioneer-worker\.forums-free\.com$ -(^|\.)pipii\.tv$ -(^|\.)piposay\.com$ -(^|\.)piraattilahti\.org$ -(^|\.)piring\.com$ -(^|\.)pixelqi\.com$ -(^|\.)pixiv\.net$ -(^|\.)pixnet\.net$ -(^|\.)pk\.com$ -(^|\.)pki\.goog$ -(^|\.)placemix\.com$ -(^|\.)playboy\.com$ -(^|\.)playboyplus\.com$ -(^|\.)player\.fm$ -(^|\.)playno1\.com$ -(^|\.)playpcesor\.com$ -(^|\.)plays\.com\.tw$ -(^|\.)plm\.org\.hk$ -(^|\.)plunder\.com$ -(^|\.)plurk\.com$ -(^|\.)plus28\.com$ -(^|\.)plusbb\.com$ -(^|\.)pmatehunter\.com$ -(^|\.)pmates\.com$ -(^|\.)po2b\.com$ -(^|\.)pobieramy\.top$ -(^|\.)podictionary\.com$ -(^|\.)pokerstars\.com$ -(^|\.)pokerstars\.net$ -(^|\.)politicalchina\.org$ -(^|\.)politicalconsultation\.org$ -(^|\.)politiscales\.net$ -(^|\.)poloniex\.com$ -(^|\.)polymer-project\.org$ -(^|\.)polymerhk\.com$ -(^|\.)popo\.tw$ -(^|\.)popvote\.hk$ -(^|\.)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$ -(^|\.)potvpn\.com$ -(^|\.)power\.com$ -(^|\.)powerapple\.com$ -(^|\.)powercx\.com$ -(^|\.)powerphoto\.org$ -(^|\.)prayforchina\.net$ -(^|\.)premeforwindows7\.com$ -(^|\.)premproxy\.com$ -(^|\.)presentationzen\.com$ -(^|\.)presidentlee\.tw$ -(^|\.)prestige-av\.com$ -(^|\.)pride\.google$ -(^|\.)prisoner-state-secret-journal-premier$ -(^|\.)prisoneralert\.com$ -(^|\.)pritunl\.com$ -(^|\.)privacybox\.de$ -(^|\.)private\.com$ -(^|\.)privateinternetaccess\.com$ -(^|\.)privatepaste\.com$ -(^|\.)privatetunnel\.com$ -(^|\.)privatevpn\.com$ -(^|\.)procopytips\.com$ -(^|\.)prosiben\.de$ -(^|\.)protonvpn\.com$ -(^|\.)provideocoalition\.com$ -(^|\.)provpnaccounts\.com$ -(^|\.)proxfree\.com$ -(^|\.)proxifier\.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$ -(^|\.)psiphon\.ca$ -(^|\.)psiphon\.civisec\.org$ -(^|\.)psiphon3\.com$ -(^|\.)psiphontoday\.com$ -(^|\.)pts\.org\.tw$ -(^|\.)ptt\.cc$ -(^|\.)pttvan\.org$ -(^|\.)pubu\.com\.tw$ -(^|\.)puffinbrowser\.com$ -(^|\.)puffstore\.com$ -(^|\.)pullfolio\.com$ -(^|\.)pulse\.yahoo\.com$ -(^|\.)punyu\.com$ -(^|\.)pure18\.com$ -(^|\.)pureconcepts\.net$ -(^|\.)pureinsight\.org$ -(^|\.)purepdf\.com$ -(^|\.)purevpn\.com$ -(^|\.)purplelotus\.org$ -(^|\.)pursuestar\.com$ -(^|\.)pushchinawall\.com$ -(^|\.)pussyspace\.com$ -(^|\.)putihome\.org$ -(^|\.)putlocker\.com$ -(^|\.)putty\.org$ -(^|\.)puuko\.com$ -(^|\.)pwned\.com$ -(^|\.)python\.com$ -(^|\.)python\.com\.tw$ -(^|\.)pythonhackers\.com$ -(^|\.)pytorch\.org$ -(^|\.)q%3dfreedom$ -(^|\.)q%3dtriangle$ -(^|\.)q=freedom$ -(^|\.)q=triangle$ -(^|\.)qanote\.com$ -(^|\.)qgirl\.com\.tw$ -(^|\.)qhigh\.com$ -(^|\.)qi-gong\.me$ -(^|\.)qiandao\.today$ -(^|\.)qiangyou\.org$ -(^|\.)qidian\.ca$ -(^|\.)qienkuen\.org$ -(^|\.)qiwen\.lu$ -(^|\.)qixianglu\.cn$ -(^|\.)qkshare\.com$ -(^|\.)qoos\.com$ -(^|\.)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$ -(^|\.)qxbbs\.org$ -(^|\.)r18\.com$ -(^|\.)ra\.gg$ -(^|\.)radicalparty\.org$ -(^|\.)radiko\.jp$ -(^|\.)radioaustralia\.net\.au$ -(^|\.)radiohilight\.net$ -(^|\.)radiovaticana\.org$ -(^|\.)radiovncr\.com$ -(^|\.)rael\.org$ -(^|\.)raggedbanner\.com$ -(^|\.)raidcall\.com\.tw$ -(^|\.)raidtalk\.com\.tw$ -(^|\.)rainbowplan\.org$ -(^|\.)raizoji\.or\.jp$ -(^|\.)ramcity\.com\.au$ -(^|\.)rangwang\.biz$ -(^|\.)rangzen\.com$ -(^|\.)rangzen\.net$ -(^|\.)rangzen\.org$ -(^|\.)ranyunfei\.com$ -(^|\.)rapbull\.net$ -(^|\.)rapidgator\.net$ -(^|\.)rapidmoviez\.com$ -(^|\.)rapidvpn\.com$ -(^|\.)raremovie\.cc$ -(^|\.)raremovie\.net$ -(^|\.)rawgit\.com$ -(^|\.)rawgithub\.com$ -(^|\.)razyboard\.com$ -(^|\.)rcam\.target\.com$ -(^|\.)rcinet\.ca$ -(^|\.)rconversation\.blogs\.com$ -(^|\.)rd\.com$ -(^|\.)rdio\.com$ -(^|\.)read01\.com$ -(^|\.)read100\.com$ -(^|\.)readingtimes\.com\.tw$ -(^|\.)readmoo\.com$ -(^|\.)readydown\.com$ -(^|\.)realcourage\.org$ -(^|\.)realforum\.zkiz\.com$ -(^|\.)realitykings\.com$ -(^|\.)realraptalk\.com$ -(^|\.)realsexpass\.com$ -(^|\.)rebatesrule\.net$ -(^|\.)recordhistory\.org$ -(^|\.)recovery\.org\.tw$ -(^|\.)recoveryversion\.com\.tw$ -(^|\.)red-lang\.org$ -(^|\.)redballoonsolidarity\.org$ -(^|\.)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$ -(^|\.)religioustolerance\.org$ -(^|\.)remembering_tiananmen_20_years$ -(^|\.)renminbao\.com$ -(^|\.)renyurenquan\.org$ -(^|\.)research\.jmsc\.hku\.hk$ -(^|\.)resilio\.com$ -(^|\.)retweeteffect\.com$ -(^|\.)retweetist\.com$ -(^|\.)retweetrank\.com$ -(^|\.)reuters\.com$ -(^|\.)reutersmedia\.net$ -(^|\.)revleft\.com$ -(^|\.)revver\.com$ -(^|\.)rfa\.org$ -(^|\.)rfachina\.com$ -(^|\.)rfalive1\.akacast\.akamaistream\.net$ -(^|\.)rfamobile\.org$ -(^|\.)rfaweb\.org$ -(^|\.)rferl\.org$ -(^|\.)rfi\.fr$ -(^|\.)rfi\.my$ -(^|\.)rg3\.github\.io$ -(^|\.)rightbtc\.com$ -(^|\.)rigpa\.org$ -(^|\.)riku\.me$ -(^|\.)rileyguide\.com$ -(^|\.)ritouki\.jp$ -(^|\.)ritter\.vg$ -(^|\.)rixcloud\.com$ -(^|\.)rixcloud\.us$ -(^|\.)rlwlw\.com$ -(^|\.)rmjdw\.com$ -(^|\.)rmjdw132\.info$ -(^|\.)roadshow\.hk$ -(^|\.)roboforex\.com$ -(^|\.)robustnessiskey\.com$ -(^|\.)rocket-inc\.net$ -(^|\.)rocksdb\.org$ -(^|\.)rojo\.com$ -(^|\.)rolia\.net$ -(^|\.)ronjoneswriter\.com$ -(^|\.)roodo\.com$ -(^|\.)rosechina\.net$ -(^|\.)rotten\.com$ -(^|\.)rsdlmonitor\.com$ -(^|\.)rsf-chinese\.org$ -(^|\.)rsf\.org$ -(^|\.)rsgamen\.org$ -(^|\.)rssmeme\.com$ -(^|\.)rtalabel\.org$ -(^|\.)rthk\.hk$ -(^|\.)rthk\.org\.hk$ -(^|\.)rthklive2-lh\.akamaihd\.net$ -(^|\.)rti\.org\.tw$ -(^|\.)rtycminnesota\.org$ -(^|\.)ruanyifeng\.com$ -(^|\.)rukor\.org$ -(^|\.)runbtx\.com$ -(^|\.)rushbee\.com$ -(^|\.)ruten\.com\.tw$ -(^|\.)rutube\.ru$ -(^|\.)ruyiseek\.com$ -(^|\.)rxhj\.net$ -(^|\.)s-cute\.com$ -(^|\.)s-dragon\.org$ -(^|\.)s1\.nudezz\.com$ -(^|\.)s1heng\.com$ -(^|\.)s1s1s1\.com$ -(^|\.)s3-ap-northeast-1\.amazonaws\.com$ -(^|\.)s3-ap-southeast-2\.amazonaws\.com$ -(^|\.)s8forum\.com$ -(^|\.)sa\.hao123\.com$ -(^|\.)sacks\.com$ -(^|\.)sacom\.hk$ -(^|\.)sadistic-v\.com$ -(^|\.)sadpanda\.us$ -(^|\.)safervpn\.com$ -(^|\.)safety\.google$ -(^|\.)saintyculture\.com$ -(^|\.)saiq\.me$ -(^|\.)sakuralive\.com$ -(^|\.)sakya\.org$ -(^|\.)salvation\.org\.hk$ -(^|\.)samair\.ru$ -(^|\.)sambhota\.org$ -(^|\.)sanmin\.com\.tw$ -(^|\.)sapikachu\.net$ -(^|\.)saveliuxiaobo\.com$ -(^|\.)savemedia\.com$ -(^|\.)savethedate\.foo$ -(^|\.)savethesounds\.info$ -(^|\.)savetibet\.de$ -(^|\.)savetibet\.fr$ -(^|\.)savetibet\.nl$ -(^|\.)savetibet\.org$ -(^|\.)savetibet\.ru$ -(^|\.)savetibetstore\.org$ -(^|\.)savevid\.com$ -(^|\.)say2\.info$ -(^|\.)sbme\.me$ -(^|\.)sbs\.com\.au$ -(^|\.)scache\.vzw\.com$ -(^|\.)scache1\.vzw\.com$ -(^|\.)scache2\.vzw\.com$ -(^|\.)scasino\.com$ -(^|\.)schema\.org$ -(^|\.)sciencenets\.com$ -(^|\.)scieron\.com$ -(^|\.)scmp\.com$ -(^|\.)scmpchinese\.com$ -(^|\.)scramble\.io$ -(^|\.)scribd\.com$ -(^|\.)scriptspot\.com$ -(^|\.)seapuff\.com$ -(^|\.)search$ -(^|\.)search\.aol\.com$ -(^|\.)search\.yahoo\.co\.jp$ -(^|\.)search\.yahoo\.com$ -(^|\.)searchtruth\.com$ -(^|\.)secretchina\.com$ -(^|\.)secretgarden\.no$ -(^|\.)secretsline\.biz$ -(^|\.)secure\.hustler\.com$ -(^|\.)secure\.logmein\.com$ -(^|\.)secure\.raxcdn\.com$ -(^|\.)securetunnel\.com$ -(^|\.)securityinabox\.org$ -(^|\.)securitykiss\.com$ -(^|\.)seed4\.me$ -(^|\.)seesmic\.com$ -(^|\.)seevpn\.com$ -(^|\.)seezone\.net$ -(^|\.)sejie\.com$ -(^|\.)sellclassics\.com$ -(^|\.)sendsmtp\.com$ -(^|\.)sendspace\.com$ -(^|\.)servehttp\.com$ -(^|\.)serveuser\.com$ -(^|\.)serveusers\.com$ -(^|\.)sesawe\.net$ -(^|\.)sesawe\.org$ -(^|\.)sethwklein\.net$ -(^|\.)setn\.com$ -(^|\.)settv\.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$ -(^|\.)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$ -(^|\.)shambalapost\.com$ -(^|\.)shambhalasun\.com$ -(^|\.)shangfang\.org$ -(^|\.)shapeservices\.com$ -(^|\.)share\.dmhy\.org$ -(^|\.)share\.ovi\.com$ -(^|\.)share\.youthwant\.com\.tw$ -(^|\.)sharebee\.com$ -(^|\.)sharecool\.org$ -(^|\.)sharpdaily\.com\.hk$ -(^|\.)sharpdaily\.hk$ -(^|\.)sharpdaily\.tw$ -(^|\.)shat-tibet\.com$ -(^|\.)shattered\.io$ -(^|\.)sheikyermami\.com$ -(^|\.)shellfire\.de$ -(^|\.)shenshou\.org$ -(^|\.)shenyun\.com$ -(^|\.)shenyunperformingarts\.org$ -(^|\.)shenzhoufilm\.com$ -(^|\.)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$ -(^|\.)shopping\.com$ -(^|\.)showbiz\.omy\.sg$ -(^|\.)showhaotu\.com$ -(^|\.)showtime\.jp$ -(^|\.)shutterstock\.com$ -(^|\.)shwchurch\.org$ -(^|\.)shwchurch3\.com$ -(^|\.)siddharthasintent\.org$ -(^|\.)sidelinesnews\.com$ -(^|\.)sidelinessportseatery\.com$ -(^|\.)sierrafriendsoftibet\.org$ -(^|\.)sijihuisuo\.club$ -(^|\.)sijihuisuo\.com$ -(^|\.)sikaozhe1997\.github\.io$ -(^|\.)silkbook\.com$ -(^|\.)simbolostwitter\.com$ -(^|\.)simplecd\.org$ -(^|\.)simpleproductivityblog\.com$ -(^|\.)sinchew\.com\.my$ -(^|\.)singaporepools\.com\.sg$ -(^|\.)singfortibet\.com$ -(^|\.)singpao\.com\.hk$ -(^|\.)singtao\.com$ -(^|\.)singtaousa\.com$ -(^|\.)sino-monthly\.com$ -(^|\.)sinoants\.com$ -(^|\.)sinocast\.com$ -(^|\.)sinocism\.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$ -(^|\.)siteks\.uk\.to$ -(^|\.)sitemaps\.org$ -(^|\.)six-degrees\.io$ -(^|\.)sixth\.biz$ -(^|\.)sjrt\.org$ -(^|\.)sjum\.cn$ -(^|\.)sketchappsources\.com$ -(^|\.)skimtube\.com$ -(^|\.)skybet\.com$ -(^|\.)skyking\.com\.tw$ -(^|\.)skyvegas\.com$ -(^|\.)skyxvpn\.com$ -(^|\.)slacker\.com$ -(^|\.)slaytizle\.com$ -(^|\.)sleazydream\.com$ -(^|\.)slheng\.com$ -(^|\.)slickvpn\.com$ -(^|\.)slideshare\.net$ -(^|\.)slinkset\.com$ -(^|\.)slutload\.com$ -(^|\.)slutmoonbeam\.com$ -(^|\.)slyip\.com$ -(^|\.)slyip\.net$ -(^|\.)sm-miracle\.com$ -(^|\.)smartdnsproxy\.com$ -(^|\.)smarthide\.com$ -(^|\.)smchbooks\.com$ -(^|\.)smh\.com\.au$ -(^|\.)smhric\.org$ -(^|\.)smith\.edu$ -(^|\.)smyxy\.org$ -(^|\.)snapchat\.com$ -(^|\.)snaptu\.com$ -(^|\.)sndcdn\.com$ -(^|\.)sneakme\.net$ -(^|\.)snowlionpub\.com$ -(^|\.)sobees\.com$ -(^|\.)soc\.mil$ -(^|\.)socialwhale\.com$ -(^|\.)socks-proxy\.net$ -(^|\.)sockscap64\.com$ -(^|\.)sockslist\.net$ -(^|\.)socrec\.org$ -(^|\.)sod\.co\.jp$ -(^|\.)sodatea\.github\.io$ -(^|\.)softether-download\.com$ -(^|\.)softether\.co\.jp$ -(^|\.)softether\.org$ -(^|\.)softsmirror\.cf$ -(^|\.)softwarebychuck\.com$ -(^|\.)softwaredownload\.gitbooks\.io$ -(^|\.)sogclub\.com$ -(^|\.)sogrady\.me$ -(^|\.)soh\.tw$ -(^|\.)sohcradio\.com$ -(^|\.)sohfrance\.org$ -(^|\.)sokamonline\.com$ -(^|\.)sokmil\.com$ -(^|\.)solarsystem\.nasa\.gov$ -(^|\.)solidaritetibet\.org$ -(^|\.)solidfiles\.com$ -(^|\.)somee\.com$ -(^|\.)songjianjun\.com$ -(^|\.)sonicbbs\.cc$ -(^|\.)sonidodelaesperanza\.org$ -(^|\.)sopcast\.com$ -(^|\.)sopcast\.org$ -(^|\.)sorazone\.net$ -(^|\.)sorting-algorithms\.com$ -(^|\.)sos\.org$ -(^|\.)sosreader\.com$ -(^|\.)sostibet\.org$ -(^|\.)soubory\.com$ -(^|\.)soul-plus\.net$ -(^|\.)soulcaliburhentai\.net$ -(^|\.)soumo\.info$ -(^|\.)soundcloud\.com$ -(^|\.)soundofhope\.kr$ -(^|\.)soundofhope\.org$ -(^|\.)soup\.io$ -(^|\.)soupofmedia\.com$ -(^|\.)sourceforge\.net$ -(^|\.)sourcewadio\.com$ -(^|\.)southnews\.com\.tw$ -(^|\.)sowers\.org\.hk$ -(^|\.)soylentnews\.org$ -(^|\.)spaces\.hightail\.com$ -(^|\.)spankbang\.com$ -(^|\.)spankingtube\.com$ -(^|\.)spankwire\.com$ -(^|\.)spb\.com$ -(^|\.)speakerdeck\.com$ -(^|\.)specxinzl\.jigsy\.com$ -(^|\.)speedify\.com$ -(^|\.)spem\.at$ -(^|\.)spencertipping\.com$ -(^|\.)spendee\.com$ -(^|\.)spicevpn\.com$ -(^|\.)spideroak\.com$ -(^|\.)spike\.com$ -(^|\.)sports\.williamhill\.com$ -(^|\.)spotflux\.com$ -(^|\.)spotify\.com$ -(^|\.)spreadshirt\.es$ -(^|\.)spring4u\.info$ -(^|\.)springboardplatform\.com$ -(^|\.)sprite\.org$ -(^|\.)sproutcore\.com$ -(^|\.)sproxy\.info$ -(^|\.)squirly\.info$ -(^|\.)srcf\.ucam\.org$ -(^|\.)srocket\.us$ -(^|\.)ss-link\.com$ -(^|\.)ss\.carryzhou\.com$ -(^|\.)ss\.levyhsu\.com$ -(^|\.)ss\.pythonic\.life$ -(^|\.)ss7\.vzw\.com$ -(^|\.)ssglobal\.co$ -(^|\.)ssglobal\.me$ -(^|\.)ssh91\.com$ -(^|\.)ssl\.webpack\.de$ -(^|\.)ssl443\.org$ -(^|\.)sspanel\.net$ -(^|\.)sspro\.ml$ -(^|\.)ssr\.tools$ -(^|\.)ssrshare\.com$ -(^|\.)sss\.camp$ -(^|\.)sstmlt\.moe$ -(^|\.)sstmlt\.net$ -(^|\.)stackoverflow\.com$ -(^|\.)stage64\.hk$ -(^|\.)standupfortibet\.org$ -(^|\.)stanford\.edu$ -(^|\.)starfishfx\.com$ -(^|\.)starp2p\.com$ -(^|\.)startpage\.com$ -(^|\.)startuplivingchina\.com$ -(^|\.)stat\.gov\.tw$ -(^|\.)static-economist\.com$ -(^|\.)static\.comico\.tw$ -(^|\.)static\.shemalez\.com$ -(^|\.)static01\.nyt\.com$ -(^|\.)staticflickr\.com$ -(^|\.)statueofdemocracy\.org$ -(^|\.)stc\.com\.sa$ -(^|\.)steamcommunity\.com$ -(^|\.)steel-storm\.com$ -(^|\.)steganos\.com$ -(^|\.)steganos\.net$ -(^|\.)stepchina\.com$ -(^|\.)stephaniered\.com$ -(^|\.)sthoo\.com$ -(^|\.)stickam\.com$ -(^|\.)stickeraction\.com$ -(^|\.)stileproject\.com$ -(^|\.)sto\.cc$ -(^|\.)stoporganharvesting\.org$ -(^|\.)stoptibetcrisis\.net$ -(^|\.)storagenewsletter\.com$ -(^|\.)store\.steampowered\.com$ -(^|\.)stories\.google$ -(^|\.)storify\.com$ -(^|\.)storm\.mg$ -(^|\.)stormmediagroup\.com$ -(^|\.)stoweboyd\.com$ -(^|\.)stranabg\.com$ -(^|\.)straplessdildo\.com$ -(^|\.)streamingthe\.net$ -(^|\.)streema\.com$ -(^|\.)strikingly\.com$ -(^|\.)strongvpn\.com$ -(^|\.)strongwindpress\.com$ -(^|\.)student\.tw$ -(^|\.)studentsforafreetibet\.org$ -(^|\.)stumbleupon\.com$ -(^|\.)stupidvideos\.com$ -(^|\.)subacme\.rerouted\.org$ -(^|\.)successfn\.com$ -(^|\.)sugarsync\.com$ -(^|\.)sugobbs\.com$ -(^|\.)sugumiru18\.com$ -(^|\.)suissl\.com$ -(^|\.)sujiatun\.wordpress\.com$ -(^|\.)sukebei\.nyaa\.si$ -(^|\.)sulian\.me$ -(^|\.)summify\.com$ -(^|\.)sumrando\.com$ -(^|\.)sun1911\.com$ -(^|\.)sunmedia\.ca$ -(^|\.)sunporno\.com$ -(^|\.)sunskyforum\.com$ -(^|\.)sunta\.com\.tw$ -(^|\.)sunvpn\.net$ -(^|\.)sunwinism\.joinbbs\.net$ -(^|\.)suoluo\.org$ -(^|\.)supchina\.com$ -(^|\.)superfreevpn\.com$ -(^|\.)superokayama\.com$ -(^|\.)superpages\.com$ -(^|\.)supervpn\.net$ -(^|\.)superzooi\.com$ -(^|\.)suppig\.net$ -(^|\.)suprememastertv\.com$ -(^|\.)surfeasy\.com$ -(^|\.)surfeasy\.com\.au$ -(^|\.)suroot\.com$ -(^|\.)surrenderat20\.net$ -(^|\.)sustainability\.google$ -(^|\.)suyangg\.com$ -(^|\.)svsfx\.com$ -(^|\.)swagbucks\.com$ -(^|\.)swissinfo\.ch$ -(^|\.)swissvpn\.net$ -(^|\.)switch1\.jp$ -(^|\.)switchvpn\.net$ -(^|\.)sydneytoday\.com$ -(^|\.)sylfoundation\.org$ -(^|\.)syncback\.com$ -(^|\.)synergyse\.com$ -(^|\.)sysresccd\.org$ -(^|\.)sytes\.net$ -(^|\.)szbbs\.net$ -(^|\.)szetowah\.org\.hk$ -(^|\.)t-g\.com$ -(^|\.)t\.co$ -(^|\.)t\.me$ -(^|\.)t\.orzdream\.com$ -(^|\.)t35\.com$ -(^|\.)t66y\.com$ -(^|\.)taa-usa\.org$ -(^|\.)taaze\.tw$ -(^|\.)tabtter\.jp$ -(^|\.)tacc\.cwb\.gov\.tw$ -(^|\.)tacem\.org$ -(^|\.)taconet\.com\.tw$ -(^|\.)taedp\.org\.tw$ -(^|\.)tafm\.org$ -(^|\.)tagwa\.org\.au$ -(^|\.)tagwalk\.com$ -(^|\.)tahr\.org\.tw$ -(^|\.)taipei\.gov\.tw$ -(^|\.)taipeisociety\.org$ -(^|\.)taiwan-sex\.com$ -(^|\.)taiwanbible\.com$ -(^|\.)taiwancon\.com$ -(^|\.)taiwandaily\.net$ -(^|\.)taiwandc\.org$ -(^|\.)taiwanjobs\.gov\.tw$ -(^|\.)taiwanjustice\.com$ -(^|\.)taiwanjustice\.net$ -(^|\.)taiwankiss\.com$ -(^|\.)taiwannation\.50webs\.com$ -(^|\.)taiwannation\.com$ -(^|\.)taiwannation\.com\.tw$ -(^|\.)taiwanncf\.org\.tw$ -(^|\.)taiwannews\.com\.tw$ -(^|\.)taiwantp\.net$ -(^|\.)taiwantt\.org\.tw$ -(^|\.)taiwanus\.net$ -(^|\.)taiwanyes\.com$ -(^|\.)taiwanyes\.ning\.com$ -(^|\.)talk853\.com$ -(^|\.)talkboxapp\.com$ -(^|\.)talkcc\.com$ -(^|\.)talkonly\.net$ -(^|\.)tamiaode\.tk$ -(^|\.)tanc\.org$ -(^|\.)tangben\.com$ -(^|\.)tangren\.us$ -(^|\.)taoism\.net$ -(^|\.)taolun\.info$ -(^|\.)tapanwap\.com$ -(^|\.)tapatalk\.com$ -(^|\.)tarr\.uspto\.gov$ -(^|\.)tascn\.com\.au$ -(^|\.)taup\.net$ -(^|\.)taweet\.com$ -(^|\.)tbcollege\.org$ -(^|\.)tbi\.org\.hk$ -(^|\.)tbicn\.org$ -(^|\.)tbjyt\.org$ -(^|\.)tbpic\.info$ -(^|\.)tbrc\.org$ -(^|\.)tbs-rainbow\.org$ -(^|\.)tbsec\.org$ -(^|\.)tbskkinabalu\.page\.tl$ -(^|\.)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$ -(^|\.)tdm\.com\.mo$ -(^|\.)teachparentstech\.org$ -(^|\.)teamamericany\.com$ -(^|\.)tech2\.in\.com$ -(^|\.)techviz\.net$ -(^|\.)teck\.in$ -(^|\.)teco-hk\.org$ -(^|\.)teco-mo\.org$ -(^|\.)teddysun\.com$ -(^|\.)teeniefuck\.net$ -(^|\.)teensinasia\.com$ -(^|\.)telecomspace\.com$ -(^|\.)telegram\.dog$ -(^|\.)telegram\.me$ -(^|\.)telegram\.org$ -(^|\.)telegramdownload\.com$ -(^|\.)telegraph\.co\.uk$ -(^|\.)telesco\.pe$ -(^|\.)tellme\.pw$ -(^|\.)tenacy\.com$ -(^|\.)tensorflow\.org$ -(^|\.)tenzinpalmo\.com$ -(^|\.)terminus2049\.github\.io$ -(^|\.)tew\.org$ -(^|\.)textnow\.me$ -(^|\.)th\.hao123\.com$ -(^|\.)thaicn\.com$ -(^|\.)thb\.gov\.tw$ -(^|\.)theatrum-belli\.com$ -(^|\.)thebcomplex\.com$ -(^|\.)theblemish\.com$ -(^|\.)thebobs\.com$ -(^|\.)thebodyshop-usa\.com$ -(^|\.)thecenter\.mit\.edu$ -(^|\.)thechinabeat\.org$ -(^|\.)thedalailamamovie\.com$ -(^|\.)thedw\.us$ -(^|\.)thefacebook\.com$ -(^|\.)thefrontier\.hk$ -(^|\.)thegioitinhoc\.vn$ -(^|\.)thegly\.com$ -(^|\.)thehots\.info$ -(^|\.)thehousenews\.com$ -(^|\.)thehun\.net$ -(^|\.)theinitium\.com$ -(^|\.)thenewslens\.com$ -(^|\.)thepiratebay\.org$ -(^|\.)theporndude\.com$ -(^|\.)theportalwiki\.com$ -(^|\.)thereallove\.kr$ -(^|\.)therock\.net\.nz$ -(^|\.)thespeeder\.com$ -(^|\.)thestandnews\.com$ -(^|\.)thetibetcenter\.org$ -(^|\.)thetibetconnection\.org$ -(^|\.)thetibetmuseum\.org$ -(^|\.)thetibetpost\.com$ -(^|\.)thetinhat\.com$ -(^|\.)thetrotskymovie\.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-info\.net$ -(^|\.)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$ -(^|\.)tibetanfeministcollective\.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$ -(^|\.)tibetlibre\.free\.fr$ -(^|\.)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$ -(^|\.)tiltbrush\.com$ -(^|\.)timdir\.com$ -(^|\.)time\.com$ -(^|\.)times\.hinet\.net$ -(^|\.)timesofindia\.indiatimes\.com$ -(^|\.)timsah\.com$ -(^|\.)tinc-vpn\.org$ -(^|\.)tineye\.com$ -(^|\.)tintuc101\.com$ -(^|\.)tiny\.cc$ -(^|\.)tinychat\.com$ -(^|\.)tinypaste\.com$ -(^|\.)tipo\.gov\.tw$ -(^|\.)tistory\.com$ -(^|\.)tkcs-collins\.com$ -(^|\.)tl\.gd$ -(^|\.)tma\.co\.jp$ -(^|\.)tmagazine\.com$ -(^|\.)tmdfish\.com$ -(^|\.)tmi\.me$ -(^|\.)tmpp\.org$ -(^|\.)tn1\.shemalez\.com$ -(^|\.)tn2\.shemalez\.com$ -(^|\.)tn3\.shemalez\.com$ -(^|\.)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$ -(^|\.)tongil\.or\.kr$ -(^|\.)tono-oka\.jp$ -(^|\.)tonyyan\.net$ -(^|\.)toodoc\.com$ -(^|\.)toonel\.net$ -(^|\.)top\.tv$ -(^|\.)top10vpn\.com$ -(^|\.)top81\.ws$ -(^|\.)topbtc\.com$ -(^|\.)topic\.youthwant\.com\.tw$ -(^|\.)topnews\.in$ -(^|\.)toppornsites\.com$ -(^|\.)topshareware\.com$ -(^|\.)topsy\.com$ -(^|\.)toptip\.ca$ -(^|\.)tor\.blingblingsquad\.net$ -(^|\.)tor\.cn\.uptodown\.com$ -(^|\.)tor\.updatestar\.com$ -(^|\.)tora\.to$ -(^|\.)torcn\.com$ -(^|\.)torguard\.net$ -(^|\.)torproject\.org$ -(^|\.)torrentprivacy\.com$ -(^|\.)torrentproject\.se$ -(^|\.)torrenty\.org$ -(^|\.)torrentz\.eu$ -(^|\.)torvpn\.com$ -(^|\.)tosh\.comedycentral\.com$ -(^|\.)totalvpn\.com$ -(^|\.)toutiaoabc\.com$ -(^|\.)toutyrater\.github\.io$ -(^|\.)towngain\.com$ -(^|\.)toypark\.in$ -(^|\.)toythieves\.com$ -(^|\.)toytractorshow\.com$ -(^|\.)tparents\.org$ -(^|\.)tpi\.org\.tw$ -(^|\.)tracfone\.com$ -(^|\.)traffichaus\.com$ -(^|\.)trans\.wenweipo\.com$ -(^|\.)transparency\.org$ -(^|\.)treemall\.com\.tw$ -(^|\.)trendsmap\.com$ -(^|\.)trialofccp\.org$ -(^|\.)trickip\.net$ -(^|\.)trickip\.org$ -(^|\.)trimondi\.de$ -(^|\.)trouw\.nl$ -(^|\.)trt\.net\.tr$ -(^|\.)trtc\.com\.tw$ -(^|\.)truebuddha-md\.org$ -(^|\.)trulyergonomic\.com$ -(^|\.)truth101\.co\.tv$ -(^|\.)truthontour\.org$ -(^|\.)truveo\.com$ -(^|\.)tryheart\.jp$ -(^|\.)tsctv\.net$ -(^|\.)tsdr\.uspto\.gov$ -(^|\.)tsemtulku\.com$ -(^|\.)tsquare\.tv$ -(^|\.)tsu\.org\.tw$ -(^|\.)tsunagarumon\.com$ -(^|\.)tt-rss\.org$ -(^|\.)tt1069\.com$ -(^|\.)tttan\.com$ -(^|\.)ttvnw\.net$ -(^|\.)tu8964\.com$ -(^|\.)tubaholic\.com$ -(^|\.)tube\.com$ -(^|\.)tube8\.com$ -(^|\.)tube911\.com$ -(^|\.)tubecup\.com$ -(^|\.)tubegals\.com$ -(^|\.)tubeislam\.com$ -(^|\.)tubepornclassic\.com$ -(^|\.)tubestack\.com$ -(^|\.)tubewolf\.com$ -(^|\.)tui\.orzdream\.com$ -(^|\.)tuibeitu\.net$ -(^|\.)tuidang\.net$ -(^|\.)tuidang\.org$ -(^|\.)tuidang\.se$ -(^|\.)tuitwit\.com$ -(^|\.)tumblr\.com$ -(^|\.)tumutanzi\.com$ -(^|\.)tumview\.com$ -(^|\.)tunein\.com$ -(^|\.)tunnelbear\.com$ -(^|\.)tunnelr\.com$ -(^|\.)tuo8\.blue$ -(^|\.)tuo8\.cc$ -(^|\.)tuo8\.club$ -(^|\.)tuo8\.fit$ -(^|\.)tuo8\.hk$ -(^|\.)tuo8\.in$ -(^|\.)tuo8\.ninja$ -(^|\.)tuo8\.org$ -(^|\.)tuo8\.pw$ -(^|\.)tuo8\.red$ -(^|\.)tuo8\.space$ -(^|\.)turansam\.org$ -(^|\.)turbobit\.net$ -(^|\.)turbohide\.com$ -(^|\.)turbotwitter\.com$ -(^|\.)turntable\.fm$ -(^|\.)tushycash\.com$ -(^|\.)tuvpn\.com$ -(^|\.)tuzaijidi\.com$ -(^|\.)tv\.com$ -(^|\.)tvants\.com$ -(^|\.)tvboxnow\.com$ -(^|\.)tvider\.com$ -(^|\.)tvmost\.com\.hk$ -(^|\.)tvplayvideos\.com$ -(^|\.)tvunetworks\.com$ -(^|\.)tw-blog\.com$ -(^|\.)tw-npo\.org$ -(^|\.)tw\.answers\.yahoo\.com$ -(^|\.)tw\.bid\.yahoo\.com$ -(^|\.)tw\.gigacircle\.com$ -(^|\.)tw\.hao123\.com$ -(^|\.)tw\.iqiyi\.com$ -(^|\.)tw\.jiepang\.com$ -(^|\.)tw\.knowledge\.yahoo\.com$ -(^|\.)tw\.mall\.yahoo\.com$ -(^|\.)tw\.mobi\.yahoo\.com$ -(^|\.)tw\.money\.yahoo\.com$ -(^|\.)tw\.myblog\.yahoo\.com$ -(^|\.)tw\.news\.yahoo\.com$ -(^|\.)tw\.streetvoice\.com$ -(^|\.)tw\.tomonews\.net$ -(^|\.)tw\.voa\.mobi$ -(^|\.)tw\.yahoo\.com$ -(^|\.)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$ -(^|\.)tweets\.seraph\.me$ -(^|\.)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$ -(^|\.)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$ -(^|\.)twskype\.com$ -(^|\.)twstar\.net$ -(^|\.)twt\.tl$ -(^|\.)twtkr\.com$ -(^|\.)twtr2src\.ogaoga\.org$ -(^|\.)twtrland\.com$ -(^|\.)twttr\.com$ -(^|\.)twurl\.nl$ -(^|\.)twyac\.org$ -(^|\.)txxx\.com$ -(^|\.)tycool\.com$ -(^|\.)typepad\.com$ -(^|\.)u9un\.com$ -(^|\.)ub0\.cc$ -(^|\.)ubddns\.org$ -(^|\.)uberproxy\.net$ -(^|\.)uc-japan\.org$ -(^|\.)ucdc1998\.org$ -(^|\.)uderzo\.it$ -(^|\.)udn\.com$ -(^|\.)udn\.com\.tw$ -(^|\.)udnbkk\.com$ -(^|\.)uforadio\.com\.tw$ -(^|\.)ufreevpn\.com$ -(^|\.)ug\.m\.wikipedia\.org$ -(^|\.)ugo\.com$ -(^|\.)uhdwallpapers\.org$ -(^|\.)uhrp\.org$ -(^|\.)uighur\.narod\.ru$ -(^|\.)uighur\.nl$ -(^|\.)uighurbiz\.net$ -(^|\.)ukcdp\.co\.uk$ -(^|\.)ukliferadio\.co\.uk$ -(^|\.)uku\.im$ -(^|\.)ulike\.net$ -(^|\.)ulop\.net$ -(^|\.)ultrareach$ -(^|\.)ultrasurf$ -(^|\.)ultravpn\.fr$ -(^|\.)ultraxs\.com$ -(^|\.)umich\.edu$ -(^|\.)unblock-us\.com$ -(^|\.)unblock\.cn\.com$ -(^|\.)unblockdmm\.com$ -(^|\.)unblocker\.yt$ -(^|\.)unblocksit\.es$ -(^|\.)uncyclomedia\.org$ -(^|\.)uncyclopedia\.hk$ -(^|\.)uncyclopedia\.tw$ -(^|\.)underwoodammo\.com$ -(^|\.)unholyknight\.com$ -(^|\.)uni\.cc$ -(^|\.)unification\.net$ -(^|\.)unification\.org\.tw$ -(^|\.)unirule\.cloud$ -(^|\.)unitedsocialpress\.com$ -(^|\.)unix100\.com$ -(^|\.)unknownspace\.org$ -(^|\.)unodedos\.com$ -(^|\.)unpo\.org$ -(^|\.)unseen\.is$ -(^|\.)untraceable\.us$ -(^|\.)uocn\.org$ -(^|\.)upcoming\.yahoo\.com$ -(^|\.)updates\.tdesktop\.com$ -(^|\.)upholdjustice\.org$ -(^|\.)upload4u\.info$ -(^|\.)uploaded\.net$ -(^|\.)uploaded\.to$ -(^|\.)uploadstation\.com$ -(^|\.)upmedia\.mg$ -(^|\.)upornia\.com$ -(^|\.)uproxy\.org$ -(^|\.)upwill\.org$ -(^|\.)ur7s\.com$ -(^|\.)uraban\.me$ -(^|\.)urbansurvival\.com$ -(^|\.)urchin\.com$ -(^|\.)urlborg\.com$ -(^|\.)urlparser\.com$ -(^|\.)us\.to$ -(^|\.)usacn\.com$ -(^|\.)usaip\.eu$ -(^|\.)userapi\.nytlog\.com$ -(^|\.)users\.skynet\.be$ -(^|\.)usfk\.mil$ -(^|\.)ushuarencity\.echainhost\.com$ -(^|\.)usinfo\.state\.gov$ -(^|\.)usma\.edu$ -(^|\.)usmc\.mil$ -(^|\.)usmgtcg\.ning\.com$ -(^|\.)usno\.navy\.mil$ -(^|\.)usocctn\.com$ -(^|\.)ustream\.tv$ -(^|\.)usunitednews\.com$ -(^|\.)usus\.cc$ -(^|\.)utopianpal\.com$ -(^|\.)uu-gg\.com$ -(^|\.)uukanshu\.com$ -(^|\.)uvwxyz\.xyz$ -(^|\.)uwants\.com$ -(^|\.)uwants\.net$ -(^|\.)uyghur-j\.org$ -(^|\.)uyghur\.co\.uk$ -(^|\.)uyghuramerican\.org$ -(^|\.)uyghurcanadiansociety\.org$ -(^|\.)uyghurcongress\.org$ -(^|\.)uyghurensemble\.co\.uk$ -(^|\.)uyghurpen\.org$ -(^|\.)uyghurpress\.com$ -(^|\.)uyghurstudies\.org$ -(^|\.)uygur\.fc2web\.com$ -(^|\.)uygur\.org$ -(^|\.)uymaarip\.com$ -(^|\.)v2ex\.com$ -(^|\.)v2ray\.com$ -(^|\.)van001\.com$ -(^|\.)van698\.com$ -(^|\.)vanemu\.cn$ -(^|\.)vanilla-jp\.com$ -(^|\.)vanpeople\.com$ -(^|\.)vansky\.com$ -(^|\.)vaticannews\.va$ -(^|\.)vatn\.org$ -(^|\.)vcf-online\.org$ -(^|\.)vcfbuilder\.org$ -(^|\.)vds\.rightster\.com$ -(^|\.)vegas\.williamhill\.com$ -(^|\.)vegasred\.com$ -(^|\.)velkaepocha\.sk$ -(^|\.)venbbs\.com$ -(^|\.)venchina\.com$ -(^|\.)venetianmacao\.com$ -(^|\.)ventureswell\.com$ -(^|\.)veoh\.com$ -(^|\.)vermonttibet\.org$ -(^|\.)versavpn\.com$ -(^|\.)verybs\.com$ -(^|\.)vevo\.com$ -(^|\.)vft\.com\.tw$ -(^|\.)viber\.com$ -(^|\.)vica\.info$ -(^|\.)victimsofcommunism\.org$ -(^|\.)vid\.me$ -(^|\.)vidble\.com$ -(^|\.)video\.aol\.ca$ -(^|\.)video\.aol\.co\.uk$ -(^|\.)video\.aol\.com$ -(^|\.)video\.ap\.org$ -(^|\.)video\.fdbox\.com$ -(^|\.)video\.foxbusiness\.com$ -(^|\.)video\.pbs\.org$ -(^|\.)video\.yahoo\.com$ -(^|\.)videobam\.com$ -(^|\.)videodetective\.com$ -(^|\.)videomega\.tv$ -(^|\.)videomo\.com$ -(^|\.)videopediaworld\.com$ -(^|\.)videopress\.com$ -(^|\.)vidinfo\.org$ -(^|\.)vietdaikynguyen\.com$ -(^|\.)vijayatemple\.org$ -(^|\.)vimeo\.com$ -(^|\.)vimperator\.org$ -(^|\.)vincnd\.com$ -(^|\.)vine\.co$ -(^|\.)vinniev\.com$ -(^|\.)vip-enterprise\.com$ -(^|\.)virtualrealporn\.com$ -(^|\.)visibletweets\.com$ -(^|\.)vital247\.org$ -(^|\.)viu\.com$ -(^|\.)viu\.tv$ -(^|\.)vivahentai4u\.net$ -(^|\.)vivatube\.com$ -(^|\.)vivthomas\.com$ -(^|\.)vizvaz\.com$ -(^|\.)vjav\.com$ -(^|\.)vjmedia\.com\.hk$ -(^|\.)vllcs\.org$ -(^|\.)vlog\.xuite\.net$ -(^|\.)vmixcore\.com$ -(^|\.)vmpsoft\.com$ -(^|\.)vn\.hao123\.com$ -(^|\.)vnet\.link$ -(^|\.)voa-11\.akacast\.akamaistream\.net$ -(^|\.)voacantonese\.com$ -(^|\.)voachinese\.com$ -(^|\.)voachineseblog\.com$ -(^|\.)voagd\.com$ -(^|\.)voanews\.com$ -(^|\.)voatibetan\.com$ -(^|\.)voatibetanenglish\.com$ -(^|\.)vocativ\.com$ -(^|\.)vocn\.tv$ -(^|\.)vod-abematv\.akamaized\.net$ -(^|\.)vod\.wwe\.com$ -(^|\.)vot\.org$ -(^|\.)vovo2000\.com$ -(^|\.)voxer\.com$ -(^|\.)voy\.com$ -(^|\.)vpn\.ac$ -(^|\.)vpn\.cjb\.net$ -(^|\.)vpn\.cmu\.edu$ -(^|\.)vpn\.sv\.cmu\.edu$ -(^|\.)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$ -(^|\.)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$ -(^|\.)vtunnel\.com$ -(^|\.)vuku\.cc$ -(^|\.)vultryhw\.com$ -(^|\.)w\.idaiwan\.com$ -(^|\.)w3schools\.com$ -(^|\.)waffle1999\.com$ -(^|\.)wahas\.com$ -(^|\.)waigaobu\.com$ -(^|\.)waikeung\.org$ -(^|\.)wailaike\.net$ -(^|\.)waiwaier\.com$ -(^|\.)wallmama\.com$ -(^|\.)wallornot\.org$ -(^|\.)wallpapercasa\.com$ -(^|\.)wallproxy\.com$ -(^|\.)waltermartin\.com$ -(^|\.)waltermartin\.org$ -(^|\.)wanderinghorse\.net$ -(^|\.)wangafu\.net$ -(^|\.)wangjinbo\.org$ -(^|\.)wanglixiong\.com$ -(^|\.)wango\.org$ -(^|\.)wangruoshui\.net$ -(^|\.)want-daily\.com$ -(^|\.)wanz-factory\.com$ -(^|\.)wapedia\.mobi$ -(^|\.)warbler\.iconfactory\.net$ -(^|\.)waselpro\.com$ -(^|\.)washeng\.net$ -(^|\.)watch8x\.com$ -(^|\.)watchinese\.com$ -(^|\.)watchmygf\.net$ -(^|\.)wattpad\.com$ -(^|\.)wav\.tv$ -(^|\.)waveprotocol\.org$ -(^|\.)waymo\.com$ -(^|\.)wda\.gov\.tw$ -(^|\.)wdf5\.com$ -(^|\.)wearehairy\.com$ -(^|\.)wearn\.com$ -(^|\.)web\.dev$ -(^|\.)web2project\.net$ -(^|\.)webbang\.net$ -(^|\.)webevader\.org$ -(^|\.)webfreer\.com$ -(^|\.)webjb\.org$ -(^|\.)weblagu\.com$ -(^|\.)webmproject\.org$ -(^|\.)webrtc\.org$ -(^|\.)webrush\.net$ -(^|\.)webs-tv\.net$ -(^|\.)website\.informer\.com$ -(^|\.)websitepulse\.com$ -(^|\.)webwarper\.net$ -(^|\.)webworkerdaily\.com$ -(^|\.)weekmag\.info$ -(^|\.)wefightcensorship\.org$ -(^|\.)wefong\.com$ -(^|\.)wego\.here\.com$ -(^|\.)weiboleak\.com$ -(^|\.)weiboscope\.jmsc\.hku\.hk$ -(^|\.)weihuo\.org$ -(^|\.)weijingsheng\.org$ -(^|\.)weiming\.info$ -(^|\.)weiquanwang\.org$ -(^|\.)weisuo\.ws$ -(^|\.)welovecock\.com$ -(^|\.)wemigrate\.org$ -(^|\.)wengewang\.com$ -(^|\.)wengewang\.org$ -(^|\.)wenhui\.ch$ -(^|\.)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$ -(^|\.)whitebear\.freebearblog\.org$ -(^|\.)whodns\.xyz$ -(^|\.)whoer\.net$ -(^|\.)whotalking\.com$ -(^|\.)whylover\.com$ -(^|\.)whyx\.org$ -(^|\.)widevine\.com$ -(^|\.)wikaba\.com$ -(^|\.)wiki\.cnitter\.com$ -(^|\.)wiki\.esu\.im$ -(^|\.)wiki\.gamerp\.jp$ -(^|\.)wiki\.jqueryui\.com$ -(^|\.)wiki\.keso\.cn$ -(^|\.)wiki\.moegirl\.org$ -(^|\.)wiki\.oauth\.net$ -(^|\.)wiki\.phonegap\.com$ -(^|\.)wikileaks-forum\.com$ -(^|\.)wikileaks\.ch$ -(^|\.)wikileaks\.com$ -(^|\.)wikileaks\.de$ -(^|\.)wikileaks\.eu$ -(^|\.)wikileaks\.lu$ -(^|\.)wikileaks\.org$ -(^|\.)wikileaks\.pl$ -(^|\.)wikilivres\.info$ -(^|\.)wikimapia\.org$ -(^|\.)wikiwiki\.jp$ -(^|\.)wildammo\.com$ -(^|\.)williamhill\.com$ -(^|\.)willw\.net$ -(^|\.)windowsphoneme\.com$ -(^|\.)windscribe\.com$ -(^|\.)wingamestore\.com$ -(^|\.)wingy\.site$ -(^|\.)winning11\.com$ -(^|\.)winwhispers\.info$ -(^|\.)wire\.com$ -(^|\.)wiredbytes\.com$ -(^|\.)wiredpen\.com$ -(^|\.)wisdompubs\.org$ -(^|\.)wisevid\.com$ -(^|\.)withgoogle\.com$ -(^|\.)withyoutube\.com$ -(^|\.)witnessleeteaching\.com$ -(^|\.)witopia\.net$ -(^|\.)wizcrafts\.net$ -(^|\.)wjbk\.org$ -(^|\.)wlcnew\.jigsy\.com$ -(^|\.)wlx\.sowiki\.net$ -(^|\.)wn\.com$ -(^|\.)wnacg\.com$ -(^|\.)wnacg\.org$ -(^|\.)wo\.tc$ -(^|\.)wo3ttt\.wordpress\.com$ -(^|\.)woeser\.com$ -(^|\.)woesermiddle-way\.net$ -(^|\.)wokar\.org$ -(^|\.)wolfax\.com$ -(^|\.)woolyss\.com$ -(^|\.)woopie\.jp$ -(^|\.)woopie\.tv$ -(^|\.)wordpress\.com$ -(^|\.)workatruna\.com$ -(^|\.)workerdemo\.org\.hk$ -(^|\.)workerempowerment\.org$ -(^|\.)workersthebig\.net$ -(^|\.)worldcat\.org$ -(^|\.)worldjournal\.com$ -(^|\.)worldvpn\.net$ -(^|\.)wow-life\.net$ -(^|\.)wow\.com$ -(^|\.)wowgirls\.com$ -(^|\.)wowlegacy\.ml$ -(^|\.)wowporn\.com$ -(^|\.)wowrk\.com$ -(^|\.)woxinghuiguo\.com$ -(^|\.)woyaolian\.org$ -(^|\.)wozy\.in$ -(^|\.)wp\.com$ -(^|\.)wpoforum\.com$ -(^|\.)wqyd\.org$ -(^|\.)wrchina\.org$ -(^|\.)wretch\.cc$ -(^|\.)writer\.zoho\.com$ -(^|\.)wsgzao\.github\.io$ -(^|\.)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$ -(^|\.)wuu\.wikipedia\.org$ -(^|\.)wuw\.red$ -(^|\.)wuyanblog\.com$ -(^|\.)wwitv\.com$ -(^|\.)www\.ajsands\.com$ -(^|\.)www\.americorps\.gov$ -(^|\.)www\.antd\.org$ -(^|\.)www\.aolnews\.com$ -(^|\.)www\.businessinsider\.com\.au$ -(^|\.)www\.citizenlab\.org$ -(^|\.)www\.cmoinc\.org$ -(^|\.)www\.cool18\.com$ -(^|\.)www\.dmm\.com$ -(^|\.)www\.dwheeler\.com$ -(^|\.)www\.eastturkistan\.net$ -(^|\.)www\.ftchinese\.com$ -(^|\.)www\.gmiddle\.com$ -(^|\.)www\.gmiddle\.net$ -(^|\.)www\.hustlercash\.com$ -(^|\.)www\.idlcoyote\.com$ -(^|\.)www\.imdb\.com$ -(^|\.)www\.kindleren\.com$ -(^|\.)www\.klip\.me$ -(^|\.)www\.lamenhu\.com$ -(^|\.)www\.lib\.virginia\.edu$ -(^|\.)www\.linksalpha\.com$ -(^|\.)www\.m-sport\.co\.uk$ -(^|\.)www\.metro\.taipei$ -(^|\.)www\.monlamit\.org$ -(^|\.)www\.moztw\.org$ -(^|\.)www\.nbc\.com$ -(^|\.)www\.orchidbbs\.com$ -(^|\.)www\.owind\.com$ -(^|\.)www\.oxid\.it$ -(^|\.)www\.powerpointninja\.com$ -(^|\.)www\.s4miniarchive\.com$ -(^|\.)www\.sciencemag\.org$ -(^|\.)www\.shadowsocks\.com$ -(^|\.)www\.shwchurch\.org$ -(^|\.)www\.skype\.com$ -(^|\.)www\.tablesgenerator\.com$ -(^|\.)www\.taiwanonline\.cc$ -(^|\.)www\.taup\.org\.tw$ -(^|\.)www\.thechinastory\.org$ -(^|\.)www\.wan-press\.org$ -(^|\.)www\.wangruowang\.org$ -(^|\.)www\.websnapr\.com$ -(^|\.)www\.zensur\.freerk\.com$ -(^|\.)www1\.american\.edu$ -(^|\.)www1\.biz$ -(^|\.)www2\.ohchr\.org$ -(^|\.)www2\.rocketbbs\.com$ -(^|\.)wwwhost\.biz$ -(^|\.)wzyboy\.im$ -(^|\.)x-art\.com$ -(^|\.)x-berry\.com$ -(^|\.)x-wall\.org$ -(^|\.)x\.company$ -(^|\.)x1949x\.com$ -(^|\.)x24hr\.com$ -(^|\.)x365x\.com$ -(^|\.)xa\.yimg\.com$ -(^|\.)xanga\.com$ -(^|\.)xbabe\.com$ -(^|\.)xbookcn\.com$ -(^|\.)xbtce\.com$ -(^|\.)xcafe\.in$ -(^|\.)xcity\.jp$ -(^|\.)xcritic\.com$ -(^|\.)xerotica\.com$ -(^|\.)xfinity\.com$ -(^|\.)xfm\.pp\.ru$ -(^|\.)xgmyd\.com$ -(^|\.)xhamster\.com$ -(^|\.)xianba\.net$ -(^|\.)xianchawang\.net$ -(^|\.)xianjian\.tw$ -(^|\.)xianqiao\.net$ -(^|\.)xiaobaiwu\.com$ -(^|\.)xiaochuncnjp\.com$ -(^|\.)xiaod\.in$ -(^|\.)xiaohexie\.com$ -(^|\.)xiaolan\.me$ -(^|\.)xiaoma\.org$ -(^|\.)xiezhua\.com$ -(^|\.)xihua\.es$ -(^|\.)xijie\.wordpress\.com$ -(^|\.)xing\.com$ -(^|\.)xinhuanet\.org$ -(^|\.)xinmiao\.com\.hk$ -(^|\.)xinqimeng\.over-blog\.com$ -(^|\.)xinsheng\.net$ -(^|\.)xinshijue\.com$ -(^|\.)xinyubbs\.net$ -(^|\.)xiongpian\.com$ -(^|\.)xiuren\.org$ -(^|\.)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--czq75pvv1aj5c\.org$ -(^|\.)xn--i2ru8q2qg\.com$ -(^|\.)xn--ngstr-lra8j\.com$ -(^|\.)xn--oiq\.cc$ -(^|\.)xn--p8j9a0d9c9a\.xn--q9jyb4c$ -(^|\.)xnxx\.com$ -(^|\.)xpdo\.net$ -(^|\.)xpud\.org$ -(^|\.)xrentdvd\.com$ -(^|\.)xskywalker\.com$ -(^|\.)xskywalker\.net$ -(^|\.)xtube\.com$ -(^|\.)xuchao\.net$ -(^|\.)xuchao\.org$ -(^|\.)xuehua\.us$ -(^|\.)xuzhiyong\.net$ -(^|\.)xvideo\.cc$ -(^|\.)xvideos\.com$ -(^|\.)xvideos\.es$ -(^|\.)xxbbx\.com$ -(^|\.)xxlmovies\.com$ -(^|\.)xxuz\.com$ -(^|\.)xxx\.com$ -(^|\.)xxx\.xxx$ -(^|\.)xxxfuckmom\.com$ -(^|\.)xxxx\.com\.au$ -(^|\.)xxxy\.biz$ -(^|\.)xxxy\.info$ -(^|\.)xxxymovies\.com$ -(^|\.)xys\.dxiong\.com$ -(^|\.)xys\.org$ -(^|\.)xysblogs\.org$ -(^|\.)xyy69\.com$ -(^|\.)xyy69\.info$ -(^|\.)yahoo\.com\.hk$ -(^|\.)yakbutterblues\.com$ -(^|\.)yam\.com$ -(^|\.)yam\.org\.tw$ -(^|\.)yanghengjun\.com$ -(^|\.)yangjianli\.com$ -(^|\.)yasni\.co\.uk$ -(^|\.)yayabay\.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$ -(^|\.)yilubbs\.com$ -(^|\.)yingsuoss\.com$ -(^|\.)yinlei\.org$ -(^|\.)yipub\.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$ -(^|\.)youthnetradio\.org$ -(^|\.)youtu\.be$ -(^|\.)youtube-nocookie\.com$ -(^|\.)youtube\.com$ -(^|\.)youtubecn\.com$ -(^|\.)youtubeeducation\.com$ -(^|\.)youtubegaming\.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$ -(^|\.)yzzk\.com$ -(^|\.)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$ -(^|\.)zenmate\.com\.ru$ -(^|\.)zeronet\.io$ -(^|\.)zeutch\.com$ -(^|\.)zfreet\.com$ -(^|\.)zgsddh\.com$ -(^|\.)zgzcjj\.net$ -(^|\.)zh-yue\.wikipedia\.org$ -(^|\.)zh\.bitterwinter\.org$ -(^|\.)zh\.ecdm\.wikia\.com$ -(^|\.)zh\.m\.wikipedia\.org$ -(^|\.)zh\.pokerstrategy\.com$ -(^|\.)zh\.pttpedia\.wikia\.com$ -(^|\.)zh\.uncyclopedia\.wikia\.com$ -(^|\.)zh\.wikinews\.org$ -(^|\.)zh\.wikipedia\.org$ -(^|\.)zh\.wikisource\.org$ -(^|\.)zhanbin\.net$ -(^|\.)zhangboli\.net$ -(^|\.)zhangtianliang\.com$ -(^|\.)zhanlve\.org$ -(^|\.)zhao\.1984\.city$ -(^|\.)zhao\.jinhai\.de$ -(^|\.)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$ -(^|\.)ziddu\.com$ -(^|\.)zillionk\.com$ -(^|\.)zim\.vn$ -(^|\.)zinio\.com$ -(^|\.)ziporn\.com$ -(^|\.)zippyshare\.com$ -(^|\.)zkaip\.com$ -(^|\.)zmw\.cn$ -(^|\.)zodgame\.us$ -(^|\.)zomobo\.net$ -(^|\.)zonaeuropa\.com$ -(^|\.)zonghexinwen\.com$ -(^|\.)zonghexinwen\.net$ -(^|\.)zoogvpn\.com$ -(^|\.)zootool\.com$ -(^|\.)zoozle\.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$ -(^|\.)zyzc9\.com$ -(^|\.)zzcartoon\.com$ -(^|\.)zzcloud\.me$ -(^|\.)zzux\.com$ diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index e7786620d..7ca91d852 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -86,7 +86,6 @@ dependencies { implementation(libs.kotlinx.coroutines) implementation(libs.bundles.androidx.camera) implementation(libs.google.mlkit) - implementation(project(":shadowsocks")) // todo: remove after finish refactoring implementation(libs.androidx.constraintlayout) } diff --git a/client/android/shadowsocks/src/main/res/drawable/ic_amnezia_round.xml b/client/android/res/drawable/ic_amnezia_round.xml similarity index 100% rename from client/android/shadowsocks/src/main/res/drawable/ic_amnezia_round.xml rename to client/android/res/drawable/ic_amnezia_round.xml diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index ace266a17..2d8e19f1c 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -33,8 +33,6 @@ plugins { rootProject.name = "AmneziaVPN" rootProject.buildFileName = "build.gradle.kts" -include(":shadowsocks") - // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties val androidCompileSdkVersion: String by gradleProperties diff --git a/client/android/src/org/amnezia/vpn/NotificationUtil.kt b/client/android/src/org/amnezia/vpn/NotificationUtil.kt index efa7fb747..6b36c6402 100644 --- a/client/android/src/org/amnezia/vpn/NotificationUtil.kt +++ b/client/android/src/org/amnezia/vpn/NotificationUtil.kt @@ -12,7 +12,6 @@ import android.content.Intent import android.os.Build import android.os.Parcel import androidx.core.app.NotificationCompat -import org.amnezia.vpn.shadowsocks.core.R import org.json.JSONObject object NotificationUtil { diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/VPNService.kt index 929545d65..dc2fe8953 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/VPNService.kt @@ -24,19 +24,19 @@ import com.wireguard.android.backend.GoBackend import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.R -import org.amnezia.vpn.shadowsocks.core.VpnRequestActivity -import org.amnezia.vpn.shadowsocks.core.acl.Acl -import org.amnezia.vpn.shadowsocks.core.bg.* -import org.amnezia.vpn.shadowsocks.core.database.Profile -import org.amnezia.vpn.shadowsocks.core.database.ProfileManager -import org.amnezia.vpn.shadowsocks.core.net.ConcurrentLocalSocketListener -import org.amnezia.vpn.shadowsocks.core.net.DefaultNetworkListener -import org.amnezia.vpn.shadowsocks.core.net.Subnet -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Key.modeVpn -import org.amnezia.vpn.shadowsocks.core.utils.printLog +// import org.amnezia.vpn.shadowsocks.core.Core +// import org.amnezia.vpn.shadowsocks.core.R +// import org.amnezia.vpn.shadowsocks.core.VpnRequestActivity +// import org.amnezia.vpn.shadowsocks.core.acl.Acl +// import org.amnezia.vpn.shadowsocks.core.bg.* +// import org.amnezia.vpn.shadowsocks.core.database.Profile +// import org.amnezia.vpn.shadowsocks.core.database.ProfileManager +// import org.amnezia.vpn.shadowsocks.core.net.ConcurrentLocalSocketListener +// import org.amnezia.vpn.shadowsocks.core.net.DefaultNetworkListener +// import org.amnezia.vpn.shadowsocks.core.net.Subnet +// import org.amnezia.vpn.shadowsocks.core.preference.DataStore +// import org.amnezia.vpn.shadowsocks.core.utils.Key.modeVpn +// import org.amnezia.vpn.shadowsocks.core.utils.printLog import org.json.JSONObject import java.io.Closeable import java.io.File @@ -46,16 +46,16 @@ import java.lang.Exception import android.net.VpnService as BaseVpnService -class VPNService : BaseVpnService(), LocalDnsService.Interface { +class VPNService : BaseVpnService()/* , LocalDnsService.Interface */ { - override val data = BaseService.Data(this) + // override val data = BaseService.Data(this) - override val tag: String get() = "VPNService" + /* override */ val tag: String get() = "VPNService" // override fun createNotification(profileName: String): ServiceNotification = // ServiceNotification(this, profileName, "service-vpn") private var conn: ParcelFileDescriptor? = null - private var worker: ProtectWorker? = null + // private var worker: ProtectWorker? = null private var active = false private var metered = false private var mNetworkState = NetworkState(this) @@ -77,7 +77,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { var runnable: Runnable = object : Runnable { override fun run() { if (mProtocol.equals("shadowsocks", true)) { - Log.e(tag, "run: -----------------: ${data.state}") + /* Log.e(tag, "run: -----------------: ${data.state}") when (data.state) { BaseService.State.Connected -> { currentTunnelHandle = 1 @@ -90,7 +90,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { else -> { } - } + } */ } handler.postDelayed(this, 1000L) //wait 4 sec and run again } @@ -181,11 +181,11 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { when (mProtocol) { "shadowsocks" -> { - when (intent.action) { + /* when (intent.action) { SERVICE_INTERFACE -> super.onBind(intent) else -> super.onBind(intent) } - startTest() + startTest() */ } else -> { init() @@ -231,7 +231,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { startOpenVpn() mNetworkState.bindNetworkListener() } - if (mProtocol.equals("shadowsocks", true)) { + /* if (mProtocol.equals("shadowsocks", true)) { if (DataStore.serviceMode == modeVpn) { if (prepare(this) != null) { startActivity( @@ -248,7 +248,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { } } stopRunner() - } + } */ return START_REDELIVER_INTENT } @@ -385,10 +385,10 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { "awg" -> { startWireGuard("awg") } - "shadowsocks" -> { + /* "shadowsocks" -> { startShadowsocks() startTest() - } + } */ else -> { Log.e(tag, "No protocol") return 0 @@ -469,10 +469,10 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { ovpnTurnOff() mNetworkState.unBindNetworkListener() } - "shadowsocks" -> { + /* "shadowsocks" -> { stopRunner(false) stopTest() - } + } */ else -> { Log.e(tag, "No protocol") } @@ -679,7 +679,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { return mConfig!! } - private fun startShadowsocks() { + /* private fun startShadowsocks() { Log.e(tag, "startShadowsocks method enters") if (mConfig != null) { try { @@ -768,7 +768,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { } else { Log.e(tag, "Invalid config file!!") } - } + } */ private fun startOpenVpn() { if (isUp || mOpenVPNThreadv3 != null) { @@ -821,7 +821,7 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { .apply() } - override suspend fun startProcesses() { + /* override suspend fun startProcesses() { worker = ProtectWorker().apply { start() } try { Log.i(tag, "startProcesses: ------------------1") @@ -832,9 +832,9 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { } catch (e: Exception) { e.printStackTrace() } - } + } */ - override fun killProcesses(scope: CoroutineScope) { + /* override fun killProcesses(scope: CoroutineScope) { super.killProcesses(scope) active = false scope.launch { DefaultNetworkListener.stop(this) } @@ -842,9 +842,9 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { worker = null conn?.close() conn = null - } + } */ - private suspend fun startVpn(): FileDescriptor { + /* private suspend fun startVpn(): FileDescriptor { val profile = data.proxy!!.profile Log.i(tag, "startVpn: -----------------------1") val builder = Builder() @@ -925,9 +925,9 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { }) Log.i(tag, "startVpn: -----------------------13") return conn.fileDescriptor - } + } */ - private suspend fun sendFd(fd: FileDescriptor) { + /* private suspend fun sendFd(fd: FileDescriptor) { var tries = 0 val path = File(Core.deviceStorage.noBackupFilesDir, "sock_path").absolutePath while (true) try { @@ -947,10 +947,10 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { if (tries > 5) throw e tries += 1 } - } + } */ - private inner class ProtectWorker : ConcurrentLocalSocketListener( + /* private inner class ProtectWorker : ConcurrentLocalSocketListener( "ShadowsocksVpnThread", File(Core.deviceStorage.noBackupFilesDir, "protect_path") ) { @@ -970,11 +970,11 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface { }) 0 else 1) } } - } + } */ - inner class NullConnectionException : NullPointerException() { + /* inner class NullConnectionException : NullPointerException() { override fun getLocalizedMessage() = getString(R.string.reboot_required) - } + } */ class CloseableFd(val fd: FileDescriptor) : Closeable { override fun close() = Os.close(fd) diff --git a/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt b/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt index 77332efa7..34cf4a32e 100644 --- a/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt +++ b/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt @@ -1,8 +1,8 @@ package org.amnezia.vpn.qt import android.content.res.Configuration -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.VpnManager +// import org.amnezia.vpn.shadowsocks.core.Core +// import org.amnezia.vpn.shadowsocks.core.VpnManager import org.qtproject.qt.android.bindings.QtActivity import org.qtproject.qt.android.bindings.QtApplication import android.app.Application @@ -11,12 +11,12 @@ class AmneziaApp: org.qtproject.qt.android.bindings.QtApplication() { override fun onCreate() { super.onCreate() - Core.init(this, QtActivity::class) - VpnManager.getInstance().init(this) + /* Core.init(this, QtActivity::class) + VpnManager.getInstance().init(this) */ } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - Core.updateNotificationChannels() + // Core.updateNotificationChannels() } } From 2fde47a86f1f96027ddd4848806aa763396e9c24 Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 15 Nov 2023 22:10:44 +0300 Subject: [PATCH 041/144] Move qt binding java code to a separate module --- client/android/build.gradle.kts | 7 ++++--- client/android/qt/build.gradle.kts | 25 +++++++++++++++++++++++++ client/android/settings.gradle.kts | 2 ++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 client/android/qt/build.gradle.kts diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 7ca91d852..5461a3a9d 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -11,7 +11,6 @@ kotlin { // get values from gradle or local properties val qtTargetSdkVersion: String by gradleProperties val qtTargetAbiList: String by gradleProperties -val qtAndroidDir: String by gradleProperties android { namespace = "org.amnezia.vpn" @@ -42,8 +41,9 @@ android { sourceSets { getByName("main") { manifest.srcFile("AndroidManifest.xml") - java.setSrcDirs(listOf("$qtAndroidDir/src", "src")) - res.setSrcDirs(listOf("$qtAndroidDir/res", "res")) + java.setSrcDirs(listOf("src")) + res.setSrcDirs(listOf("res")) + // androyddeployqt creates the folders below assets.setSrcDirs(listOf("assets")) jniLibs.setSrcDirs(listOf("libs")) } @@ -80,6 +80,7 @@ android { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) + implementation(project(":qt")) implementation(libs.androidx.core) implementation(libs.androidx.appcompat) implementation(libs.androidx.security.crypto) diff --git a/client/android/qt/build.gradle.kts b/client/android/qt/build.gradle.kts new file mode 100644 index 000000000..2ec2c941c --- /dev/null +++ b/client/android/qt/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id("property-delegate") +} + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(17)) +} + +val qtAndroidDir: String by gradleProperties + +android { + namespace = "org.qtproject.qt.android.binding" + + sourceSets { + getByName("main") { + java.setSrcDirs(listOf("$qtAndroidDir/src")) + res.setSrcDirs(listOf("$qtAndroidDir/res")) + } + } +} + +dependencies { + implementation(fileTree(mapOf("dir" to "../libs", "include" to listOf("*.jar", "*.aar")))) +} diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 2d8e19f1c..ac37a9639 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -33,6 +33,8 @@ plugins { rootProject.name = "AmneziaVPN" rootProject.buildFileName = "build.gradle.kts" +include(":qt") + // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties val androidCompileSdkVersion: String by gradleProperties From f1c970461f84d3474dec57e8da67717a54ebe7c9 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 16 Nov 2023 15:15:02 +0300 Subject: [PATCH 042/144] Create utils module, move Log class there BuildConfig class is now only created in the utils module --- client/android/build.gradle.kts | 2 +- client/android/settings.gradle.kts | 1 + client/android/utils/build.gradle.kts | 17 +++++++++++++++++ .../src/main/kotlin/Log.kt} | 0 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 client/android/utils/build.gradle.kts rename client/android/{src/org/amnezia/vpn/VPNLogger.kt => utils/src/main/kotlin/Log.kt} (100%) diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 5461a3a9d..f4d14ed8d 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -16,7 +16,6 @@ android { namespace = "org.amnezia.vpn" buildFeatures { - buildConfig = true viewBinding = true } @@ -81,6 +80,7 @@ android { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) implementation(project(":qt")) + implementation(project(":utils")) implementation(libs.androidx.core) implementation(libs.androidx.appcompat) implementation(libs.androidx.security.crypto) diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index ac37a9639..26b5763f8 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -34,6 +34,7 @@ rootProject.name = "AmneziaVPN" rootProject.buildFileName = "build.gradle.kts" include(":qt") +include(":utils") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties diff --git a/client/android/utils/build.gradle.kts b/client/android/utils/build.gradle.kts new file mode 100644 index 000000000..792d43d66 --- /dev/null +++ b/client/android/utils/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn" + + buildFeatures { + // add BuildConfig class + buildConfig = true + } +} diff --git a/client/android/src/org/amnezia/vpn/VPNLogger.kt b/client/android/utils/src/main/kotlin/Log.kt similarity index 100% rename from client/android/src/org/amnezia/vpn/VPNLogger.kt rename to client/android/utils/src/main/kotlin/Log.kt From 617cdf14addb8d33b993af3321b0d3ca151d7123 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 16 Nov 2023 15:30:44 +0300 Subject: [PATCH 043/144] Log class refactoring --- .../android/src/org/amnezia/vpn/VPNService.kt | 2 +- .../src/org/amnezia/vpn/VPNServiceBinder.kt | 4 +- client/android/utils/src/main/kotlin/Log.kt | 85 +++++-------------- 3 files changed, 26 insertions(+), 65 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/VPNService.kt index dc2fe8953..7f70643cc 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/VPNService.kt @@ -144,7 +144,7 @@ class VPNService : BaseVpnService()/* , LocalDnsService.Interface */ { if (mAlreadyInitialised) { return } - Log.init(this) + // Log.init(this) SharedLibraryLoader.loadSharedLibrary(this, "wg-go") SharedLibraryLoader.loadSharedLibrary(this, "ovpn3") Log.i(tag, "Loaded libs") diff --git a/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt b/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt index 531a3df13..391c774ee 100644 --- a/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt +++ b/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt @@ -119,12 +119,12 @@ class VPNServiceBinder(service: VPNService) : Binder() { ACTIONS.requestGetLog -> { // Grabs all the Logs and dispatch new Log Event - dispatchEvent(EVENTS.backendLogs, Log.getContent()) + // dispatchEvent(EVENTS.backendLogs, Log.getContent()) return true } ACTIONS.requestCleanupLog -> { - Log.clearFile() + // Log.clearFile() return true } diff --git a/client/android/utils/src/main/kotlin/Log.kt b/client/android/utils/src/main/kotlin/Log.kt index e28dc4719..5b2657ba4 100644 --- a/client/android/utils/src/main/kotlin/Log.kt +++ b/client/android/utils/src/main/kotlin/Log.kt @@ -1,72 +1,33 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - package org.amnezia.vpn -import android.content.Context -import java.io.File -import java.time.LocalDateTime -import android.util.Log as nativeLog +import android.util.Log as NativeLog -/* - * Drop in replacement for android.util.Log - * Also stores a copy of all logs in tmp/amnezia_daemon_logs.txt -*/ class Log { - val LOG_MAX_FILE_SIZE = 204800 - private var file: File - private constructor(context: Context) { - val tempDIR = context.cacheDir - file = File(tempDIR, "amnezia_daemon_logs.txt") - if (file.length() > LOG_MAX_FILE_SIZE) { - file.writeText("") - } - } - companion object { - var instance: Log? = null - fun init(ctx: Context) { - if (instance == null) { - instance = Log(ctx) - } - } - fun i(tag: String, message: String) { - instance?.write("[info] - ($tag) - $message") - if (!BuildConfig.DEBUG) { return; } - nativeLog.i(tag, message) - } - fun v(tag: String, message: String) { - instance?.write("($tag) - $message") - if (!BuildConfig.DEBUG) { return; } - nativeLog.v(tag, message) - } - fun e(tag: String, message: String) { - instance?.write("[error] - ($tag) - $message") - if (!BuildConfig.DEBUG) { return; } - nativeLog.e(tag, message) - } - // Only Prints && Logs when in debug, noop in release. - fun sensitive(tag: String, message: String?) { - if (!BuildConfig.DEBUG) { return; } - if (message == null) { return; } - e(tag, message) - } + fun v(tag: String, msg: String) = debugLog(tag, msg, NativeLog::v) - fun getContent(): String? { - return try { - instance?.file?.readText() - } catch (e: Exception) { - "=== Failed to read Daemon Logs === \n ${e.localizedMessage} " - } - } + fun d(tag: String, msg: String) = debugLog(tag, msg, NativeLog::d) - fun clearFile() { - instance?.file?.writeText("") + fun i(tag: String, msg: String) = log(tag, msg, NativeLog::i) + + fun w(tag: String, msg: String) = log(tag, msg, NativeLog::w) + + fun e(tag: String, msg: String) = log(tag, msg, NativeLog::e) + + fun v(tag: String, msg: Any?) = v(tag, msg.toString()) + + fun d(tag: String, msg: Any?) = d(tag, msg.toString()) + + fun i(tag: String, msg: Any?) = i(tag, msg.toString()) + + fun w(tag: String, msg: Any?) = w(tag, msg.toString()) + + fun e(tag: String, msg: Any?) = e(tag, msg.toString()) + + private inline fun log(tag: String, msg: String, delegate: (String, String) -> Unit) = delegate(tag, msg) + + private inline fun debugLog(tag: String, msg: String, delegate: (String, String) -> Unit) { + if (BuildConfig.DEBUG) delegate(tag, msg) } } - private fun write(message: String) { - //LocalDateTime.now() - //file.appendText("[${LocalDateTime.now()}] $message \n") - } } From bc68c487eed34231dc92477e15b08df7094b6129 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 16 Nov 2023 19:49:36 +0300 Subject: [PATCH 044/144] Update to qt 6.6.0 --- .github/workflows/deploy.yml | 2 +- client/cmake/android.cmake | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index be570a064..173970478 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -275,7 +275,7 @@ jobs: env: ANDROID_BUILD_PLATFORM: android-34 - QT_VERSION: 6.5.3 + QT_VERSION: 6.6.0 QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' steps: diff --git a/client/cmake/android.cmake b/client/cmake/android.cmake index 7511690d1..66ff1e15a 100644 --- a/client/cmake/android.cmake +++ b/client/cmake/android.cmake @@ -4,6 +4,9 @@ set(APP_ANDROID_MIN_SDK 24) set(ANDROID_PLATFORM "android-${APP_ANDROID_MIN_SDK}" CACHE STRING "The minimum API level supported by the application or library" FORCE) +# set QTP0002 policy: target properties that specify Android-specific paths may contain generator expressions +qt_policy(SET QTP0002 NEW) + set_target_properties(${PROJECT} PROPERTIES QT_ANDROID_VERSION_NAME ${CMAKE_PROJECT_VERSION} QT_ANDROID_VERSION_CODE ${APP_ANDROID_VERSION_CODE} From 5a5ea4a018befa65cf6ad69cef1b8de1fc8eef47 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 16 Nov 2023 20:16:28 +0300 Subject: [PATCH 045/144] Android project restructuring --- client/android/AndroidManifest.xml | 14 +++++------ .../{qt/VPNActivity.kt => AmneziaActivity.kt} | 23 +++++++++---------- .../AmneziaApp.kt => AmneziaApplication.kt} | 4 ++-- .../{VPNService.kt => AmneziaVpnService.kt} | 6 ++--- .../amnezia/vpn/{qt => }/CameraActivity.kt | 2 +- .../vpn/{qt => }/ImportConfigActivity.kt | 9 +++----- .../src/org/amnezia/vpn/NetworkState.kt | 5 ++-- .../src/org/amnezia/vpn/NotificationUtil.kt | 4 ++-- .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 4 ++-- .../vpn/{qt => }/PackageManagerHelper.java | 2 +- .../amnezia/vpn/{qt => }/VPNClientBinder.kt | 7 +++--- .../vpn/{qt => }/VPNPermissionHelper.kt | 2 +- .../src/org/amnezia/vpn/VPNServiceBinder.kt | 2 +- .../org/amnezia/vpn/qt/QtAndroidController.kt | 4 ++++ .../platforms/android/android_controller.cpp | 2 +- .../platforms/android/androidvpnactivity.cpp | 2 +- client/ui/controllers/importController.cpp | 2 +- 17 files changed, 46 insertions(+), 48 deletions(-) rename client/android/src/org/amnezia/vpn/{qt/VPNActivity.kt => AmneziaActivity.kt} (92%) rename client/android/src/org/amnezia/vpn/{qt/AmneziaApp.kt => AmneziaApplication.kt} (85%) rename client/android/src/org/amnezia/vpn/{VPNService.kt => AmneziaVpnService.kt} (99%) rename client/android/src/org/amnezia/vpn/{qt => }/CameraActivity.kt (99%) rename client/android/src/org/amnezia/vpn/{qt => }/ImportConfigActivity.kt (95%) rename client/android/src/org/amnezia/vpn/{qt => }/PackageManagerHelper.java (99%) rename client/android/src/org/amnezia/vpn/{qt => }/VPNClientBinder.kt (76%) rename client/android/src/org/amnezia/vpn/{qt => }/VPNPermissionHelper.kt (98%) create mode 100644 client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 7671cecb8..452919773 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -28,7 +28,7 @@ - + @@ -62,11 +62,11 @@ @@ -122,7 +122,7 @@ diff --git a/client/android/src/org/amnezia/vpn/qt/VPNActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt similarity index 92% rename from client/android/src/org/amnezia/vpn/qt/VPNActivity.kt rename to client/android/src/org/amnezia/vpn/AmneziaActivity.kt index a8aa73d6e..80eb2b6c7 100644 --- a/client/android/src/org/amnezia/vpn/qt/VPNActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.amnezia.vpn.qt; +package org.amnezia.vpn import android.Manifest import android.content.ComponentName @@ -19,7 +19,6 @@ import android.view.KeyEvent import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import org.amnezia.vpn.VPNService import org.amnezia.vpn.VPNServiceBinder import org.amnezia.vpn.IMPORT_COMMAND_CODE import org.amnezia.vpn.IMPORT_ACTION_CODE @@ -27,7 +26,7 @@ import org.amnezia.vpn.IMPORT_CONFIG_KEY import org.qtproject.qt.android.bindings.QtActivity import java.io.* -class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { +class AmneziaActivity : org.qtproject.qt.android.bindings.QtActivity() { private var configString: String? = null private var vpnServiceBinder: IBinder? = null @@ -40,7 +39,7 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { } } - private val TAG = "VPNActivity" + private val TAG = "AmneziaActivity" private val CAMERA_ACTION_CODE = 101 private val CREATE_FILE_ACTION_CODE = 102 @@ -50,26 +49,26 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { private val delayedCommands: ArrayList> = ArrayList() companion object { - private lateinit var instance: VPNActivity + private lateinit var instance: AmneziaActivity - @JvmStatic fun getInstance(): VPNActivity { + @JvmStatic fun getInstance(): AmneziaActivity { return instance } @JvmStatic fun connectService() { - VPNActivity.getInstance().initServiceConnection() + getInstance().initServiceConnection() } @JvmStatic fun startQrCodeReader() { - VPNActivity.getInstance().startQrCodeActivity() + getInstance().startQrCodeActivity() } @JvmStatic fun sendToService(actionCode: Int, body: String) { - VPNActivity.getInstance().dispatchParcel(actionCode, body) + getInstance().dispatchParcel(actionCode, body) } @JvmStatic fun saveFileAs(fileContent: String, suggestedName: String) { - VPNActivity.getInstance().saveFile(fileContent, suggestedName) + getInstance().saveFile(fileContent, suggestedName) } } @@ -81,7 +80,7 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { val newIntent = intent val newIntentAction: String? = newIntent.action - if (newIntent != null && newIntentAction != null && newIntentAction == "org.amnezia.vpn.qt.IMPORT_CONFIG") { + if (newIntent != null && newIntentAction != null && newIntentAction == "org.amnezia.vpn.IMPORT_CONFIG") { configString = newIntent.getStringExtra("CONFIG") } } @@ -232,7 +231,7 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { return } - bindService(Intent(this, VPNService::class.java), connection, Context.BIND_AUTO_CREATE) + bindService(Intent(this, AmneziaVpnService::class.java), connection, Context.BIND_AUTO_CREATE) } // TODO: Move all ipc codes into a shared lib. diff --git a/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt b/client/android/src/org/amnezia/vpn/AmneziaApplication.kt similarity index 85% rename from client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt rename to client/android/src/org/amnezia/vpn/AmneziaApplication.kt index 34cf4a32e..e41b27c40 100644 --- a/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaApplication.kt @@ -1,4 +1,4 @@ -package org.amnezia.vpn.qt +package org.amnezia.vpn import android.content.res.Configuration // import org.amnezia.vpn.shadowsocks.core.Core @@ -7,7 +7,7 @@ import org.qtproject.qt.android.bindings.QtActivity import org.qtproject.qt.android.bindings.QtApplication import android.app.Application -class AmneziaApp: org.qtproject.qt.android.bindings.QtApplication() { +class AmneziaApplication: org.qtproject.qt.android.bindings.QtApplication() { override fun onCreate() { super.onCreate() diff --git a/client/android/src/org/amnezia/vpn/VPNService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt similarity index 99% rename from client/android/src/org/amnezia/vpn/VPNService.kt rename to client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 7f70643cc..8fe824d48 100644 --- a/client/android/src/org/amnezia/vpn/VPNService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -46,11 +46,11 @@ import java.lang.Exception import android.net.VpnService as BaseVpnService -class VPNService : BaseVpnService()/* , LocalDnsService.Interface */ { +class AmneziaVpnService : BaseVpnService()/* , LocalDnsService.Interface */ { // override val data = BaseService.Data(this) - /* override */ val tag: String get() = "VPNService" + /* override */ val tag: String get() = "AmneziaVpnService" // override fun createNotification(profileName: String): ServiceNotification = // ServiceNotification(this, profileName, "service-vpn") @@ -119,7 +119,7 @@ class VPNService : BaseVpnService()/* , LocalDnsService.Interface */ { @JvmStatic fun startService(c: Context) { c.applicationContext.startService( - Intent(c.applicationContext, VPNService::class.java).apply { + Intent(c.applicationContext, AmneziaVpnService::class.java).apply { putExtra("startOnly", true) }) } diff --git a/client/android/src/org/amnezia/vpn/qt/CameraActivity.kt b/client/android/src/org/amnezia/vpn/CameraActivity.kt similarity index 99% rename from client/android/src/org/amnezia/vpn/qt/CameraActivity.kt rename to client/android/src/org/amnezia/vpn/CameraActivity.kt index 8733efa5f..3eaec6b48 100644 --- a/client/android/src/org/amnezia/vpn/qt/CameraActivity.kt +++ b/client/android/src/org/amnezia/vpn/CameraActivity.kt @@ -1,4 +1,4 @@ -package org.amnezia.vpn.qt +package org.amnezia.vpn import android.Manifest import android.annotation.SuppressLint diff --git a/client/android/src/org/amnezia/vpn/qt/ImportConfigActivity.kt b/client/android/src/org/amnezia/vpn/ImportConfigActivity.kt similarity index 95% rename from client/android/src/org/amnezia/vpn/qt/ImportConfigActivity.kt rename to client/android/src/org/amnezia/vpn/ImportConfigActivity.kt index de175a980..bba744d66 100644 --- a/client/android/src/org/amnezia/vpn/qt/ImportConfigActivity.kt +++ b/client/android/src/org/amnezia/vpn/ImportConfigActivity.kt @@ -1,4 +1,4 @@ -package org.amnezia.vpn.qt +package org.amnezia.vpn import android.Manifest import android.app.Activity @@ -14,10 +14,7 @@ import androidx.core.content.ContextCompat import java.io.* -import org.amnezia.vpn.R - - -const val INTENT_ACTION_IMPORT_CONFIG = "org.amnezia.vpn.qt.IMPORT_CONFIG" +const val INTENT_ACTION_IMPORT_CONFIG = "org.amnezia.vpn.IMPORT_CONFIG" class ImportConfigActivity : Activity() { @@ -40,7 +37,7 @@ class ImportConfigActivity : Activity() { return } - val activityIntent = Intent(applicationContext, VPNActivity::class.java) + val activityIntent = Intent(applicationContext, AmneziaActivity::class.java) activityIntent.action = INTENT_ACTION_IMPORT_CONFIG activityIntent.addCategory("android.intent.category.DEFAULT") activityIntent.putExtra("CONFIG", config) diff --git a/client/android/src/org/amnezia/vpn/NetworkState.kt b/client/android/src/org/amnezia/vpn/NetworkState.kt index ac38084fc..2ea573186 100644 --- a/client/android/src/org/amnezia/vpn/NetworkState.kt +++ b/client/android/src/org/amnezia/vpn/NetworkState.kt @@ -47,9 +47,8 @@ import java.io.FileDescriptor import java.io.IOException import java.lang.Exception - -class NetworkState(var service: VPNService) { - private var mService: VPNService = service +class NetworkState(var service: AmneziaVpnService) { + private var mService: AmneziaVpnService = service var mCurrentContext: Context = service private val tag = "NetworkState" private var active = false diff --git a/client/android/src/org/amnezia/vpn/NotificationUtil.kt b/client/android/src/org/amnezia/vpn/NotificationUtil.kt index 6b36c6402..541e27cd6 100644 --- a/client/android/src/org/amnezia/vpn/NotificationUtil.kt +++ b/client/android/src/org/amnezia/vpn/NotificationUtil.kt @@ -72,7 +72,7 @@ object NotificationUtil { * Creates a new Notification using the current set of Strings * Shows the notification in the given {context} */ - fun show(service: VPNService) { + fun show(service: AmneziaVpnService) { sNotificationBuilder = NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID) sCurrentContext = service val notificationManager: NotificationManager = @@ -96,7 +96,7 @@ object NotificationUtil { val header = "" + prefs.getString("fallbackNotificationHeader", "Amnezia VPN") // Create the Intent that Should be Fired if the User Clicks the notification - val mainActivityName = "org.amnezia.vpn.qt.VPNActivity" + val mainActivityName = "org.amnezia.vpn.AmneziaActivity" val activity = Class.forName(mainActivityName) val intent = Intent(service, activity) val pendingIntent = PendingIntent.getActivity(service, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index ad38c5216..68395af8a 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -32,10 +32,10 @@ import net.openvpn.ovpn3.ClientAPI_TransportStats import java.lang.StringBuilder -class OpenVPNThreadv3(var service: VPNService): ClientAPI_OpenVPNClient(), Runnable { +class OpenVPNThreadv3(var service: AmneziaVpnService): ClientAPI_OpenVPNClient(), Runnable { private val tag = "OpenVPNThreadv3" private var mAlreadyInitialised = false - private var mService: VPNService = service + private var mService: AmneziaVpnService = service private var bytesInIndex = -1 private var bytesOutIndex = -1 diff --git a/client/android/src/org/amnezia/vpn/qt/PackageManagerHelper.java b/client/android/src/org/amnezia/vpn/PackageManagerHelper.java similarity index 99% rename from client/android/src/org/amnezia/vpn/qt/PackageManagerHelper.java rename to client/android/src/org/amnezia/vpn/PackageManagerHelper.java index 41c4cbf4a..55bfbf932 100644 --- a/client/android/src/org/amnezia/vpn/qt/PackageManagerHelper.java +++ b/client/android/src/org/amnezia/vpn/PackageManagerHelper.java @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.amnezia.vpn.qt; +package org.amnezia.vpn; import android.Manifest; import android.content.Context; diff --git a/client/android/src/org/amnezia/vpn/qt/VPNClientBinder.kt b/client/android/src/org/amnezia/vpn/VPNClientBinder.kt similarity index 76% rename from client/android/src/org/amnezia/vpn/qt/VPNClientBinder.kt rename to client/android/src/org/amnezia/vpn/VPNClientBinder.kt index 6a8fa086d..41a0000cf 100644 --- a/client/android/src/org/amnezia/vpn/qt/VPNClientBinder.kt +++ b/client/android/src/org/amnezia/vpn/VPNClientBinder.kt @@ -2,11 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.amnezia.vpn.qt +package org.amnezia.vpn import android.os.Binder import android.os.Parcel -import android.util.Log const val permissionRequired = 6 @@ -14,13 +13,13 @@ class VPNClientBinder() : Binder() { override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean { if (code == permissionRequired) { - VPNActivity.getInstance().onPermissionRequest(code, data) + AmneziaActivity.getInstance().onPermissionRequest(code, data) return true } val buffer = data.createByteArray() val stringData = buffer?.let { String(it) } - VPNActivity.getInstance().onServiceMessage(code, stringData) + AmneziaActivity.getInstance().onServiceMessage(code, stringData) return true } diff --git a/client/android/src/org/amnezia/vpn/qt/VPNPermissionHelper.kt b/client/android/src/org/amnezia/vpn/VPNPermissionHelper.kt similarity index 98% rename from client/android/src/org/amnezia/vpn/qt/VPNPermissionHelper.kt rename to client/android/src/org/amnezia/vpn/VPNPermissionHelper.kt index 46d1b80b1..92897f7ba 100644 --- a/client/android/src/org/amnezia/vpn/qt/VPNPermissionHelper.kt +++ b/client/android/src/org/amnezia/vpn/VPNPermissionHelper.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.amnezia.vpn.qt +package org.amnezia.vpn import android.content.Context import android.content.Intent diff --git a/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt b/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt index 391c774ee..56777daf1 100644 --- a/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt +++ b/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt @@ -11,7 +11,7 @@ import com.wireguard.config.* import org.json.JSONObject import java.lang.Exception -class VPNServiceBinder(service: VPNService) : Binder() { +class VPNServiceBinder(service: AmneziaVpnService) : Binder() { private val mService = service private val tag = "VPNServiceBinder" diff --git a/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt b/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt new file mode 100644 index 000000000..964242508 --- /dev/null +++ b/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt @@ -0,0 +1,4 @@ +package org.amnezia.vpn.qt + +object QtAndroidController { +} \ No newline at end of file diff --git a/client/platforms/android/android_controller.cpp b/client/platforms/android/android_controller.cpp index a56edcbfc..17264d122 100644 --- a/client/platforms/android/android_controller.cpp +++ b/client/platforms/android/android_controller.cpp @@ -21,7 +21,7 @@ namespace { AndroidController *s_instance = nullptr; - constexpr auto PERMISSIONHELPER_CLASS = "org/amnezia/vpn/qt/VPNPermissionHelper"; + constexpr auto PERMISSIONHELPER_CLASS = "org/amnezia/vpn/VPNPermissionHelper"; } // namespace AndroidController::AndroidController() : QObject() diff --git a/client/platforms/android/androidvpnactivity.cpp b/client/platforms/android/androidvpnactivity.cpp index e81e694b3..94d7eddb0 100644 --- a/client/platforms/android/androidvpnactivity.cpp +++ b/client/platforms/android/androidvpnactivity.cpp @@ -15,7 +15,7 @@ namespace { AndroidVPNActivity *s_instance = nullptr; - constexpr auto CLASSNAME = "org.amnezia.vpn.qt.VPNActivity"; + constexpr auto CLASSNAME = "org.amnezia.vpn.AmneziaActivity"; } AndroidVPNActivity::AndroidVPNActivity() diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index 8ae032a90..e128d1cf2 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -50,7 +50,7 @@ namespace #endif #ifdef Q_OS_ANDROID - constexpr auto AndroidCameraActivity = "org.amnezia.vpn.qt.CameraActivity"; + constexpr auto AndroidCameraActivity = "org.amnezia.vpn.CameraActivity"; #endif } // namespace From b90fad6664877445f5006ab007728f46c2546a12 Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 17 Nov 2023 15:10:11 +0300 Subject: [PATCH 046/144] Android activity and AndroidController class refactoring --- client/amnezia_application.cpp | 4 +- .../src/org/amnezia/vpn/AmneziaActivity.kt | 317 +++------------ .../src/org/amnezia/vpn/VPNClientBinder.kt | 26 -- .../org/amnezia/vpn/qt/QtAndroidController.kt | 14 + client/cmake/android.cmake | 2 - .../platforms/android/android_controller.cpp | 384 +++++++----------- client/platforms/android/android_controller.h | 75 ++-- .../platforms/android/androidvpnactivity.cpp | 162 -------- client/platforms/android/androidvpnactivity.h | 104 ----- client/protocols/android_vpnprotocol.cpp | 21 +- client/protocols/android_vpnprotocol.h | 15 +- client/ui/controllers/systemController.cpp | 2 +- client/vpnconnection.cpp | 2 +- 13 files changed, 266 insertions(+), 862 deletions(-) delete mode 100644 client/android/src/org/amnezia/vpn/VPNClientBinder.kt delete mode 100644 client/platforms/android/androidvpnactivity.cpp delete mode 100644 client/platforms/android/androidvpnactivity.h diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index e3adf67a8..5af762d7c 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -91,8 +91,8 @@ void AmneziaApplication::init() initControllers(); #ifdef Q_OS_ANDROID - connect(AndroidController::instance(), &AndroidController::initialized, this, - [this](bool status, bool connected, const QDateTime &connectionDate) { + connect(AndroidController::instance(), &AndroidController::serviceIsAlive, this, + [this](bool connected) { if (connected) { m_connectionController->onConnectionStateChanged(Vpn::ConnectionState::Connected); if (m_vpnConnection) diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index 80eb2b6c7..c65f4bee4 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -1,301 +1,102 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - package org.amnezia.vpn -import android.Manifest -import android.content.ComponentName -import android.content.ContentResolver -import android.content.Context import android.content.Intent -import android.content.ServiceConnection -import android.content.pm.PackageManager import android.net.Uri -import android.os.* -import android.provider.MediaStore -import android.util.Log -import android.view.KeyEvent -import android.widget.Toast -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat -import org.amnezia.vpn.VPNServiceBinder -import org.amnezia.vpn.IMPORT_COMMAND_CODE -import org.amnezia.vpn.IMPORT_ACTION_CODE -import org.amnezia.vpn.IMPORT_CONFIG_KEY +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.io.IOException import org.qtproject.qt.android.bindings.QtActivity -import java.io.* - -class AmneziaActivity : org.qtproject.qt.android.bindings.QtActivity() { - private var configString: String? = null - private var vpnServiceBinder: IBinder? = null - private var isBound = false - set(value) { - field = value +private const val TAG = "AmneziaActivity" - if (value && configString != null) { - sendImportConfigCommand() - } - } +private const val CAMERA_ACTION_CODE = 101 +private const val CREATE_FILE_ACTION_CODE = 102 - private val TAG = "AmneziaActivity" - - private val CAMERA_ACTION_CODE = 101 - private val CREATE_FILE_ACTION_CODE = 102 +class AmneziaActivity : QtActivity() { private var tmpFileContentToSave: String = "" - private val delayedCommands: ArrayList> = ArrayList() - - companion object { - private lateinit var instance: AmneziaActivity - - @JvmStatic fun getInstance(): AmneziaActivity { - return instance - } - - @JvmStatic fun connectService() { - getInstance().initServiceConnection() - } - - @JvmStatic fun startQrCodeReader() { - getInstance().startQrCodeActivity() - } - - @JvmStatic fun sendToService(actionCode: Int, body: String) { - getInstance().dispatchParcel(actionCode, body) - } - - @JvmStatic fun saveFileAs(fileContent: String, suggestedName: String) { - getInstance().saveFile(fileContent, suggestedName) - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - instance = this - - val newIntent = intent - val newIntentAction: String? = newIntent.action - - if (newIntent != null && newIntentAction != null && newIntentAction == "org.amnezia.vpn.IMPORT_CONFIG") { - configString = newIntent.getStringExtra("CONFIG") - } - } - private fun startQrCodeActivity() { val intent = Intent(this, CameraActivity::class.java) startActivityForResult(intent, CAMERA_ACTION_CODE) } - private fun saveFile(fileContent: String, suggestedName: String) { - tmpFileContentToSave = fileContent - - val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "text/*" - putExtra(Intent.EXTRA_TITLE, suggestedName) - } - - startActivityForResult(intent, CREATE_FILE_ACTION_CODE) - } - - external fun handleBackButton(): Boolean - - external fun onServiceMessage(actionCode: Int, body: String?) - external fun qtOnServiceConnected() - external fun qtOnServiceDisconnected() - external fun onActivityMessage(actionCode: Int, body: String?) - - private fun dispatchParcel(actionCode: Int, body: String) { - if (!isBound) { - Log.d(TAG, "dispatchParcel: not bound") - delayedCommands.add(Pair(actionCode, body)) - return - } - - if (delayedCommands.size > 0) { - for (command in delayedCommands) { - processCommand(command.first, command.second) + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (requestCode == CREATE_FILE_ACTION_CODE && resultCode == RESULT_OK) { + data?.data?.also { uri -> + alterDocument(uri) } - - delayedCommands.clear() } - - processCommand(actionCode, body) + super.onActivityResult(requestCode, resultCode, data) } - private fun processCommand(actionCode: Int, body: String) { - val out: Parcel = Parcel.obtain() - out.writeByteArray(body.toByteArray()) - + private fun alterDocument(uri: Uri) { try { - vpnServiceBinder?.transact(actionCode, out, Parcel.obtain(), 0) - } catch (e: DeadObjectException) { - isBound = false - vpnServiceBinder = null - qtOnServiceDisconnected() - } catch (e: RemoteException) { + applicationContext.contentResolver.openFileDescriptor(uri, "w")?.use { fd -> + FileOutputStream(fd.fileDescriptor).use { fos -> + fos.write(tmpFileContentToSave.toByteArray()) + } + } + } catch (e: FileNotFoundException) { + e.printStackTrace() + } catch (e: IOException) { e.printStackTrace() } - } - - override fun onNewIntent(newIntent: Intent) { - super.onNewIntent(intent) - - setIntent(newIntent) - val newIntentAction = newIntent.action - - if (newIntent != null && newIntentAction != null && newIntentAction == INTENT_ACTION_IMPORT_CONFIG) { - configString = newIntent.getStringExtra("CONFIG") - } + tmpFileContentToSave = "" } - override fun onResume() { - super.onResume() - - if (configString != null && isBound) { - sendImportConfigCommand() - } + /** + * Methods called by Qt + */ + @Suppress("unused") + fun qtAndroidControllerInitialized() { + Log.v(TAG, "Qt Android controller initialized") + Log.w(TAG, "Not yet implemented") } - private fun sendImportConfigCommand() { - if (configString != null) { - val msg: Parcel = Parcel.obtain() - msg.writeString(configString!!) - - try { - vpnServiceBinder?.transact(ACTION_IMPORT_CONFIG, msg, Parcel.obtain(), 0) - } catch (e: RemoteException) { - e.printStackTrace() - } - - configString = null - } + @Suppress("unused") + fun start(vpnConfig: String) { + Log.v(TAG, "Start VPN") + Log.w(TAG, "Not yet implemented") } - private fun createConnection() = object : ServiceConnection { - override fun onServiceConnected(className: ComponentName, binder: IBinder) { - vpnServiceBinder = binder - - // This is called when the connection with the service has been - // established, giving us the object we can use to - // interact with the service. We are communicating with the - // service using a Messenger, so here we get a client-side - // representation of that from the raw IBinder object. - if (registerBinder()){ - qtOnServiceConnected(); - } else { - qtOnServiceDisconnected(); - return - } - - isBound = true - } - - override fun onServiceDisconnected(className: ComponentName) { - vpnServiceBinder = null - isBound = false - qtOnServiceDisconnected(); - } + @Suppress("unused") + fun stop() { + Log.v(TAG, "Stop VPN") + Log.w(TAG, "Not yet implemented") } - private var connection: ServiceConnection = createConnection() + @Suppress("unused") + fun saveFile(fileName: String, data: String) { + Log.v(TAG, "Save file $fileName") + // todo: refactor + tmpFileContentToSave = data - private fun registerBinder(): Boolean { - val binder = VPNClientBinder() - val out: Parcel = Parcel.obtain() - out.writeStrongBinder(binder) - - try { - // Register our IBinder Listener - vpnServiceBinder?.transact(ACTION_REGISTER_LISTENER, out, Parcel.obtain(), 0) - return true - } catch (e: DeadObjectException) { - isBound = false - vpnServiceBinder = null - } catch (e: RemoteException) { - e.printStackTrace() - } - return false - } - - private fun initServiceConnection() { - // We already have a connection to the service, - // just need to re-register the binder - if (isBound && vpnServiceBinder!!.isBinderAlive() && registerBinder()) { - qtOnServiceConnected() - return + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "text/*" + putExtra(Intent.EXTRA_TITLE, fileName) } - bindService(Intent(this, AmneziaVpnService::class.java), connection, Context.BIND_AUTO_CREATE) + startActivityForResult(intent, CREATE_FILE_ACTION_CODE) } - // TODO: Move all ipc codes into a shared lib. - // this is getting out of hand. - private val PERMISSION_TRANSACTION = 1337 - private val ACTION_REGISTER_LISTENER = 3 - private val ACTION_RESUME_ACTIVATE = 7 - private val ACTION_IMPORT_CONFIG = 11 - private val EVENT_PERMISSION_REQUIRED = 6 - private val EVENT_DISCONNECTED = 2 - - private val UI_EVENT_QR_CODE_RECEIVED = 0 - - fun onPermissionRequest(code: Int, data: Parcel?) { - if (code != EVENT_PERMISSION_REQUIRED) { - return - } - - val x = Intent() - x.readFromParcel(data) - - startActivityForResult(x, PERMISSION_TRANSACTION) + @Suppress("unused") + fun setNotificationText(title: String, message: String, timerSec: Int) { + Log.v(TAG, "Set notification text") + Log.w(TAG, "Not yet implemented") } - override protected fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (requestCode == PERMISSION_TRANSACTION) { - // THATS US! - if (resultCode == RESULT_OK) { - // Prompt accepted, tell service to retry. - dispatchParcel(ACTION_RESUME_ACTIVATE, "") - } else { - // Tell the Client we've disconnected - onServiceMessage(EVENT_DISCONNECTED, "") - } - return - } - - super.onActivityResult(requestCode, resultCode, data) - - if (requestCode == CAMERA_ACTION_CODE && resultCode == RESULT_OK) { - val extra = data?.getStringExtra("result") ?: "" - onActivityMessage(UI_EVENT_QR_CODE_RECEIVED, extra) - } - - if (requestCode == CREATE_FILE_ACTION_CODE && resultCode == RESULT_OK) { - data?.data?.also { uri -> - alterDocument(uri) - } - } + @Suppress("unused") + fun cleanupLogs() { + Log.v(TAG, "Cleanup logs") + Log.w(TAG, "Not yet implemented") } - private fun alterDocument(uri: Uri) { - try { - applicationContext.contentResolver.openFileDescriptor(uri, "w")?.use { fd -> - FileOutputStream(fd.fileDescriptor).use { fos -> - fos.write(tmpFileContentToSave.toByteArray()) - } - } - } catch (e: FileNotFoundException) { - e.printStackTrace() - } catch (e: IOException) { - e.printStackTrace() - } - - tmpFileContentToSave = "" + @Suppress("unused") + fun startQrCodeReader() { + Log.v(TAG, "Start camera") + startQrCodeActivity() } } diff --git a/client/android/src/org/amnezia/vpn/VPNClientBinder.kt b/client/android/src/org/amnezia/vpn/VPNClientBinder.kt deleted file mode 100644 index 41a0000cf..000000000 --- a/client/android/src/org/amnezia/vpn/VPNClientBinder.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.amnezia.vpn - -import android.os.Binder -import android.os.Parcel - -const val permissionRequired = 6 - -class VPNClientBinder() : Binder() { - - override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean { - if (code == permissionRequired) { - AmneziaActivity.getInstance().onPermissionRequest(code, data) - return true - } - - val buffer = data.createByteArray() - val stringData = buffer?.let { String(it) } - AmneziaActivity.getInstance().onServiceMessage(code, stringData) - - return true - } -} diff --git a/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt b/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt index 964242508..ce509281c 100644 --- a/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt +++ b/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt @@ -1,4 +1,18 @@ package org.amnezia.vpn.qt +/** + * JNI functions of the AndroidController class from android_controller.cpp, + * called by events in the Android part of the client + */ object QtAndroidController { + external fun onStatus(isVpnConnected: Boolean) + external fun onServiceDisconnected() + external fun onServiceError() + + external fun onVpnPermissionRejected() + external fun onVpnConnected() + external fun onVpnDisconnected() + external fun onStatisticsUpdate(rxBytes: Long, txBytes: Long) + + external fun onConfigImported() } \ No newline at end of file diff --git a/client/cmake/android.cmake b/client/cmake/android.cmake index 66ff1e15a..2d08b4b6d 100644 --- a/client/cmake/android.cmake +++ b/client/cmake/android.cmake @@ -28,7 +28,6 @@ set(HEADERS ${HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/android_controller.h ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/android_notificationhandler.h ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/androidutils.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/androidvpnactivity.h ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/authResultReceiver.h ${CMAKE_CURRENT_SOURCE_DIR}/protocols/android_vpnprotocol.h ) @@ -37,7 +36,6 @@ set(SOURCES ${SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/android_controller.cpp ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/android_notificationhandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/androidutils.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/androidvpnactivity.cpp ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/authResultReceiver.cpp ${CMAKE_CURRENT_SOURCE_DIR}/protocols/android_vpnprotocol.cpp ) diff --git a/client/platforms/android/android_controller.cpp b/client/platforms/android/android_controller.cpp index 17264d122..5bf0be581 100644 --- a/client/platforms/android/android_controller.cpp +++ b/client/platforms/android/android_controller.cpp @@ -1,154 +1,82 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include -#include -#include +#include +#include #include -#include -#include -#include -#include #include "android_controller.h" -#include "private/qandroidextras_p.h" - -#include "androidutils.h" -#include "androidvpnactivity.h" namespace { AndroidController *s_instance = nullptr; - constexpr auto PERMISSIONHELPER_CLASS = "org/amnezia/vpn/VPNPermissionHelper"; + constexpr auto QT_ANDROID_CONTROLLER_CLASS = "org/amnezia/vpn/qt/QtAndroidController"; } // namespace AndroidController::AndroidController() : QObject() { - connect(this, &AndroidController::scheduleStatusCheckSignal, this, &AndroidController::scheduleStatusCheckSlot); - - s_instance = this; - - auto activity = AndroidVPNActivity::instance(); - - connect( - activity, &AndroidVPNActivity::serviceConnected, this, - []() { - qDebug() << "Transact: service connected"; - AndroidVPNActivity::sendToService(ServiceAction::ACTION_REQUEST_STATISTIC, ""); - }, - Qt::QueuedConnection); - - connect( - activity, &AndroidVPNActivity::eventInitialized, this, - [this](const QString &parcelBody) { - // We might get multiple Init events as widgets, or fragments - // might query this. - if (m_init) { - return; + connect(this, &AndroidController::status, this, + [this](bool isVpnConnected) { + qDebug() << "Android event: status; connected:" << isVpnConnected; + if (isWaitingInitStatus) { + qDebug() << "Android VPN service is alive, initialization by service status"; + isWaitingInitStatus = false; + emit serviceIsAlive(isVpnConnected); } - - qDebug() << "Transact: init"; - - m_init = true; - - auto doc = QJsonDocument::fromJson(parcelBody.toUtf8()); - qlonglong time = doc.object()["time"].toVariant().toLongLong(); - - isConnected = doc.object()["connected"].toBool(); - - if (isConnected) { - emit scheduleStatusCheckSignal(); - } - - emit initialized(true, isConnected, time > 0 ? QDateTime::fromMSecsSinceEpoch(time) : QDateTime()); - - setFallbackConnectedNotification(); }, Qt::QueuedConnection); connect( - activity, &AndroidVPNActivity::eventConnected, this, - [this](const QString &parcelBody) { - Q_UNUSED(parcelBody); - qDebug() << "Transact: connected"; - - if (!isConnected) { - emit scheduleStatusCheckSignal(); - } - - isConnected = true; - - emit connectionStateChanged(Vpn::ConnectionState::Connected); - }, - Qt::QueuedConnection); + this, &AndroidController::serviceDisconnected, this, + [this]() { + qDebug() << "Android event: service disconnected"; + emit connectionStateChanged(Vpn::ConnectionState::Unknown); + }, + Qt::QueuedConnection); connect( - activity, &AndroidVPNActivity::eventDisconnected, this, - [this]() { - qDebug() << "Transact: disconnected"; - - isConnected = false; - - emit connectionStateChanged(Vpn::ConnectionState::Disconnected); - }, - Qt::QueuedConnection); + this, &AndroidController::serviceError, this, + [this]() { + qDebug() << "Android event: service error"; + // todo: add error message + emit connectionStateChanged(Vpn::ConnectionState::Error); + }, + Qt::QueuedConnection); connect( - activity, &AndroidVPNActivity::eventStatisticUpdate, this, - [this](const QString &parcelBody) { - auto doc = QJsonDocument::fromJson(parcelBody.toUtf8()); - - QString rx = doc.object()["rx_bytes"].toString(); - QString tx = doc.object()["tx_bytes"].toString(); - QString endpoint = doc.object()["endpoint"].toString(); - QString deviceIPv4 = doc.object()["deviceIpv4"].toString(); - - emit statusUpdated(rx, tx, endpoint, deviceIPv4); - }, - Qt::QueuedConnection); + this, &AndroidController::vpnPermissionRejected, this, + [this]() { + qWarning() << "Android event: VPN permission rejected"; + emit connectionStateChanged(Vpn::ConnectionState::Disconnected); + }, + Qt::QueuedConnection); connect( - activity, &AndroidVPNActivity::eventBackendLogs, this, - [this](const QString &parcelBody) { - qDebug() << "Transact: backend logs"; - - QString buffer = parcelBody.toUtf8(); - if (m_logCallback) { - m_logCallback(buffer); - } - }, - Qt::QueuedConnection); + this, &AndroidController::vpnConnected, this, + [this]() { + qDebug() << "Android event: VPN connected"; + emit connectionStateChanged(Vpn::ConnectionState::Connected); + }, + Qt::QueuedConnection); connect( - activity, &AndroidVPNActivity::eventActivationError, this, - [this](const QString &parcelBody) { - Q_UNUSED(parcelBody) - qDebug() << "Transact: error"; - emit connectionStateChanged(Vpn::ConnectionState::Error); - }, - Qt::QueuedConnection); + this, &AndroidController::vpnDisconnected, this, + [this]() { + qDebug() << "Android event: VPN disconnected"; + emit connectionStateChanged(Vpn::ConnectionState::Disconnected); + }, + Qt::QueuedConnection); connect( - activity, &AndroidVPNActivity::eventConfigImport, this, - [this](const QString &parcelBody) { - qDebug() << "Transact: config import"; - auto doc = QJsonDocument::fromJson(parcelBody.toUtf8()); - - QString buffer = doc.object()["config"].toString(); - qDebug() << "Transact: config string" << buffer; - importConfigFromOutside(buffer); - }, - Qt::QueuedConnection); + this, &AndroidController::configImported, this, + []() { + // todo: not yet implemented + qDebug() << "Transact: config import"; + /*auto doc = QJsonDocument::fromJson(parcelBody.toUtf8()); - connect( - activity, &AndroidVPNActivity::serviceDisconnected, this, - [this]() { - qDebug() << "Transact: service disconnected"; - m_serviceConnected = false; - }, - Qt::QueuedConnection); + QString buffer = doc.object()["config"].toString(); + qDebug() << "Transact: config string" << buffer; + importConfigFromOutside(buffer);*/ + }, + Qt::QueuedConnection); } AndroidController *AndroidController::instance() @@ -162,166 +90,160 @@ AndroidController *AndroidController::instance() bool AndroidController::initialize() { - qDebug() << "Initializing"; - - // Hook in the native implementation for startActivityForResult into the JNI - JNINativeMethod methods[] { { "startActivityForResult", "(Landroid/content/Intent;)V", - reinterpret_cast(startActivityForResult) } }; - QJniObject javaClass(PERMISSIONHELPER_CLASS); - QJniEnvironment env; - jclass objectClass = env->GetObjectClass(javaClass.object()); - env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0])); - env->DeleteLocalRef(objectClass); + qDebug() << "Initialize AndroidController"; - AndroidVPNActivity::connectService(); + const JNINativeMethod methods[] = { + {"onStatus", "(Z)V", reinterpret_cast(onStatus)}, + {"onServiceDisconnected", "()V", reinterpret_cast(onServiceDisconnected)}, + {"onServiceError", "()V", reinterpret_cast(onServiceError)}, + {"onVpnPermissionRejected", "()V", reinterpret_cast(onVpnPermissionRejected)}, + {"onVpnConnected", "()V", reinterpret_cast(onVpnConnected)}, + {"onVpnDisconnected", "()V", reinterpret_cast(onVpnDisconnected)}, + {"onStatisticsUpdate", "(JJ)V", reinterpret_cast(onStatisticsUpdate)}, + {"onConfigImported", "()V", reinterpret_cast(onConfigImported)}, + }; + QJniEnvironment env; + bool registered = env.registerNativeMethods(QT_ANDROID_CONTROLLER_CLASS, methods, + sizeof(methods) / sizeof(JNINativeMethod)); + if (!registered) { + qCritical() << "Failed native method registration"; + return false; + } + qtAndroidControllerInitialized(); return true; } -ErrorCode AndroidController::start() +// static +template +auto AndroidController::callActivityMethod(const char *methodName, const char *signature, + const std::function &defValue, Args &&...args) { - qDebug() << "Prompting for VPN permission"; - QJniObject activity = AndroidUtils::getActivity(); - auto appContext = activity.callObjectMethod("getApplicationContext", "()Landroid/content/Context;"); - QJniObject::callStaticMethod(PERMISSIONHELPER_CLASS, "startService", "(Landroid/content/Context;)V", - appContext.object()); + qDebug() << "Call activity method:" << methodName; + QJniObject activity = QNativeInterface::QAndroidApplication::context(); + if (activity.isValid()) { + return activity.callMethod(methodName, signature, std::forward(args)...); + } else { + qCritical() << "Activity is not valid"; + return defValue(); + } +} - QJsonDocument doc(m_vpnConfig); - AndroidVPNActivity::sendToService(ServiceAction::ACTION_ACTIVATE, doc.toJson()); +// static +template +void AndroidController::callActivityMethod(const char *methodName, const char *signature, Args &&...args) +{ + callActivityMethod(methodName, signature, [] {}, std::forward(args)...); +} + +ErrorCode AndroidController::start(const QJsonObject &vpnConfig) +{ + isWaitingInitStatus = false; + auto config = QJsonDocument(vpnConfig).toJson(); + callActivityMethod("start", "(Ljava/lang/String;)V", + QJniObject::fromString(config).object()); return NoError; } void AndroidController::stop() { - qDebug() << "AndroidController::stop"; - - AndroidVPNActivity::sendToService(ServiceAction::ACTION_DEACTIVATE, QString()); + callActivityMethod("stop", "()V"); } -// Activates the tunnel that is currently set -// in the VPN Service -void AndroidController::resumeStart() +void AndroidController::saveFile(const QString &fileName, const QString &data) { - AndroidVPNActivity::sendToService(ServiceAction::ACTION_RESUME_ACTIVATE, QString()); + callActivityMethod("saveFile", "(Ljava/lang/String;Ljava/lang/String;)V", + QJniObject::fromString(fileName).object(), + QJniObject::fromString(data).object()); } -/* - * Sets the current notification text that is shown - */ void AndroidController::setNotificationText(const QString &title, const QString &message, int timerSec) { - QJsonObject args; - args["title"] = title; - args["message"] = message; - args["sec"] = timerSec; - QJsonDocument doc(args); - - AndroidVPNActivity::sendToService(ServiceAction::ACTION_SET_NOTIFICATION_TEXT, doc.toJson()); + callActivityMethod("setNotificationText", "(Ljava/lang/String;Ljava/lang/String;I)V", + QJniObject::fromString(title).object(), + QJniObject::fromString(message).object(), + (jint) timerSec); } -void AndroidController::shareConfig(const QString &configContent, const QString &suggestedName) +void AndroidController::startQrReaderActivity() { - AndroidVPNActivity::saveFileAs(configContent, suggestedName); + callActivityMethod("startQrCodeReader", "()V"); } -/* - * Sets fallback Notification text that should be shown in case the VPN - * switches into the Connected state without the app open - * e.g via always-on vpn - */ -void AndroidController::setFallbackConnectedNotification() +void AndroidController::qtAndroidControllerInitialized() { - QJsonObject args; - args["title"] = tr("AmneziaVPN"); - //% "Ready for you to connect" - //: Refers to the app - which is currently running the background and waiting - args["message"] = tr("VPN Connected"); - QJsonDocument doc(args); - - AndroidVPNActivity::sendToService(ServiceAction::ACTION_SET_NOTIFICATION_FALLBACK, doc.toJson()); + callActivityMethod("qtAndroidControllerInitialized", "()V"); } -void AndroidController::checkStatus() +// JNI functions called by Android +// static +void AndroidController::onStatus(JNIEnv *env, jobject thiz, jboolean isVpnConnected) { - AndroidVPNActivity::sendToService(ServiceAction::ACTION_REQUEST_STATISTIC, QString()); + Q_UNUSED(env); + Q_UNUSED(thiz); + + emit AndroidController::instance()->status(isVpnConnected); } -void AndroidController::getBackendLogs(std::function &&a_callback) +// static +void AndroidController::onServiceDisconnected(JNIEnv *env, jobject thiz) { - qDebug() << "get logs"; - - m_logCallback = std::move(a_callback); + Q_UNUSED(env); + Q_UNUSED(thiz); - AndroidVPNActivity::sendToService(ServiceAction::ACTION_REQUEST_GET_LOG, QString()); + emit AndroidController::instance()->serviceDisconnected(); } -void AndroidController::cleanupBackendLogs() +// static +void AndroidController::onServiceError(JNIEnv *env, jobject thiz) { - qDebug() << "cleanup logs"; + Q_UNUSED(env); + Q_UNUSED(thiz); - AndroidVPNActivity::sendToService(ServiceAction::ACTION_REQUEST_CLEANUP_LOG, QString()); + emit AndroidController::instance()->serviceError(); } -const QJsonObject &AndroidController::vpnConfig() const +// static +void AndroidController::onVpnPermissionRejected(JNIEnv *env, jobject thiz) { - return m_vpnConfig; + Q_UNUSED(env); + Q_UNUSED(thiz); + + emit AndroidController::instance()->vpnPermissionRejected(); } -void AndroidController::setVpnConfig(const QJsonObject &newVpnConfig) +// static +void AndroidController::onVpnConnected(JNIEnv *env, jobject thiz) { - m_vpnConfig = newVpnConfig; + Q_UNUSED(env); + Q_UNUSED(thiz); + + emit AndroidController::instance()->vpnConnected(); } -void AndroidController::startQrReaderActivity() +// static +void AndroidController::onVpnDisconnected(JNIEnv *env, jobject thiz) { - AndroidVPNActivity::instance()->startQrCodeReader(); + Q_UNUSED(env); + Q_UNUSED(thiz); + + emit AndroidController::instance()->vpnDisconnected(); } -void AndroidController::scheduleStatusCheckSlot() +// static +void AndroidController::onStatisticsUpdate(JNIEnv *env, jobject thiz, jlong rxBytes, jlong txBytes) { - QTimer::singleShot(1000, [this]() { - if (isConnected) { - checkStatus(); - emit scheduleStatusCheckSignal(); - } - }); + Q_UNUSED(env); + Q_UNUSED(thiz); + + emit AndroidController::instance()->statisticsUpdated((quint64) rxBytes, (quint64) txBytes); } -const int ACTIVITY_RESULT_OK = 0xffffffff; -/** - * @brief Starts the Given intent in Context of the QTActivity - * @param env - * @param intent - */ -void AndroidController::startActivityForResult(JNIEnv *env, jobject, jobject intent) +void AndroidController::onConfigImported(JNIEnv *env, jobject thiz) { - qDebug() << "start vpnPermissionHelper"; Q_UNUSED(env); + Q_UNUSED(thiz); - QtAndroidPrivate::startActivity(intent, 1337, [](int receiverRequestCode, int resultCode, const QJniObject &data) { - // Currently this function just used in - // VPNService.kt::checkPermissions. So the result - // we're getting is if the User gave us the - // Vpn.bind permission. In case of NO we should - // abort. - Q_UNUSED(receiverRequestCode); - Q_UNUSED(data); - - AndroidController *controller = AndroidController::instance(); - if (!controller) { - return; - } - - if (resultCode == ACTIVITY_RESULT_OK) { - qDebug() << "VPN PROMPT RESULT - Accepted"; - controller->resumeStart(); - return; - } - // If the request got rejected abort the current - // connection. - qWarning() << "VPN PROMPT RESULT - Rejected"; - emit controller->connectionStateChanged(Vpn::ConnectionState::Disconnected); - }); - return; + emit AndroidController::instance()->configImported(); } diff --git a/client/platforms/android/android_controller.h b/client/platforms/android/android_controller.h index baa0bc80b..92d1916dd 100644 --- a/client/platforms/android/android_controller.h +++ b/client/platforms/android/android_controller.h @@ -1,11 +1,6 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - #ifndef ANDROID_CONTROLLER_H #define ANDROID_CONTROLLER_H -#include #include #include "protocols/vpnprotocol.h" @@ -20,57 +15,47 @@ class AndroidController : public QObject explicit AndroidController(); static AndroidController *instance(); - virtual ~AndroidController() override = default; - bool initialize(); - ErrorCode start(); + ErrorCode start(const QJsonObject &vpnConfig); void stop(); - void resumeStart(); - - void checkStatus(); void setNotificationText(const QString &title, const QString &message, int timerSec); - void shareConfig(const QString &data, const QString &suggestedName); - void setFallbackConnectedNotification(); - void getBackendLogs(std::function &&callback); - void cleanupBackendLogs(); - - const QJsonObject &vpnConfig() const; - void setVpnConfig(const QJsonObject &newVpnConfig); - + void saveFile(const QString& fileName, const QString &data); void startQrReaderActivity(); signals: void connectionStateChanged(Vpn::ConnectionState state); - - // This signal is emitted when the controller is initialized. Note that the - // VPN tunnel can be already active. In this case, "connected" should be set - // to true and the "connectionDate" should be set to the activation date if - // known. - // If "status" is set to false, the backend service is considered unavailable. - void initialized(bool status, bool connected, const QDateTime &connectionDate); - - void statusUpdated(QString totalRx, QString totalTx, QString endpoint, QString deviceIPv4); - void scheduleStatusCheckSignal(); - + void status(bool isVpnConnected); + void serviceDisconnected(); + void serviceError(); + void vpnPermissionRejected(); + void vpnConnected(); + void vpnDisconnected(); + void statisticsUpdated(quint64 rxBytes, quint64 txBytes); + void configImported(); void importConfigFromOutside(QString &data); - -protected slots: - void scheduleStatusCheckSlot(); + void serviceIsAlive(bool connected); private: - bool m_init = false; - - QJsonObject m_vpnConfig; - - bool m_serviceConnected = false; - std::function m_logCallback; - - static void startActivityForResult(JNIEnv *env, jobject /*thiz*/, jobject intent); - - bool isConnected = false; - - void scheduleStatusCheck(); + bool isWaitingInitStatus = true; + + void qtAndroidControllerInitialized(); + + // JNI functions called by Android + static void onStatus(JNIEnv *env, jobject thiz, jboolean isVpnConnected); + static void onServiceDisconnected(JNIEnv *env, jobject thiz); + static void onServiceError(JNIEnv *env, jobject thiz); + static void onVpnPermissionRejected(JNIEnv *env, jobject thiz); + static void onVpnConnected(JNIEnv *env, jobject thiz); + static void onVpnDisconnected(JNIEnv *env, jobject thiz); + static void onStatisticsUpdate(JNIEnv *env, jobject thiz, jlong rxBytes, jlong txBytes); + static void onConfigImported(JNIEnv *env, jobject thiz); + + template + static auto callActivityMethod(const char *methodName, const char *signature, + const std::function &defValue, Args &&...args); + template + static void callActivityMethod(const char *methodName, const char *signature, Args &&...args); }; #endif // ANDROID_CONTROLLER_H diff --git a/client/platforms/android/androidvpnactivity.cpp b/client/platforms/android/androidvpnactivity.cpp deleted file mode 100644 index 94d7eddb0..000000000 --- a/client/platforms/android/androidvpnactivity.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "androidvpnactivity.h" - -#include -#include -#include -#include - -#include "androidutils.h" -#include "jni.h" - -namespace -{ - AndroidVPNActivity *s_instance = nullptr; - constexpr auto CLASSNAME = "org.amnezia.vpn.AmneziaActivity"; -} - -AndroidVPNActivity::AndroidVPNActivity() -{ - AndroidUtils::runOnAndroidThreadAsync([]() { - JNINativeMethod methods[] { - { "handleBackButton", "()Z", reinterpret_cast(handleBackButton) }, - { "onServiceMessage", "(ILjava/lang/String;)V", reinterpret_cast(onServiceMessage) }, - { "qtOnServiceConnected", "()V", reinterpret_cast(onServiceConnected) }, - { "qtOnServiceDisconnected", "()V", reinterpret_cast(onServiceDisconnected) }, - { "onActivityMessage", "(ILjava/lang/String;)V", reinterpret_cast(onAndroidVpnActivityMessage) } - }; - - QJniObject javaClass(CLASSNAME); - QJniEnvironment env; - jclass objectClass = env->GetObjectClass(javaClass.object()); - env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0])); - env->DeleteLocalRef(objectClass); - }); -} - -void AndroidVPNActivity::maybeInit() -{ - if (s_instance == nullptr) { - s_instance = new AndroidVPNActivity(); - } -} - -// static -bool AndroidVPNActivity::handleBackButton(JNIEnv *env, jobject thiz) -{ - Q_UNUSED(env); - Q_UNUSED(thiz); -} - -void AndroidVPNActivity::connectService() -{ - QJniObject::callStaticMethod(CLASSNAME, "connectService", "()V"); -} - -void AndroidVPNActivity::startQrCodeReader() -{ - QJniObject::callStaticMethod(CLASSNAME, "startQrCodeReader", "()V"); -} - -void AndroidVPNActivity::saveFileAs(QString fileContent, QString suggestedFilename) -{ - QJniObject::callStaticMethod(CLASSNAME, "saveFileAs", "(Ljava/lang/String;Ljava/lang/String;)V", - QJniObject::fromString(fileContent).object(), - QJniObject::fromString(suggestedFilename).object()); -} - -// static -AndroidVPNActivity *AndroidVPNActivity::instance() -{ - if (s_instance == nullptr) { - AndroidVPNActivity::maybeInit(); - } - - return s_instance; -} - -// static -void AndroidVPNActivity::sendToService(ServiceAction type, const QString &data) -{ - int messageType = (int)type; - - QJniObject::callStaticMethod(CLASSNAME, "sendToService", "(ILjava/lang/String;)V", - static_cast(messageType), QJniObject::fromString(data).object()); -} - -// static -void AndroidVPNActivity::onServiceMessage(JNIEnv *env, jobject thiz, jint messageType, jstring body) -{ - Q_UNUSED(thiz); - const char *buffer = env->GetStringUTFChars(body, nullptr); - if (!buffer) { - return; - } - - QString parcelBody(buffer); - env->ReleaseStringUTFChars(body, buffer); - AndroidUtils::dispatchToMainThread([messageType, parcelBody] { - AndroidVPNActivity::instance()->handleServiceMessage(messageType, parcelBody); - }); -} - -void AndroidVPNActivity::handleServiceMessage(int code, const QString &data) -{ - auto mode = (ServiceEvents)code; - - switch (mode) { - case ServiceEvents::EVENT_INIT: emit eventInitialized(data); break; - case ServiceEvents::EVENT_CONNECTED: emit eventConnected(data); break; - case ServiceEvents::EVENT_DISCONNECTED: emit eventDisconnected(data); break; - case ServiceEvents::EVENT_STATISTIC_UPDATE: emit eventStatisticUpdate(data); break; - case ServiceEvents::EVENT_BACKEND_LOGS: emit eventBackendLogs(data); break; - case ServiceEvents::EVENT_ACTIVATION_ERROR: emit eventActivationError(data); break; - case ServiceEvents::EVENT_CONFIG_IMPORT: emit eventConfigImport(data); break; - default: Q_ASSERT(false); - } -} - -void AndroidVPNActivity::handleActivityMessage(int code, const QString &data) -{ - auto mode = (UIEvents)code; - - switch (mode) { - case UIEvents::QR_CODED_DECODED: emit eventQrCodeReceived(data); break; - default: Q_ASSERT(false); - } -} - -void AndroidVPNActivity::onServiceConnected(JNIEnv *env, jobject thiz) -{ - Q_UNUSED(env); - Q_UNUSED(thiz); - - emit AndroidVPNActivity::instance()->serviceConnected(); -} - -void AndroidVPNActivity::onServiceDisconnected(JNIEnv *env, jobject thiz) -{ - Q_UNUSED(env); - Q_UNUSED(thiz); - - emit AndroidVPNActivity::instance()->serviceDisconnected(); -} - -void AndroidVPNActivity::onAndroidVpnActivityMessage(JNIEnv *env, jobject thiz, jint messageType, jstring message) -{ - Q_UNUSED(thiz); - const char *buffer = env->GetStringUTFChars(message, nullptr); - if (!buffer) { - return; - } - - QString parcelBody(buffer); - env->ReleaseStringUTFChars(message, buffer); - - AndroidUtils::dispatchToMainThread([messageType, parcelBody] { - AndroidVPNActivity::instance()->handleActivityMessage(messageType, parcelBody); - }); -} diff --git a/client/platforms/android/androidvpnactivity.h b/client/platforms/android/androidvpnactivity.h deleted file mode 100644 index c485f4e56..000000000 --- a/client/platforms/android/androidvpnactivity.h +++ /dev/null @@ -1,104 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef ANDROIDVPNACTIVITY_H -#define ANDROIDVPNACTIVITY_H - -#include - -#include "jni.h" - -// Binder Codes for VPNServiceBinder -// See also - VPNServiceBinder.kt -// Actions that are Requestable -enum ServiceAction { - // Activate the vpn. Body requires a json wg-conf - ACTION_ACTIVATE = 1, - // Deactivate the vpn. Body is empty - ACTION_DEACTIVATE = 2, - // Register an IBinder to receive events body is an Ibinder - ACTION_REGISTERLISTENER = 3, - // Requests an EVENT_STATISTIC_UPDATE to be send - ACTION_REQUEST_STATISTIC = 4, - ACTION_REQUEST_GET_LOG = 5, - // Requests to clean up the internal log - ACTION_REQUEST_CLEANUP_LOG = 6, - // Retry activation using the last config - // Used when the activation is aborted for VPN-Permission prompt - ACTION_RESUME_ACTIVATE = 7, - // Sets the current notification text. - // Does nothing if there is no notification - ACTION_SET_NOTIFICATION_TEXT = 8, - // Sets the fallback text if the OS triggered the VPN-Service - // to show a notification - ACTION_SET_NOTIFICATION_FALLBACK = 9, - // Share used config - ACTION_SHARE_CONFIG = 10, -}; -typedef enum ServiceAction ServiceAction; - -// Event Types that will be Dispatched after registration -// Kotlin codes in the VPNServiceBinder.kt -enum ServiceEvents { - // The Service has Accepted our Binder - // Responds with the current status of the vpn. - EVENT_INIT = 0, - // WG-Go has enabled the adapter (empty response) - EVENT_CONNECTED = 1, - // WG-Go has disabled the adapter (empty response) - EVENT_DISCONNECTED = 2, - // Contains the Current transferred bytes to endpoint x. - EVENT_STATISTIC_UPDATE = 3, - EVENT_BACKEND_LOGS = 4, - // An Error happened during activation - // Contains the error message - EVENT_ACTIVATION_ERROR = 5, - EVENT_NEED_PERMISSION = 6, - // Import of existing config - EVENT_CONFIG_IMPORT = 7, -}; -typedef enum ServiceEvents ServiceEvents; - -enum UIEvents { - QR_CODED_DECODED = 0, -}; -typedef enum UIEvents UIEvents; - -class AndroidVPNActivity : public QObject -{ - Q_OBJECT - -public: - static void maybeInit(); - static AndroidVPNActivity* instance(); - static bool handleBackButton(JNIEnv* env, jobject thiz); - static void sendToService(ServiceAction type, const QString& data); - static void connectService(); - static void startQrCodeReader(); - static void saveFileAs(QString fileContent, QString suggestedFilename); - -signals: - void serviceConnected(); - void serviceDisconnected(); - void eventInitialized(const QString& data); - void eventConnected(const QString& data); - void eventDisconnected(const QString& data); - void eventStatisticUpdate(const QString& data); - void eventBackendLogs(const QString& data); - void eventActivationError(const QString& data); - void eventConfigImport(const QString& data); - void eventQrCodeReceived(const QString& data); - -private: - AndroidVPNActivity(); - - static void onServiceMessage(JNIEnv* env, jobject thiz, jint messageType, jstring body); - static void onServiceConnected(JNIEnv* env, jobject thiz); - static void onServiceDisconnected(JNIEnv* env, jobject thiz); - static void onAndroidVpnActivityMessage(JNIEnv* env, jobject thiz, jint messageType, jstring message); - void handleServiceMessage(int code, const QString& data); - void handleActivityMessage(int code, const QString& data); -}; - -#endif // ANDROIDVPNACTIVITY_H diff --git a/client/protocols/android_vpnprotocol.cpp b/client/protocols/android_vpnprotocol.cpp index 521b08f2e..2c09dd8e9 100644 --- a/client/protocols/android_vpnprotocol.cpp +++ b/client/protocols/android_vpnprotocol.cpp @@ -1,26 +1,16 @@ -#include -#include -#include -#include -#include -#include -#include -#include - #include "android_vpnprotocol.h" #include "platforms/android/android_controller.h" AndroidVpnProtocol::AndroidVpnProtocol(Proto protocol, const QJsonObject &configuration, QObject* parent) - : VpnProtocol(configuration, parent), - m_protocol(protocol) + : VpnProtocol(configuration, parent) { } ErrorCode AndroidVpnProtocol::start() { - AndroidController::instance()->setVpnConfig(m_rawConfig); - return AndroidController::instance()->start(); + qDebug() << "AndroidVpnProtocol::start()"; + return AndroidController::instance()->start(m_rawConfig); } void AndroidVpnProtocol::stop() @@ -29,11 +19,8 @@ void AndroidVpnProtocol::stop() AndroidController::instance()->stop(); } -void AndroidVpnProtocol::connectionDataUpdated(QString totalRx, QString totalTx, QString endpoint, QString deviceIPv4) +void AndroidVpnProtocol::connectionDataUpdated(quint64 rxBytes, quint64 txBytes) { - quint64 rxBytes = totalRx.toLongLong(); - quint64 txBytes = totalTx.toLongLong(); - setBytesChanged(rxBytes, txBytes); } diff --git a/client/protocols/android_vpnprotocol.h b/client/protocols/android_vpnprotocol.h index ea87679a6..9d4e26cd0 100644 --- a/client/protocols/android_vpnprotocol.h +++ b/client/protocols/android_vpnprotocol.h @@ -2,7 +2,6 @@ #define ANDROID_VPNPROTOCOL_H #include "vpnprotocol.h" -#include "protocols/protocols_defs.h" using namespace amnezia; @@ -12,24 +11,14 @@ class AndroidVpnProtocol : public VpnProtocol public: explicit AndroidVpnProtocol(Proto protocol, const QJsonObject& configuration, QObject* parent = nullptr); - virtual ~AndroidVpnProtocol() override = default; + ~AndroidVpnProtocol() override = default; ErrorCode start() override; void stop() override; -signals: - - public slots: - void connectionDataUpdated(QString totalRx, QString totalTx, QString endpoint, QString deviceIPv4); - -protected slots: - -protected: - + void connectionDataUpdated(quint64 rxBytes, quint64 txBytes); -private: - Proto m_protocol; }; #endif // ANDROID_VPNPROTOCOL_H diff --git a/client/ui/controllers/systemController.cpp b/client/ui/controllers/systemController.cpp index 7de071cca..96fc27925 100644 --- a/client/ui/controllers/systemController.cpp +++ b/client/ui/controllers/systemController.cpp @@ -27,7 +27,7 @@ SystemController::SystemController(const std::shared_ptr &settings, QO void SystemController::saveFile(QString fileName, const QString &data) { #if defined Q_OS_ANDROID - AndroidController::instance()->shareConfig(data, fileName); + AndroidController::instance()->saveFile(fileName, data); return; #endif diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 2505a9ea3..56f5c2b62 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -409,7 +409,7 @@ void VpnConnection::createAndroidConnections(DockerContainer container) connect(AndroidController::instance(), &AndroidController::connectionStateChanged, androidVpnProtocol, &AndroidVpnProtocol::setConnectionState); - connect(AndroidController::instance(), &AndroidController::statusUpdated, androidVpnProtocol, + connect(AndroidController::instance(), &AndroidController::statisticsUpdated, androidVpnProtocol, &AndroidVpnProtocol::connectionDataUpdated); } From 2c98a90d6021212eacd1d78645f03f90f25c9383 Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 17 Nov 2023 15:30:13 +0300 Subject: [PATCH 047/144] Move icons to mipmap folders --- client/android/AndroidManifest.xml | 4 ++-- .../res/{drawable-hdpi => mipmap-hdpi}/icon.png | Bin .../{drawable-hdpi => mipmap-hdpi}/icon_round.png | Bin .../res/{drawable-ldpi => mipmap-ldpi}/icon.png | Bin .../{drawable-ldpi => mipmap-ldpi}/icon_round.png | Bin .../res/{drawable-mdpi => mipmap-mdpi}/icon.png | Bin .../{drawable-mdpi => mipmap-mdpi}/icon_round.png | Bin .../res/{drawable-xhdpi => mipmap-xhdpi}/icon.png | Bin .../{drawable-xhdpi => mipmap-xhdpi}/icon_round.png | Bin .../res/{drawable-xxhdpi => mipmap-xxhdpi}/icon.png | Bin .../icon_round.png | Bin .../{drawable-xxxhdpi => mipmap-xxxhdpi}/icon.png | Bin .../icon_round.png | Bin 13 files changed, 2 insertions(+), 2 deletions(-) rename client/android/res/{drawable-hdpi => mipmap-hdpi}/icon.png (100%) rename client/android/res/{drawable-hdpi => mipmap-hdpi}/icon_round.png (100%) rename client/android/res/{drawable-ldpi => mipmap-ldpi}/icon.png (100%) rename client/android/res/{drawable-ldpi => mipmap-ldpi}/icon_round.png (100%) rename client/android/res/{drawable-mdpi => mipmap-mdpi}/icon.png (100%) rename client/android/res/{drawable-mdpi => mipmap-mdpi}/icon_round.png (100%) rename client/android/res/{drawable-xhdpi => mipmap-xhdpi}/icon.png (100%) rename client/android/res/{drawable-xhdpi => mipmap-xhdpi}/icon_round.png (100%) rename client/android/res/{drawable-xxhdpi => mipmap-xxhdpi}/icon.png (100%) rename client/android/res/{drawable-xxhdpi => mipmap-xxhdpi}/icon_round.png (100%) rename client/android/res/{drawable-xxxhdpi => mipmap-xxxhdpi}/icon.png (100%) rename client/android/res/{drawable-xxxhdpi => mipmap-xxxhdpi}/icon_round.png (100%) diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 452919773..45bb49a21 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -31,8 +31,8 @@ android:name=".AmneziaApplication" android:label="-- %%INSERT_APP_NAME%% --" android:allowNativeHeapPointerTagging="false" - android:icon="@drawable/icon" - android:roundIcon="@drawable/icon_round" + android:icon="@mipmap/icon" + android:roundIcon="@mipmap/icon_round" android:theme="@style/Theme.AppCompat.NoActionBar"> Date: Tue, 21 Nov 2023 20:13:51 +0700 Subject: [PATCH 048/144] added client management --- client/amnezia_application.cpp | 9 +- client/amnezia_application.h | 2 + client/configurators/awg_configurator.cpp | 7 +- client/configurators/awg_configurator.h | 2 +- client/configurators/openvpn_configurator.cpp | 8 +- client/configurators/openvpn_configurator.h | 2 +- client/configurators/vpn_configurator.cpp | 8 +- client/configurators/vpn_configurator.h | 14 +- .../configurators/wireguard_configurator.cpp | 4 +- client/configurators/wireguard_configurator.h | 2 +- client/ui/controllers/exportController.cpp | 73 +++- client/ui/controllers/exportController.h | 12 +- client/ui/models/clientManagementModel.cpp | 342 +++++++++++++++--- client/ui/models/clientManagementModel.h | 50 ++- client/ui/models/servers_model.cpp | 5 + client/ui/models/servers_model.h | 1 + client/ui/qml/Pages2/PageShare.qml | 266 ++++++++++++-- client/vpnconnection.cpp | 7 +- client/vpnconnection.h | 2 - 19 files changed, 667 insertions(+), 149 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index b1ed39eeb..5c82599d6 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -279,7 +279,7 @@ void AmneziaApplication::initModels() { m_containersModel.reset(new ContainersModel(m_settings, this)); m_engine->rootContext()->setContextProperty("ContainersModel", m_containersModel.get()); - connect(m_vpnConnection.get(), &VpnConnection::newVpnConfigurationCreated, m_containersModel.get(), + connect(m_configurator.get(), &VpnConfigurator::newVpnConfigCreated, m_containersModel.get(), &ContainersModel::updateContainersConfig); m_serversModel.reset(new ServersModel(m_settings, this)); @@ -322,6 +322,11 @@ void AmneziaApplication::initModels() m_sftpConfigModel.reset(new SftpConfigModel(this)); m_engine->rootContext()->setContextProperty("SftpConfigModel", m_sftpConfigModel.get()); + + m_clientManagementModel.reset(new ClientManagementModel(m_settings, this)); + m_engine->rootContext()->setContextProperty("ClientManagementModel", m_clientManagementModel.get()); + connect(m_configurator.get(), &VpnConfigurator::newVpnConfigCreated, m_clientManagementModel.get(), + &ClientManagementModel::appendClient); } void AmneziaApplication::initControllers() @@ -347,7 +352,7 @@ void AmneziaApplication::initControllers() m_importController.reset(new ImportController(m_serversModel, m_containersModel, m_settings)); m_engine->rootContext()->setContextProperty("ImportController", m_importController.get()); - m_exportController.reset(new ExportController(m_serversModel, m_containersModel, m_settings, m_configurator)); + m_exportController.reset(new ExportController(m_serversModel, m_containersModel, m_clientManagementModel, m_settings, m_configurator)); m_engine->rootContext()->setContextProperty("ExportController", m_exportController.get()); m_settingsController.reset(new SettingsController(m_serversModel, m_containersModel, m_languageModel, m_settings)); diff --git a/client/amnezia_application.h b/client/amnezia_application.h index 323004215..2638c66f0 100644 --- a/client/amnezia_application.h +++ b/client/amnezia_application.h @@ -39,6 +39,7 @@ #include "ui/models/servers_model.h" #include "ui/models/services/sftpConfigModel.h" #include "ui/models/sites_model.h" +#include "ui/models/clientManagementModel.h" #define amnApp (static_cast(QCoreApplication::instance())) @@ -94,6 +95,7 @@ class AmneziaApplication : public AMNEZIA_BASE_CLASS QSharedPointer m_languageModel; QSharedPointer m_protocolsModel; QSharedPointer m_sitesModel; + QSharedPointer m_clientManagementModel; QScopedPointer m_openVpnConfigModel; QScopedPointer m_shadowSocksConfigModel; diff --git a/client/configurators/awg_configurator.cpp b/client/configurators/awg_configurator.cpp index c3e42258c..ca6c282b2 100644 --- a/client/configurators/awg_configurator.cpp +++ b/client/configurators/awg_configurator.cpp @@ -10,11 +10,10 @@ AwgConfigurator::AwgConfigurator(std::shared_ptr settings, QObject *pa { } -QString AwgConfigurator::genAwgConfig(const ServerCredentials &credentials, - DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode) +QString AwgConfigurator::genAwgConfig(const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode) { - QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode); + QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, clientId, errorCode); QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object(); QString awgConfig = jsonConfig.value(config_key::config).toString(); diff --git a/client/configurators/awg_configurator.h b/client/configurators/awg_configurator.h index cf0f2caee..ef40804ca 100644 --- a/client/configurators/awg_configurator.h +++ b/client/configurators/awg_configurator.h @@ -12,7 +12,7 @@ class AwgConfigurator : public WireguardConfigurator AwgConfigurator(std::shared_ptr settings, QObject *parent = nullptr); QString genAwgConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode = nullptr); }; #endif // AWGCONFIGURATOR_H diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index 8c58a376d..d863fdabe 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -83,7 +83,7 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co } QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode) + const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode) { ServerController serverController(m_settings); QString config = @@ -131,13 +131,13 @@ QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) config.append("block-ipv6\n"); } if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { - + // no redirect-gateway } if (m_settings->routeMode() == Settings::VpnAllExceptSites) { -#ifndef Q_OS_ANDROID +#ifndef Q_OS_ANDROID config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); -#endif +#endif // Prevent ipv6 leak config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); config.append("block-ipv6\n"); diff --git a/client/configurators/openvpn_configurator.h b/client/configurators/openvpn_configurator.h index 3b84e0a0e..6d927697a 100644 --- a/client/configurators/openvpn_configurator.h +++ b/client/configurators/openvpn_configurator.h @@ -24,7 +24,7 @@ class OpenVpnConfigurator : ConfiguratorBase }; QString genOpenVpnConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode = nullptr); QString processConfigWithLocalSettings(QString jsonConfig); QString processConfigWithExportSettings(QString jsonConfig); diff --git a/client/configurators/vpn_configurator.cpp b/client/configurators/vpn_configurator.cpp index 6c5286c22..3018b52fc 100644 --- a/client/configurators/vpn_configurator.cpp +++ b/client/configurators/vpn_configurator.cpp @@ -28,11 +28,11 @@ VpnConfigurator::VpnConfigurator(std::shared_ptr settings, QObject *pa } QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode) + const QJsonObject &containerConfig, Proto proto, QString &clientId, ErrorCode *errorCode) { switch (proto) { case Proto::OpenVpn: - return openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, errorCode); + return openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, clientId, errorCode); case Proto::ShadowSocks: return shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, errorCode); @@ -40,10 +40,10 @@ QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentia case Proto::Cloak: return cloakConfigurator->genCloakConfig(credentials, container, containerConfig, errorCode); case Proto::WireGuard: - return wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, errorCode); + return wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, clientId, errorCode); case Proto::Awg: - return awgConfigurator->genAwgConfig(credentials, container, containerConfig, errorCode); + return awgConfigurator->genAwgConfig(credentials, container, containerConfig, clientId, errorCode); case Proto::Ikev2: return ikev2Configurator->genIkev2Config(credentials, container, containerConfig, errorCode); diff --git a/client/configurators/vpn_configurator.h b/client/configurators/vpn_configurator.h index ac89b0e40..61dc2ac6f 100644 --- a/client/configurators/vpn_configurator.h +++ b/client/configurators/vpn_configurator.h @@ -6,7 +6,6 @@ #include "configurator_base.h" #include "core/defs.h" - class OpenVpnConfigurator; class ShadowSocksConfigurator; class CloakConfigurator; @@ -16,14 +15,15 @@ class SshConfigurator; class AwgConfigurator; // Retrieve connection settings from server -class VpnConfigurator : ConfiguratorBase +class VpnConfigurator : public ConfiguratorBase { Q_OBJECT public: explicit VpnConfigurator(std::shared_ptr settings, QObject *parent = nullptr); QString genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, Proto proto, QString &clientId, + ErrorCode *errorCode = nullptr); QPair getDnsForConfig(int serverIndex); QString &processConfigWithDnsSettings(int serverIndex, DockerContainer container, Proto proto, QString &config); @@ -32,8 +32,8 @@ class VpnConfigurator : ConfiguratorBase QString &processConfigWithExportSettings(int serverIndex, DockerContainer container, Proto proto, QString &config); // workaround for containers which is not support normal configuration - void updateContainerConfigAfterInstallation(DockerContainer container, - QJsonObject &containerConfig, const QString &stdOut); + void updateContainerConfigAfterInstallation(DockerContainer container, QJsonObject &containerConfig, + const QString &stdOut); std::shared_ptr openVpnConfigurator; std::shared_ptr shadowSocksConfigurator; @@ -42,6 +42,10 @@ class VpnConfigurator : ConfiguratorBase std::shared_ptr ikev2Configurator; std::shared_ptr sshConfigurator; std::shared_ptr awgConfigurator; + +signals: + void newVpnConfigCreated(const QString &clientId, const QString &clientName, const DockerContainer container, + ServerCredentials credentials); }; #endif // VPN_CONFIGURATOR_H diff --git a/client/configurators/wireguard_configurator.cpp b/client/configurators/wireguard_configurator.cpp index e22c82827..9a6651ef1 100644 --- a/client/configurators/wireguard_configurator.cpp +++ b/client/configurators/wireguard_configurator.cpp @@ -177,7 +177,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon } QString WireguardConfigurator::genWireguardConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode) + const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode) { ServerController serverController(m_settings); QString scriptData = amnezia::scriptData(m_configTemplate, container); @@ -205,6 +205,8 @@ QString WireguardConfigurator::genWireguardConfig(const ServerCredentials &crede jConfig[config_key::psk_key] = connData.pskKey; jConfig[config_key::server_pub_key] = connData.serverPubKey; + clientId = connData.clientPubKey; + return QJsonDocument(jConfig).toJson(); } diff --git a/client/configurators/wireguard_configurator.h b/client/configurators/wireguard_configurator.h index 7f8e15879..c1b4aa3c7 100644 --- a/client/configurators/wireguard_configurator.h +++ b/client/configurators/wireguard_configurator.h @@ -26,7 +26,7 @@ class WireguardConfigurator : public ConfiguratorBase }; QString genWireguardConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode = nullptr); QString processConfigWithLocalSettings(QString config); QString processConfigWithExportSettings(QString config); diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index ef5cc4e3b..a8be624d7 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -8,7 +8,9 @@ #include #include +#include "configurators/cloak_configurator.h" #include "configurators/openvpn_configurator.h" +#include "configurators/shadowsocks_configurator.h" #include "configurators/wireguard_configurator.h" #include "core/errorstrings.h" #include "systemController.h" @@ -19,11 +21,13 @@ ExportController::ExportController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, + const QSharedPointer &clientManagementModel, const std::shared_ptr &settings, const std::shared_ptr &configurator, QObject *parent) : QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel), + m_clientManagementModel(clientManagementModel), m_settings(settings), m_configurator(configurator) { @@ -75,13 +79,12 @@ void ExportController::generateFullAccessConfigAndroid() } #endif -void ExportController::generateConnectionConfig() +void ExportController::generateConnectionConfig(const QString &clientName) { clearPreviousConfig(); int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); - ServerCredentials credentials = - qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); + ServerCredentials credentials = m_serversModel->getCurrentlyProcessedServerCredentials(); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); QModelIndex containerModelIndex = m_containersModel->index(container); @@ -93,17 +96,25 @@ void ExportController::generateConnectionConfig() for (Proto protocol : ContainerProps::protocolsForContainer(container)) { QJsonObject protocolConfig = m_settings->protocolConfig(serverIndex, container, protocol); - QString vpnConfig = - m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, protocol, &errorCode); + QString clientId; + QString vpnConfig = m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, protocol, + clientId, &errorCode); if (errorCode) { emit exportErrorOccurred(errorString(errorCode)); return; } protocolConfig.insert(config_key::last_config, vpnConfig); containerConfig.insert(ProtocolProps::protoToString(protocol), protocolConfig); + if (protocol == Proto::OpenVpn || protocol == Proto::Awg || protocol == Proto::WireGuard) { + errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + } } - QJsonObject config = m_settings->server(serverIndex); + QJsonObject config = m_settings->server(serverIndex); // todo change to servers_model if (!errorCode) { config.remove(config_key::userName); config.remove(config_key::password); @@ -126,13 +137,12 @@ void ExportController::generateConnectionConfig() emit exportConfigChanged(); } -void ExportController::generateOpenVpnConfig() +void ExportController::generateOpenVpnConfig(const QString &clientName) { clearPreviousConfig(); int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); - ServerCredentials credentials = - qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); + ServerCredentials credentials = m_serversModel->getCurrentlyProcessedServerCredentials(); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); QModelIndex containerModelIndex = m_containersModel->index(container); @@ -141,8 +151,9 @@ void ExportController::generateOpenVpnConfig() containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); ErrorCode errorCode = ErrorCode::NoError; - QString config = - m_configurator->openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, &errorCode); + QString clientId; + QString config = m_configurator->openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, + clientId, &errorCode); if (errorCode) { emit exportErrorOccurred(errorString(errorCode)); return; @@ -155,16 +166,23 @@ void ExportController::generateOpenVpnConfig() m_config.append(line + "\n"); } + m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + + errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + emit exportConfigChanged(); } -void ExportController::generateWireGuardConfig() +void ExportController::generateWireGuardConfig(const QString &clientName) { clearPreviousConfig(); int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); - ServerCredentials credentials = - qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); + ServerCredentials credentials = m_serversModel->getCurrentlyProcessedServerCredentials(); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); QModelIndex containerModelIndex = m_containersModel->index(container); @@ -172,9 +190,10 @@ void ExportController::generateWireGuardConfig() qvariant_cast(m_containersModel->data(containerModelIndex, ContainersModel::Roles::ConfigRole)); containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); + QString clientId; ErrorCode errorCode = ErrorCode::NoError; QString config = m_configurator->wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, - &errorCode); + clientId, &errorCode); if (errorCode) { emit exportErrorOccurred(errorString(errorCode)); return; @@ -187,6 +206,14 @@ void ExportController::generateWireGuardConfig() m_config.append(line + "\n"); } + m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + + errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + emit exportConfigChanged(); } @@ -205,6 +232,22 @@ void ExportController::exportConfig(const QString &fileName) SystemController::saveFile(fileName, m_config); } +void ExportController::revokeConfig(const int row, const DockerContainer container, ServerCredentials credentials) +{ + ErrorCode errorCode = m_clientManagementModel->revokeClient(row, container, credentials); + if (errorCode != ErrorCode::NoError) { + emit exportErrorOccurred(errorString(errorCode)); + } +} + +void ExportController::renameClient(const int row, const QString &clientName, const DockerContainer container, ServerCredentials credentials) +{ + ErrorCode errorCode = m_clientManagementModel->renameClient(row, clientName, container, credentials); + if (errorCode != ErrorCode::NoError) { + emit exportErrorOccurred(errorString(errorCode)); + } +} + QList ExportController::generateQrCodeImageSeries(const QByteArray &data) { double k = 850; diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index 24eaa5c85..b34a05bc3 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -6,6 +6,7 @@ #include "configurators/vpn_configurator.h" #include "ui/models/containers_model.h" #include "ui/models/servers_model.h" +#include "ui/models/clientManagementModel.h" #ifdef Q_OS_ANDROID #include "platforms/android/authResultReceiver.h" #endif @@ -16,6 +17,7 @@ class ExportController : public QObject public: explicit ExportController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, + const QSharedPointer &clientManagementModel, const std::shared_ptr &settings, const std::shared_ptr &configurator, QObject *parent = nullptr); @@ -28,15 +30,18 @@ public slots: #if defined(Q_OS_ANDROID) void generateFullAccessConfigAndroid(); #endif - void generateConnectionConfig(); - void generateOpenVpnConfig(); - void generateWireGuardConfig(); + void generateConnectionConfig(const QString &clientName); + void generateOpenVpnConfig(const QString &clientName); + void generateWireGuardConfig(const QString &clientName); QString getConfig(); QList getQrCodes(); void exportConfig(const QString &fileName); + void revokeConfig(const int row, const DockerContainer container, ServerCredentials credentials); + void renameClient(const int row, const QString &clientName, const DockerContainer container, ServerCredentials credentials); + signals: void generateConfig(int type); void exportErrorOccurred(const QString &errorMessage); @@ -55,6 +60,7 @@ public slots: QSharedPointer m_serversModel; QSharedPointer m_containersModel; + QSharedPointer m_clientManagementModel; std::shared_ptr m_settings; std::shared_ptr m_configurator; diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 87652ff26..c4c4fb7aa 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -1,104 +1,330 @@ #include "clientManagementModel.h" +#include #include -ClientManagementModel::ClientManagementModel(QObject *parent) : QAbstractListModel(parent) +#include "core/servercontroller.h" + +ClientManagementModel::ClientManagementModel(std::shared_ptr settings, QObject *parent) + : m_settings(settings), QAbstractListModel(parent) { +} +int ClientManagementModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return static_cast(m_clientsTable.size()); } -void ClientManagementModel::clearData() +QVariant ClientManagementModel::data(const QModelIndex &index, int role) const { - beginResetModel(); - m_content.clear(); - endResetModel(); + if (!index.isValid() || index.row() < 0 || index.row() >= static_cast(m_clientsTable.size())) { + return QVariant(); + } + + auto client = m_clientsTable.at(index.row()).toObject(); + auto userData = client.value("userData").toObject(); + + switch (role) { + case UserNameRole: return userData.value("clientName").toString(); + case ContainerNameRole: + return ContainerProps::containerHumanNames().value( + static_cast(userData.value("container").toInt())); + } + + return QVariant(); } -void ClientManagementModel::setContent(const QVector &data) +ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCredentials credentials) { + ServerController serverController(m_settings); + + ErrorCode error = ErrorCode::NoError; + QString stdOut; + auto cbReadStdOut = [&](const QString &data, libssh::Client &) { + stdOut += data + "\n"; + return ErrorCode::NoError; + }; + + const QString clientsTableFile = + QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + const QByteArray clientsTableString = + serverController.getTextFileFromContainer(container, credentials, clientsTableFile, &error); + if (error != ErrorCode::NoError) { + return error; + } + beginResetModel(); - m_content = data; + m_clientsTable = QJsonDocument::fromJson(clientsTableString).array(); + + if (m_clientsTable.isEmpty()) { + int count = 0; + + if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks + || container == DockerContainer::Cloak) { + const QString getOpenVpnClientsList = + "sudo docker exec -i $CONTAINER_NAME bash -c 'ls /opt/amnezia/openvpn/pki/issued'"; + QString script = serverController.replaceVars(getOpenVpnClientsList, + serverController.genVarsForScript(credentials, container)); + error = serverController.runScript(credentials, script, cbReadStdOut); + if (error != ErrorCode::NoError) { + return error; + } + + if (!stdOut.isEmpty()) { + QStringList certsIds = stdOut.split("\n", Qt::SkipEmptyParts); + certsIds.removeAll("AmneziaReq.crt"); + + for (auto &openvpnCertId : certsIds) { + openvpnCertId.replace(".crt", ""); + if (!isClientExists(openvpnCertId)) { + QJsonObject client; + client["userId"] = openvpnCertId; + + QJsonObject userData; + userData["clientName"] = QString("Client %1").arg(count); + userData["container"] = container; + client["userData"] = userData; + + m_clientsTable.push_back(client); + + count++; + } + } + } + } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { + const QString wireGuardConfigFile = + QString("opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); + const QString wireguardConfigString = + serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); + if (error != ErrorCode::NoError) { + return error; + } + + auto configLines = wireguardConfigString.split("\n", Qt::SkipEmptyParts); + QStringList wireguardKeys; + for (const auto &line : configLines) { + auto configPair = line.split(" = ", Qt::SkipEmptyParts); + if (configPair.front() == "PublicKey") { + wireguardKeys.push_back(configPair.back()); + } + } + + for (auto &wireguardKey : wireguardKeys) { + if (!isClientExists(wireguardKey)) { + QJsonObject client; + client["userId"] = wireguardKey; + + QJsonObject userData; + userData["clientName"] = QString("Client %1").arg(count); + userData["container"] = container; + client["userData"] = userData; + + m_clientsTable.push_back(client); + + count++; + } + } + } + + const QByteArray newClientsTableString = QJsonDocument(m_clientsTable).toJson(); + if (clientsTableString != newClientsTableString) { + error = serverController.uploadTextFileToContainer(container, credentials, newClientsTableString, + clientsTableFile); + } + } + endResetModel(); + return error; } -QJsonObject ClientManagementModel::getContent(amnezia::Proto protocol) +bool ClientManagementModel::isClientExists(const QString &clientId) { - QJsonObject clientsTable; - for (const auto &item : m_content) { - if (protocol == amnezia::Proto::OpenVpn) { - clientsTable[item.toJsonObject()["openvpnCertId"].toString()] = item.toJsonObject(); - } else if (protocol == amnezia::Proto::WireGuard) { - clientsTable[item.toJsonObject()["wireguardPublicKey"].toString()] = item.toJsonObject(); + for (const QJsonValue &value : qAsConst(m_clientsTable)) { + if (value.isObject()) { + QJsonObject obj = value.toObject(); + if (obj.contains("userId") && obj["userId"].toString() == clientId) { + return true; + } } } - return clientsTable; + return false; } -int ClientManagementModel::rowCount(const QModelIndex &parent) const +ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QString &clientName, + const DockerContainer container, ServerCredentials credentials) { - Q_UNUSED(parent); - return static_cast(m_content.size()); + ErrorCode error; + if (m_clientsTable.empty()) { + error = updateModel(container, credentials); + if (error != ErrorCode::NoError) { + return error; + } + + for (int i = 0; i < m_clientsTable.size(); i++) { + if (m_clientsTable.at(i).toObject().value("userId") == (clientId)) { + error = renameClient(i, clientName, container, credentials); + if (error != ErrorCode::NoError) { + return error; + } + } + } + } else { + beginResetModel(); + QJsonObject client; + client["userId"] = clientId; + + QJsonObject userData; + userData["clientName"] = clientName; + userData["container"] = container; + client["userData"] = userData; + m_clientsTable.push_back(client); + endResetModel(); + + const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); + + ServerController serverController(m_settings); + const QString clientsTableFile = + QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + + error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + } + + return error; } -QVariant ClientManagementModel::data(const QModelIndex &index, int role) const +ErrorCode ClientManagementModel::renameClient(const int row, const QString &clientName, const DockerContainer container, + ServerCredentials credentials) { - if (!index.isValid() || index.row() < 0 - || index.row() >= static_cast(m_content.size())) { - return QVariant(); - } + auto client = m_clientsTable.at(row).toObject(); + auto userData = client["userData"].toObject(); + userData["clientName"] = clientName; + client["userData"] = userData; - if (role == NameRole) { - return m_content[index.row()].toJsonObject()["clientName"].toString(); - } else if (role == OpenVpnCertIdRole) { - return m_content[index.row()].toJsonObject()["openvpnCertId"].toString(); - } else if (role == OpenVpnCertDataRole) { - return m_content[index.row()].toJsonObject()["openvpnCertData"].toString(); - } else if (role == WireGuardPublicKey) { - return m_content[index.row()].toJsonObject()["wireguardPublicKey"].toString(); - } + m_clientsTable.replace(row, client); + emit dataChanged(index(row, 0), index(row, 0)); - return QVariant(); + const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); + + ServerController serverController(m_settings); + const QString clientsTableFile = + QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + + ErrorCode error = + serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + + return error; } -void ClientManagementModel::setData(const QModelIndex &index, QVariant data, int role) +ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContainer container, + ServerCredentials credentials) { - if (!index.isValid() || index.row() < 0 - || index.row() >= static_cast(m_content.size())) { - return; + if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks + || container == DockerContainer::Cloak) { + return revokeOpenVpn(row, container, credentials); + } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { + return revokeWireGuard(row, container, credentials); } + return ErrorCode::NoError; +} - auto client = m_content[index.row()].toJsonObject(); - if (role == NameRole) { - client["clientName"] = data.toString(); - } else if (role == OpenVpnCertIdRole) { - client["openvpnCertId"] = data.toString(); - } else if (role == OpenVpnCertDataRole) { - client["openvpnCertData"] = data.toString(); - } else if (role == WireGuardPublicKey) { - client["wireguardPublicKey"] = data.toString(); - } else { - return; +ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContainer container, + ServerCredentials credentials) +{ + auto client = m_clientsTable.at(row).toObject(); + QString clientId = client.value("userId").toString(); + + const QString getOpenVpnCertData = QString("sudo docker exec -i $CONTAINER_NAME bash -c '" + "cd /opt/amnezia/openvpn ;\\" + "easyrsa revoke %1 ;\\" + "easyrsa gen-crl ;\\" + "cp pki/crl.pem .'") + .arg(clientId); + + ServerController serverController(m_settings); + const QString script = + serverController.replaceVars(getOpenVpnCertData, serverController.genVarsForScript(credentials, container)); + ErrorCode error = serverController.runScript(credentials, script); + if (error != ErrorCode::NoError) { + return error; } - if (m_content[index.row()] != client) { - m_content[index.row()] = client; - emit dataChanged(index, index); + + beginRemoveRows(QModelIndex(), row, row); + m_clientsTable.removeAt(row); + endRemoveRows(); + + const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); + + const QString clientsTableFile = + QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + if (error != ErrorCode::NoError) { + return error; } + + return ErrorCode::NoError; } -bool ClientManagementModel::removeRows(int row) +ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerContainer container, + ServerCredentials credentials) { + ErrorCode error; + ServerController serverController(m_settings); + + const QString wireGuardConfigFile = + QString("/opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); + const QString wireguardConfigString = + serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); + if (error != ErrorCode::NoError) { + return error; + } + + auto client = m_clientsTable.at(row).toObject(); + QString clientId = client.value("userId").toString(); + + auto configSections = wireguardConfigString.split("[", Qt::SkipEmptyParts); + for (auto §ion : configSections) { + if (section.contains(clientId)) { + configSections.removeOne(section); + break; + } + } + QString newWireGuardConfig = configSections.join("["); + newWireGuardConfig.insert(0, "["); + error = serverController.uploadTextFileToContainer(container, credentials, newWireGuardConfig, wireGuardConfigFile); + if (error != ErrorCode::NoError) { + return error; + } + beginRemoveRows(QModelIndex(), row, row); - m_content.removeAt(row); + m_clientsTable.removeAt(row); endRemoveRows(); - return true; + + const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); + + const QString clientsTableFile = + QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + if (error != ErrorCode::NoError) { + return error; + } + + const QString script = "sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip %1)'"; + error = serverController.runScript( + credentials, + serverController.replaceVars(script.arg(wireGuardConfigFile), + serverController.genVarsForScript(credentials, container))); + if (error != ErrorCode::NoError) { + return error; + } + + return ErrorCode::NoError; } QHash ClientManagementModel::roleNames() const { QHash roles; - roles[NameRole] = "clientName"; - roles[OpenVpnCertIdRole] = "openvpnCertId"; - roles[OpenVpnCertDataRole] = "openvpnCertData"; - roles[WireGuardPublicKey] = "wireguardPublicKey"; + roles[UserNameRole] = "userName"; + roles[ContainerNameRole] = "containerName"; return roles; } diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 5230c3370..c51ce8161 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -2,36 +2,62 @@ #define CLIENTMANAGEMENTMODEL_H #include +#include #include "protocols/protocols_defs.h" +#include "settings.h" class ClientManagementModel : public QAbstractListModel { Q_OBJECT + struct ClientManagementData + { + QString userId; + QJsonObject userData; + + bool operator==(const ClientManagementData &r) const + { + return userId == r.userId; + } + + bool operator==(const QString &otherUserId) const + { + return userId == otherUserId; + } + }; + public: - enum ClientRoles { - NameRole = Qt::UserRole + 1, - OpenVpnCertIdRole, - OpenVpnCertDataRole, - WireGuardPublicKey, + enum Roles { + UserNameRole = Qt::UserRole + 1, + ContainerNameRole, }; - ClientManagementModel(QObject *parent = nullptr); + ClientManagementModel(std::shared_ptr settings, QObject *parent = nullptr); - void clearData(); - void setContent(const QVector &data); - QJsonObject getContent(amnezia::Proto protocol); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - void setData(const QModelIndex &index, QVariant data, int role = Qt::DisplayRole); - bool removeRows(int row); + +public slots: + ErrorCode updateModel(DockerContainer container, ServerCredentials credentials); + ErrorCode appendClient(const QString &clientId, const QString &clientName, const DockerContainer container, + ServerCredentials credentials); + ErrorCode renameClient(const int row, const QString &userName, const DockerContainer container, + ServerCredentials credentials); + ErrorCode revokeClient(const int index, const DockerContainer container, ServerCredentials credentials); protected: QHash roleNames() const override; private: - QVector m_content; + bool isClientExists(const QString &clientId); + + ErrorCode revokeOpenVpn(const int row, const DockerContainer container, ServerCredentials credentials); + ErrorCode revokeWireGuard(const int row, const DockerContainer container, ServerCredentials credentials); + + QJsonArray m_clientsTable; + + std::shared_ptr m_settings; }; #endif // CLIENTMANAGEMENTMODEL_H diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index a2a286304..69a4f9d99 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -145,6 +145,11 @@ QString ServersModel::getCurrentlyProcessedServerHostName() return qvariant_cast(data(m_currentlyProcessedServerIndex, HostNameRole)); } +const ServerCredentials ServersModel::getCurrentlyProcessedServerCredentials() +{ + return serverCredentials(m_currentlyProcessedServerIndex); +} + bool ServersModel::isDefaultServerCurrentlyProcessed() { return m_defaultServerIndex == m_currentlyProcessedServerIndex; diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index ad1d5a835..3010632a6 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -53,6 +53,7 @@ public slots: int getCurrentlyProcessedServerIndex(); QString getCurrentlyProcessedServerHostName(); + const ServerCredentials getCurrentlyProcessedServerCredentials(); void addServer(const QJsonObject &server); void removeServer(); diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index ced7a5ff0..018137039 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -23,10 +23,22 @@ PageType { WireGuard } + signal revokeConfig(int index) + onRevokeConfig: function(index) { + PageController.showBusyIndicator(true) + ExportController.revokeConfig(index, + ContainersModel.getCurrentlyProcessedContainerIndex(), + ServersModel.getCurrentlyProcessedServerCredentials()) + PageController.showBusyIndicator(false) + } + Connections { target: ExportController function onGenerateConfig(type) { + shareConnectionDrawer.headerText = qsTr("Connection to ") + serverSelector.text + shareConnectionDrawer.configContentHeaderText = qsTr("File with connection settings to ") + serverSelector.text + shareConnectionDrawer.needCloseButton = false shareConnectionDrawer.open() @@ -34,7 +46,7 @@ PageType { PageController.showBusyIndicator(true) switch (type) { - case PageShare.ConfigType.AmneziaConnection: ExportController.generateConnectionConfig(); break; + case PageShare.ConfigType.AmneziaConnection: ExportController.generateConnectionConfig(userNameTextField.textFieldText); break; case PageShare.ConfigType.AmneziaFullAccess: { if (Qt.platform.os === "android") { ExportController.generateFullAccessConfigAndroid(); @@ -44,14 +56,14 @@ PageType { break; } case PageShare.ConfigType.OpenVpn: { - ExportController.generateOpenVpnConfig(); + ExportController.generateOpenVpnConfig(userNameTextField.textFieldText) shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") shareConnectionDrawer.configExtension = ".ovpn" shareConnectionDrawer.configFileName = "amnezia_for_openvpn" break; } case PageShare.ConfigType.WireGuard: { - ExportController.generateWireGuardConfig(); + ExportController.generateWireGuardConfig(userNameTextField.textFieldText) shareConnectionDrawer.configCaption = qsTr("Save WireGuard config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_wireguard" @@ -73,8 +85,6 @@ PageType { } } - property string fullConfigServerSelectorText - property string connectionServerSelectorText property bool showContent: false property bool shareButtonEnabled: true property list connectionTypesModel: [ @@ -147,20 +157,21 @@ PageType { onClicked: { accessTypeSelector.currentIndex = 0 - serverSelector.text = root.connectionServerSelectorText } } HorizontalRadioButton { - checked: root.currentIndex === 1 + checked: accessTypeSelector.currentIndex === 1 implicitWidth: (root.width - 32) / 2 - text: qsTr("Full access") + text: qsTr("Users") onClicked: { accessTypeSelector.currentIndex = 1 - serverSelector.text = root.fullConfigServerSelectorText - root.shareButtonEnabled = true + PageController.showBusyIndicator(true) + ClientManagementModel.updateModel(ContainersModel.getCurrentlyProcessedContainerIndex(), + ServersModel.getCurrentlyProcessedServerCredentials()) + PageController.showBusyIndicator(false) } } } @@ -171,11 +182,25 @@ PageType { Layout.topMargin: 24 Layout.bottomMargin: 24 - text: accessTypeSelector.currentIndex === 0 ? qsTr("Share VPN access without the ability to manage the server") : - qsTr("Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings.") + visible: accessTypeSelector.currentIndex === 0 + + text: qsTr("Share VPN access without the ability to manage the server") color: "#878B91" } + TextFieldWithHeaderType { + id: userNameTextField + Layout.fillWidth: true + Layout.topMargin: 16 + + visible: accessTypeSelector.currentIndex === 0 + + headerText: qsTr("User name") + textFieldText: "New client" + + checkEmptyText: true + } + DropDownType { id: serverSelector @@ -217,10 +242,11 @@ PageType { serverSelector.severSelectorIndexChanged() } - if (accessTypeSelector.currentIndex !== 0) { - shareConnectionDrawer.headerText = qsTr("Accessing ") + serverSelector.text - shareConnectionDrawer.configContentHeaderText = qsTr("File with accessing settings to ") + serverSelector.text - } + //full access label +// if (accessTypeSelector.currentIndex !== 0) { +// shareConnectionDrawer.headerText = qsTr("Accessing ") + serverSelector.text +// shareConnectionDrawer.configContentHeaderText = qsTr("File with accessing settings to ") + serverSelector.text +// } serverSelector.menuVisible = false } @@ -231,8 +257,6 @@ PageType { function handler() { serverSelector.text = selectedText - root.fullConfigServerSelectorText = selectedText - root.connectionServerSelectorText = selectedText ServersModel.currentlyProcessedIndex = proxyServersModel.mapToSource(currentIndex) } } @@ -241,8 +265,6 @@ PageType { DropDownType { id: protocolSelector - visible: accessTypeSelector.currentIndex === 0 - Layout.fillWidth: true Layout.topMargin: 16 @@ -280,12 +302,6 @@ PageType { protocolSelector.menuVisible = false } - Component.onCompleted: { - if (accessTypeSelector.currentIndex === 0) { - handler() - } - } - Connections { target: serverSelector @@ -304,13 +320,17 @@ PageType { } protocolSelector.text = selectedText - root.connectionServerSelectorText = serverSelector.text - shareConnectionDrawer.headerText = qsTr("Connection to ") + serverSelector.text - shareConnectionDrawer.configContentHeaderText = qsTr("File with connection settings to ") + serverSelector.text ContainersModel.setCurrentlyProcessedContainerIndex(proxyContainersModel.mapToSource(currentIndex)) - fillConnectionTypeModel() + if (accessTypeSelector.currentIndex === 0) { + fillConnectionTypeModel() + } else { + PageController.showBusyIndicator(true) + ClientManagementModel.updateModel(ContainersModel.getCurrentlyProcessedContainerIndex(), + ServersModel.getCurrentlyProcessedServerCredentials()) + PageController.showBusyIndicator(false) + } } function fillConnectionTypeModel() { @@ -378,18 +398,196 @@ PageType { Layout.topMargin: 40 enabled: shareButtonEnabled + visible: accessTypeSelector.currentIndex === 0 text: qsTr("Share") imageSource: "qrc:/images/controls/share-2.svg" onClicked: { - if (accessTypeSelector.currentIndex === 0) { - ExportController.generateConfig(root.connectionTypesModel[exportTypeSelector.currentIndex].type) - } else { - ExportController.generateConfig(PageShare.ConfigType.AmneziaFullAccess) + ExportController.generateConfig(root.connectionTypesModel[exportTypeSelector.currentIndex].type) + } + } + + Header2Type { + Layout.fillWidth: true + Layout.topMargin: 24 + Layout.bottomMargin: 16 + + visible: accessTypeSelector.currentIndex === 1 + + headerText: qsTr("Users") + } + + ListView { + id: usersListView + Layout.fillWidth: true + Layout.preferredHeight: childrenRect.height + + visible: accessTypeSelector.currentIndex === 1 + + model: ClientManagementModel + + clip: true + interactive: false + + delegate: Item { + implicitWidth: usersListView.width + implicitHeight: delegateContent.implicitHeight + + ColumnLayout { + id: delegateContent + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + anchors.rightMargin: -16 + anchors.leftMargin: -16 + + LabelWithButtonType { + Layout.fillWidth: true + + text: userName + descriptionText: containerName + rightImageSource: "qrc:/images/controls/chevron-right.svg" + + clickedFunction: function() { + userInfoDrower.open() + } + } + + DividerType {} + + DrawerType { + id: userInfoDrower + + width: root.width + height: root.height * 0.45 + + ColumnLayout { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 16 + anchors.leftMargin: 16 + anchors.rightMargin: 16 + + spacing: 8 + + Header2Type { + Layout.fillWidth: true + Layout.bottomMargin: 24 + + headerText: userName + descriptionText: serverSelector.text + ", " + containerName + } + + BasicButtonType { + Layout.fillWidth: true + Layout.topMargin: 24 + + defaultColor: "transparent" + hoveredColor: Qt.rgba(1, 1, 1, 0.08) + pressedColor: Qt.rgba(1, 1, 1, 0.12) + disabledColor: "#878B91" + textColor: "#D7D8DB" + borderWidth: 1 + + text: qsTr("Rename") + + onClicked: function() { + clientNameEditDrawer.open() + } + + DrawerType { + id: clientNameEditDrawer + + width: root.width + height: root.height * 0.35 + + onVisibleChanged: { + if (clientNameEditDrawer.visible) { + clientName.textField.forceActiveFocus() + } + } + + ColumnLayout { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 16 + anchors.leftMargin: 16 + anchors.rightMargin: 16 + + TextFieldWithHeaderType { + id: clientName + + Layout.fillWidth: true + headerText: qsTr("Client name") + textFieldText: userName + } + + BasicButtonType { + Layout.fillWidth: true + + text: qsTr("Save") + + onClicked: { + if (clientName.textFieldText !== userName) { + PageController.showBusyIndicator(true) + ExportController.renameClient(index, + clientName.textFieldText, + ContainersModel.getCurrentlyProcessedContainerIndex(), + ServersModel.getCurrentlyProcessedServerCredentials()) + PageController.showBusyIndicator(false) + clientNameEditDrawer.close() + } + } + } + } + } + } + + BasicButtonType { + Layout.fillWidth: true + + defaultColor: "transparent" + hoveredColor: Qt.rgba(1, 1, 1, 0.08) + pressedColor: Qt.rgba(1, 1, 1, 0.12) + disabledColor: "#878B91" + textColor: "#D7D8DB" + borderWidth: 1 + + text: qsTr("Revoke") + + onClicked: function() { + questionDrawer.headerText = qsTr("Revoke the config for a user - ") + userName + "?" + questionDrawer.descriptionText = qsTr("The user will no longer be able to connect to your server.") + questionDrawer.yesButtonText = qsTr("Continue") + questionDrawer.noButtonText = qsTr("Cancel") + + questionDrawer.yesButtonFunction = function() { + questionDrawer.close() + userInfoDrower.close() + root.revokeConfig(index) + } + questionDrawer.noButtonFunction = function() { + questionDrawer.close() + } + questionDrawer.open() + + + + } + } + } + } } } } + QuestionDrawer { + id: questionDrawer + } } } } diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index dea40f240..af278276b 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -227,12 +227,15 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex, const Ser configData = lastVpnConfig.value(proto); configData = m_configurator->processConfigWithLocalSettings(serverIndex, container, proto, configData); } else { - configData = m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, proto, errorCode); + QString clientId; + configData = m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, proto, clientId, errorCode); if (errorCode && *errorCode) { return ""; } + emit m_configurator->newVpnConfigCreated(clientId, "unnamed client", container, credentials); + QString configDataBeforeLocalProcessing = configData; configData = m_configurator->processConfigWithLocalSettings(serverIndex, container, proto, configData); @@ -323,7 +326,7 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede ErrorCode e = ErrorCode::NoError; m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig, &e); - emit newVpnConfigurationCreated(); + if (e) { emit connectionStateChanged(Vpn::ConnectionState::Error); return; diff --git a/client/vpnconnection.h b/client/vpnconnection.h index 45582de51..ebc0b80ea 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -79,8 +79,6 @@ public slots: void serviceIsNotReady(); - void newVpnConfigurationCreated(); - protected slots: void onBytesChanged(quint64 receivedBytes, quint64 sentBytes); void onConnectionStateChanged(Vpn::ConnectionState state); From 679bd4e4c9a4bb3bded9ecaaff682cebb0055a33 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 21 Nov 2023 21:31:49 +0300 Subject: [PATCH 049/144] Get rid of AppCompat theme --- client/android/AndroidManifest.xml | 2 +- client/android/res/values/styles.xml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 client/android/res/values/styles.xml diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 45bb49a21..34b5afd8a 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -33,7 +33,7 @@ android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/icon" android:roundIcon="@mipmap/icon_round" - android:theme="@style/Theme.AppCompat.NoActionBar"> + android:theme="@style/NoActionBar"> + + + \ No newline at end of file From e625543b94d79dee6a5be91c0a589ee779372572 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 21 Nov 2023 22:48:52 +0300 Subject: [PATCH 050/144] CameraActivity refactoring --- client/android/AndroidManifest.xml | 3 + client/android/build.gradle.kts | 8 +- client/android/gradle/libs.versions.toml | 8 +- client/android/res/layout/activity_camera.xml | 14 -- client/android/res/layout/camera_preview.xml | 11 + .../src/org/amnezia/vpn/AmneziaActivity.kt | 10 +- .../src/org/amnezia/vpn/AmneziaApplication.kt | 24 +- .../src/org/amnezia/vpn/CameraActivity.kt | 236 ++++++++---------- .../org/amnezia/vpn/qt/QtAndroidController.kt | 2 + .../platforms/android/android_controller.cpp | 18 ++ client/platforms/android/android_controller.h | 1 + client/ui/controllers/importController.cpp | 58 ++--- client/ui/controllers/importController.h | 12 +- 13 files changed, 187 insertions(+), 218 deletions(-) delete mode 100644 client/android/res/layout/activity_camera.xml create mode 100644 client/android/res/layout/camera_preview.xml diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 34b5afd8a..18e31f436 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -63,6 +63,9 @@ - - - - - \ No newline at end of file diff --git a/client/android/res/layout/camera_preview.xml b/client/android/res/layout/camera_preview.xml new file mode 100644 index 000000000..003abbb6e --- /dev/null +++ b/client/android/res/layout/camera_preview.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index c65f4bee4..f484b44b4 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -9,18 +9,12 @@ import org.qtproject.qt.android.bindings.QtActivity private const val TAG = "AmneziaActivity" -private const val CAMERA_ACTION_CODE = 101 private const val CREATE_FILE_ACTION_CODE = 102 class AmneziaActivity : QtActivity() { private var tmpFileContentToSave: String = "" - private fun startQrCodeActivity() { - val intent = Intent(this, CameraActivity::class.java) - startActivityForResult(intent, CAMERA_ACTION_CODE) - } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == CREATE_FILE_ACTION_CODE && resultCode == RESULT_OK) { data?.data?.also { uri -> @@ -97,6 +91,8 @@ class AmneziaActivity : QtActivity() { @Suppress("unused") fun startQrCodeReader() { Log.v(TAG, "Start camera") - startQrCodeActivity() + Intent(this, CameraActivity::class.java).also { + startActivity(it) + } } } diff --git a/client/android/src/org/amnezia/vpn/AmneziaApplication.kt b/client/android/src/org/amnezia/vpn/AmneziaApplication.kt index e41b27c40..df8b02ae5 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaApplication.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaApplication.kt @@ -1,22 +1,16 @@ package org.amnezia.vpn -import android.content.res.Configuration -// import org.amnezia.vpn.shadowsocks.core.Core -// import org.amnezia.vpn.shadowsocks.core.VpnManager -import org.qtproject.qt.android.bindings.QtActivity +import androidx.camera.camera2.Camera2Config +import androidx.camera.core.CameraSelector +import androidx.camera.core.CameraXConfig import org.qtproject.qt.android.bindings.QtApplication -import android.app.Application -class AmneziaApplication: org.qtproject.qt.android.bindings.QtApplication() { +class AmneziaApplication : QtApplication(), CameraXConfig.Provider { - override fun onCreate() { - super.onCreate() - /* Core.init(this, QtActivity::class) - VpnManager.getInstance().init(this) */ - } + override fun getCameraXConfig(): CameraXConfig = CameraXConfig.Builder + .fromConfig(Camera2Config.defaultConfig()) + .setMinimumLoggingLevel(android.util.Log.ERROR) + .setAvailableCamerasLimiter(CameraSelector.DEFAULT_BACK_CAMERA) + .build() - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - // Core.updateNotificationChannels() - } } diff --git a/client/android/src/org/amnezia/vpn/CameraActivity.kt b/client/android/src/org/amnezia/vpn/CameraActivity.kt index 3eaec6b48..16f847d37 100644 --- a/client/android/src/org/amnezia/vpn/CameraActivity.kt +++ b/client/android/src/org/amnezia/vpn/CameraActivity.kt @@ -4,167 +4,151 @@ import android.Manifest import android.annotation.SuppressLint import android.content.pm.PackageManager import android.os.Bundle -import android.util.Log -import android.view.MotionEvent -import android.view.View +import android.view.MotionEvent.ACTION_DOWN +import android.view.MotionEvent.ACTION_UP import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.camera.core.* +import androidx.activity.ComponentActivity +import androidx.activity.result.contract.ActivityResultContracts.RequestPermission +import androidx.camera.core.CameraSelector +import androidx.camera.core.ExperimentalGetImage +import androidx.camera.core.FocusMeteringAction +import androidx.camera.core.FocusMeteringAction.FLAG_AE +import androidx.camera.core.FocusMeteringAction.FLAG_AF +import androidx.camera.core.ImageAnalysis +import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider -import androidx.camera.view.PreviewView import androidx.core.content.ContextCompat -import com.google.mlkit.vision.barcode.BarcodeScannerOptions +import com.google.mlkit.vision.barcode.BarcodeScannerOptions.Builder import com.google.mlkit.vision.barcode.BarcodeScanning +import com.google.mlkit.vision.barcode.ZoomSuggestionOptions import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.common.InputImage -import org.amnezia.vpn.R -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors +import org.amnezia.vpn.databinding.CameraPreviewBinding +import org.amnezia.vpn.qt.QtAndroidController +private const val TAG = "CameraActivity" -class CameraActivity : AppCompatActivity() { +class CameraActivity : ComponentActivity() { - private val CAMERA_REQUEST = 100 - - private lateinit var cameraExecutor: ExecutorService - private lateinit var analyzerExecutor: ExecutorService - - private lateinit var viewFinder: PreviewView - - companion object { - private lateinit var instance: CameraActivity - - @JvmStatic fun getInstance(): CameraActivity { - return instance - } - - @JvmStatic fun stopQrCodeReader() { - CameraActivity.getInstance().finish() - } - } - - external fun passDataToDecoder(data: String) + private lateinit var viewBinding: CameraPreviewBinding + private lateinit var cameraProvider: ProcessCameraProvider + @ExperimentalGetImage override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_camera) - - viewFinder = findViewById(R.id.viewFinder) + viewBinding = CameraPreviewBinding.inflate(layoutInflater) + setContentView(viewBinding.root) - cameraExecutor = Executors.newSingleThreadExecutor() - analyzerExecutor = Executors.newSingleThreadExecutor() - - instance = this - - checkPermissions() - - configureVideoPreview() - } - - private fun checkPermissions() { - if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { - requestPermissions(arrayOf(Manifest.permission.CAMERA), CAMERA_REQUEST) - } + checkPermissions(onSuccess = ::startCamera, onFail = ::finish) } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == CAMERA_REQUEST) { - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Toast.makeText(this, "CameraX permission granted", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(this, "CameraX permission denied", Toast.LENGTH_SHORT).show(); - } + private fun checkPermissions(onSuccess: () -> Unit, onFail: () -> Unit) { + if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { + onSuccess() + } else { + val requestPermissionLauncher = + registerForActivityResult(RequestPermission()) { isGranted -> + if (isGranted) { + Toast.makeText(this, "Camera permission granted", Toast.LENGTH_SHORT).show() + onSuccess() + } else { + Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show() + onFail() + } + } + requestPermissionLauncher.launch(Manifest.permission.CAMERA) } } - @SuppressLint("UnsafeOptInUsageError", "ClickableViewAccessibility") - private fun configureVideoPreview() { + @ExperimentalGetImage + private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this) - val imageCapture = ImageCapture.Builder().build() cameraProviderFuture.addListener({ - val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() - - val preview = Preview.Builder().build() - - val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA - - val imageAnalyzer = BarCodeAnalyzer() - - val analysisUseCase = ImageAnalysis.Builder() - .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) - .build() - - analysisUseCase.setAnalyzer(analyzerExecutor, imageAnalyzer) - - try { - preview.setSurfaceProvider(viewFinder.surfaceProvider) - cameraProvider.unbindAll() - val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture, analysisUseCase) - viewFinder.setOnTouchListener(View.OnTouchListener { view: View, motionEvent: MotionEvent -> - when (motionEvent.action) { - MotionEvent.ACTION_DOWN -> return@OnTouchListener true - MotionEvent.ACTION_UP -> { - val factory = viewFinder.meteringPointFactory - val point = factory.createPoint(motionEvent.x, motionEvent.y) - val action = FocusMeteringAction.Builder(point).build() - camera.cameraControl.startFocusAndMetering(action) - return@OnTouchListener true - } - else -> return@OnTouchListener false - } - }) - } catch(exc: Exception) { - Log.e("WUTT", "Use case binding failed", exc) - } + cameraProvider = cameraProviderFuture.get() + bindPreview() + bindImageAnalysis() }, ContextCompat.getMainExecutor(this)) } - override fun onDestroy() { - cameraExecutor.shutdown() - analyzerExecutor.shutdown() - - super.onDestroy() - } - - val barcodesSet = mutableSetOf() + @SuppressLint("ClickableViewAccessibility") + private fun bindPreview() { + val viewFinder = viewBinding.viewFinder + val preview = Preview.Builder().build().also { + it.setSurfaceProvider(viewFinder.surfaceProvider) + } - private inner class BarCodeAnalyzer(): ImageAnalysis.Analyzer { + val camera = cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, preview) - private val options = BarcodeScannerOptions.Builder() - .setBarcodeFormats(Barcode.FORMAT_QR_CODE) - .build() + viewFinder.setOnTouchListener { _, motionEvent -> + when (motionEvent.action) { + ACTION_DOWN -> true + ACTION_UP -> { + val point = viewFinder + .meteringPointFactory.createPoint(motionEvent.x, motionEvent.x) - private val scanner = BarcodeScanning.getClient(options) + val action = FocusMeteringAction + .Builder(point, FLAG_AF or FLAG_AE).build() - @SuppressLint("UnsafeOptInUsageError") - override fun analyze(imageProxy: ImageProxy) { - val mediaImage = imageProxy.image + camera.cameraControl.startFocusAndMetering(action) + true + } - if (mediaImage != null) { - val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees) + else -> false + } + } + } - scanner.process(image) - .addOnSuccessListener { barcodes -> - if (barcodes.isNotEmpty()) { - val barcode = barcodes[0] - if (barcode != null) { - val str = barcode?.displayValue ?: "" - if (str.isNotEmpty()) { - val isAdded = barcodesSet.add(str) - if (isAdded) { - passDataToDecoder(str) + @ExperimentalGetImage + private fun bindImageAnalysis() { + val imageAnalysis = ImageAnalysis.Builder().build() + + val camera = cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, imageAnalysis) + + val barcodeScanner = BarcodeScanning.getClient( + Builder() + .setBarcodeFormats(Barcode.FORMAT_QR_CODE) + .setZoomSuggestionOptions( + ZoomSuggestionOptions.Builder { zoomLevel -> + camera.cameraControl.setZoomRatio(zoomLevel) + true + }.apply { + camera.cameraInfo.zoomState.value?.maxZoomRatio?.let { maxZoomRation -> + setMaxSupportedZoomRatio(maxZoomRation) + } + }.build() + ).build() + ) + + // optimization + val checkedBarcodes = hashSetOf() + + imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this)) { imageProxy -> + imageProxy.image?.let { InputImage.fromMediaImage(it, imageProxy.imageInfo.rotationDegrees) } + ?.let { image -> + barcodeScanner.process(image).addOnSuccessListener { barcodes -> + barcodes.firstOrNull()?.let { barcode -> + barcode.displayValue?.let { code -> + if (code.isNotEmpty() && code !in checkedBarcodes) { + if (QtAndroidController.decodeQrCode(code)) { + barcodeScanner.close() + stopCamera() } + checkedBarcodes.add(code) } } } + }.addOnFailureListener { + Log.e(TAG, "Processing QR-code image failed: ${it.message}") + }.addOnCompleteListener { imageProxy.close() } - .addOnFailureListener { - imageProxy.close() - } - } + } } } -} \ No newline at end of file + + private fun stopCamera() { + cameraProvider.unbindAll() + finish() + } +} diff --git a/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt b/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt index ce509281c..0f3c7b1f7 100644 --- a/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt +++ b/client/android/src/org/amnezia/vpn/qt/QtAndroidController.kt @@ -15,4 +15,6 @@ object QtAndroidController { external fun onStatisticsUpdate(rxBytes: Long, txBytes: Long) external fun onConfigImported() + + external fun decodeQrCode(data: String): Boolean } \ No newline at end of file diff --git a/client/platforms/android/android_controller.cpp b/client/platforms/android/android_controller.cpp index 5bf0be581..c9888b4cd 100644 --- a/client/platforms/android/android_controller.cpp +++ b/client/platforms/android/android_controller.cpp @@ -3,6 +3,7 @@ #include #include "android_controller.h" +#include "ui/controllers/importController.h" namespace { @@ -101,6 +102,7 @@ bool AndroidController::initialize() {"onVpnDisconnected", "()V", reinterpret_cast(onVpnDisconnected)}, {"onStatisticsUpdate", "(JJ)V", reinterpret_cast(onStatisticsUpdate)}, {"onConfigImported", "()V", reinterpret_cast(onConfigImported)}, + {"decodeQrCode", "(Ljava/lang/String;)Z", reinterpret_cast(decodeQrCode)} }; QJniEnvironment env; @@ -240,6 +242,7 @@ void AndroidController::onStatisticsUpdate(JNIEnv *env, jobject thiz, jlong rxBy emit AndroidController::instance()->statisticsUpdated((quint64) rxBytes, (quint64) txBytes); } +// static void AndroidController::onConfigImported(JNIEnv *env, jobject thiz) { Q_UNUSED(env); @@ -247,3 +250,18 @@ void AndroidController::onConfigImported(JNIEnv *env, jobject thiz) emit AndroidController::instance()->configImported(); } + +// static +bool AndroidController::decodeQrCode(JNIEnv *env, jobject thiz, jstring data) +{ + Q_UNUSED(thiz); + + const char *buffer = env->GetStringUTFChars(data, nullptr); + if (!buffer) { + return false; + } + + QString code(buffer); + env->ReleaseStringUTFChars(data, buffer); + return ImportController::decodeQrCode(code); +} diff --git a/client/platforms/android/android_controller.h b/client/platforms/android/android_controller.h index 92d1916dd..e30dcc680 100644 --- a/client/platforms/android/android_controller.h +++ b/client/platforms/android/android_controller.h @@ -50,6 +50,7 @@ class AndroidController : public QObject static void onVpnDisconnected(JNIEnv *env, jobject thiz); static void onStatisticsUpdate(JNIEnv *env, jobject thiz, jlong rxBytes, jlong txBytes); static void onConfigImported(JNIEnv *env, jobject thiz); + static bool decodeQrCode(JNIEnv *env, jobject thiz, jstring data); template static auto callActivityMethod(const char *methodName, const char *signature, diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index e128d1cf2..b9ee0b684 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -7,9 +7,7 @@ #include "core/errorstrings.h" #ifdef Q_OS_ANDROID - #include "../../platforms/android/android_controller.h" - #include "../../platforms/android/androidutils.h" - #include + #include "platforms/android/android_controller.h" #endif #ifdef Q_OS_IOS #include @@ -48,10 +46,6 @@ namespace #if defined Q_OS_ANDROID ImportController *mInstance = nullptr; #endif - -#ifdef Q_OS_ANDROID - constexpr auto AndroidCameraActivity = "org.amnezia.vpn.CameraActivity"; -#endif } // namespace ImportController::ImportController(const QSharedPointer &serversModel, @@ -61,18 +55,6 @@ ImportController::ImportController(const QSharedPointer &serversMo { #ifdef Q_OS_ANDROID mInstance = this; - - AndroidUtils::runOnAndroidThreadAsync([]() { - JNINativeMethod methods[] { - { "passDataToDecoder", "(Ljava/lang/String;)V", reinterpret_cast(onNewQrCodeDataChunk) }, - }; - - QJniObject javaClass(AndroidCameraActivity); - QJniEnvironment env; - jclass objectClass = env->GetObjectClass(javaClass.object()); - env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0])); - env->DeleteLocalRef(objectClass); - }); #endif } @@ -320,26 +302,20 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data) } #ifdef Q_OS_ANDROID -void ImportController::onNewQrCodeDataChunk(JNIEnv *env, jobject thiz, jstring data) -{ - Q_UNUSED(thiz); - const char *buffer = env->GetStringUTFChars(data, nullptr); - if (!buffer) { - return; - } +static QMutex qrDecodeMutex; - QString parcelBody(buffer); - env->ReleaseStringUTFChars(data, buffer); +// static +bool ImportController::decodeQrCode(const QString &code) +{ + QMutexLocker lock(&qrDecodeMutex); - if (mInstance != nullptr) { - if (!mInstance->m_isQrCodeProcessed) { - mInstance->m_qrCodeChunks.clear(); - mInstance->m_isQrCodeProcessed = true; - mInstance->m_totalQrCodeChunksCount = 0; - mInstance->m_receivedQrCodeChunksCount = 0; - } - mInstance->parseQrCodeChunk(parcelBody); + if (!mInstance->m_isQrCodeProcessed) { + mInstance->m_qrCodeChunks.clear(); + mInstance->m_isQrCodeProcessed = true; + mInstance->m_totalQrCodeChunksCount = 0; + mInstance->m_receivedQrCodeChunksCount = 0; } + return mInstance->parseQrCodeChunk(code); } #endif @@ -360,17 +336,14 @@ void ImportController::startDecodingQr() void ImportController::stopDecodingQr() { - #if defined Q_OS_ANDROID - QJniObject::callStaticMethod(AndroidCameraActivity, "stopQrCodeReader", "()V"); - #endif emit qrDecodingFinished(); } -void ImportController::parseQrCodeChunk(const QString &code) +bool ImportController::parseQrCodeChunk(const QString &code) { // qDebug() << code; if (!m_isQrCodeProcessed) - return; + return false; // check if chunk received QByteArray ba = QByteArray::fromBase64(code.toUtf8(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); @@ -404,6 +377,7 @@ void ImportController::parseQrCodeChunk(const QString &code) m_isQrCodeProcessed = false; qDebug() << "stopDecodingQr"; stopDecodingQr(); + return true; } else { qDebug() << "error while extracting data from qr"; m_qrCodeChunks.clear(); @@ -417,8 +391,10 @@ void ImportController::parseQrCodeChunk(const QString &code) m_isQrCodeProcessed = false; qDebug() << "stopDecodingQr"; stopDecodingQr(); + return true; } } + return false; } double ImportController::getQrCodeScanProgressBarValue() diff --git a/client/ui/controllers/importController.h b/client/ui/controllers/importController.h index 1f8f8bbb3..c1d0b2ab3 100644 --- a/client/ui/controllers/importController.h +++ b/client/ui/controllers/importController.h @@ -7,9 +7,6 @@ #include "core/defs.h" #include "ui/models/containers_model.h" #include "ui/models/servers_model.h" -#ifdef Q_OS_ANDROID - #include "jni.h" -#endif class ImportController : public QObject { @@ -30,12 +27,16 @@ public slots: #if defined Q_OS_ANDROID || defined Q_OS_IOS void startDecodingQr(); - void parseQrCodeChunk(const QString &code); + bool parseQrCodeChunk(const QString &code); double getQrCodeScanProgressBarValue(); QString getQrCodeScanProgressString(); #endif +#if defined Q_OS_ANDROID + static bool decodeQrCode(const QString &code); +#endif + signals: void importFinished(); void importErrorOccurred(const QString &errorMessage); @@ -50,9 +51,6 @@ public slots: #if defined Q_OS_ANDROID || defined Q_OS_IOS void stopDecodingQr(); #endif -#if defined Q_OS_ANDROID - static void onNewQrCodeDataChunk(JNIEnv *env, jobject thiz, jstring data); -#endif QSharedPointer m_serversModel; QSharedPointer m_containersModel; From d38c7ce6a5b9c727a67e7129ea64d90e422a09de Mon Sep 17 00:00:00 2001 From: pokamest Date: Wed, 22 Nov 2023 13:57:05 +0000 Subject: [PATCH 051/144] Error codes cleanup --- client/core/defs.h | 2 -- client/core/errorstrings.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/client/core/defs.h b/client/core/defs.h index 9547dd928..7de552869 100644 --- a/client/core/defs.h +++ b/client/core/defs.h @@ -47,7 +47,6 @@ enum ErrorCode SshSftpNoMediaError, // Local errors - FailedToSaveConfigData, OpenVpnConfigMissing, OpenVpnManagementServerError, ConfigMissing, @@ -67,7 +66,6 @@ enum ErrorCode // 3rd party utils errors OpenSslFailed, - OpenVpnExecutableCrashed, ShadowSocksExecutableCrashed, CloakExecutableCrashed, diff --git a/client/core/errorstrings.cpp b/client/core/errorstrings.cpp index b17a5a9e2..2a34576da 100644 --- a/client/core/errorstrings.cpp +++ b/client/core/errorstrings.cpp @@ -42,7 +42,6 @@ QString errorString(ErrorCode code){ case(SshSftpNoMediaError): return QObject::tr("Sftp error: No media was in remote drive"); // Local errors - case (FailedToSaveConfigData): return QObject::tr("Failed to save config to disk"); case (OpenVpnConfigMissing): return QObject::tr("OpenVPN config missing"); case (OpenVpnManagementServerError): return QObject::tr("OpenVPN management server error"); From e8ceeb6e20a022133f5e7e561b2a01a79327697b Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 23 Nov 2023 00:03:43 +0700 Subject: [PATCH 052/144] added full access sharing --- client/resources.qrc | 1 + client/ui/controllers/pageController.h | 4 +- client/ui/models/clientManagementModel.cpp | 244 +++++++++++-------- client/ui/models/clientManagementModel.h | 7 +- client/ui/qml/Pages2/PageShare.qml | 94 ++++--- client/ui/qml/Pages2/PageShareFullAccess.qml | 155 ++++++++++++ 6 files changed, 371 insertions(+), 134 deletions(-) create mode 100644 client/ui/qml/Pages2/PageShareFullAccess.qml diff --git a/client/resources.qrc b/client/resources.qrc index 4c63383c9..1baf993b5 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -222,5 +222,6 @@ server_scripts/awg/configure_container.sh server_scripts/awg/run_container.sh server_scripts/awg/Dockerfile + ui/qml/Pages2/PageShareFullAccess.qml diff --git a/client/ui/controllers/pageController.h b/client/ui/controllers/pageController.h index 20c3bbed1..f7e697fb6 100644 --- a/client/ui/controllers/pageController.h +++ b/client/ui/controllers/pageController.h @@ -51,7 +51,9 @@ namespace PageLoader PageProtocolWireGuardSettings, PageProtocolAwgSettings, PageProtocolIKev2Settings, - PageProtocolRaw + PageProtocolRaw, + + PageShareFullAccess }; Q_ENUM_NS(PageEnum) diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index c4c4fb7aa..f53794d5b 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -4,6 +4,19 @@ #include #include "core/servercontroller.h" +#include "logger.h" + +namespace +{ + Logger logger("ClientManagementModel"); + + namespace configKey { + constexpr char clientId[] = "clientId"; + constexpr char clientName[] = "clientName"; + constexpr char container[] = "container"; + constexpr char userData[] = "userData"; + } +} ClientManagementModel::ClientManagementModel(std::shared_ptr settings, QObject *parent) : m_settings(settings), QAbstractListModel(parent) @@ -23,13 +36,13 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const } auto client = m_clientsTable.at(index.row()).toObject(); - auto userData = client.value("userData").toObject(); + auto userData = client.value(configKey::userData).toObject(); switch (role) { - case UserNameRole: return userData.value("clientName").toString(); + case ClientNameRole: return userData.value(configKey::clientName).toString(); case ContainerNameRole: return ContainerProps::containerHumanNames().value( - static_cast(userData.value("container").toInt())); + static_cast(userData.value(configKey::container).toInt())); } return QVariant(); @@ -40,17 +53,13 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr ServerController serverController(m_settings); ErrorCode error = ErrorCode::NoError; - QString stdOut; - auto cbReadStdOut = [&](const QString &data, libssh::Client &) { - stdOut += data + "\n"; - return ErrorCode::NoError; - }; const QString clientsTableFile = QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); const QByteArray clientsTableString = serverController.getTextFileFromContainer(container, credentials, clientsTableFile, &error); if (error != ErrorCode::NoError) { + logger.error() << "Failed to get the clientsTable file from the server"; return error; } @@ -62,79 +71,108 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - const QString getOpenVpnClientsList = - "sudo docker exec -i $CONTAINER_NAME bash -c 'ls /opt/amnezia/openvpn/pki/issued'"; - QString script = serverController.replaceVars(getOpenVpnClientsList, - serverController.genVarsForScript(credentials, container)); - error = serverController.runScript(credentials, script, cbReadStdOut); + error = getOpenVpnClients(serverController, container, credentials, count); + } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { + error = getWireGuardClients(serverController, container, credentials, count); + } + if (error != ErrorCode::NoError) { + return error; + } + + const QByteArray newClientsTableString = QJsonDocument(m_clientsTable).toJson(); + if (clientsTableString != newClientsTableString) { + error = serverController.uploadTextFileToContainer(container, credentials, newClientsTableString, + clientsTableFile); if (error != ErrorCode::NoError) { - return error; + logger.error() << "Failed to upload the clientsTable file to the server"; } + } + } - if (!stdOut.isEmpty()) { - QStringList certsIds = stdOut.split("\n", Qt::SkipEmptyParts); - certsIds.removeAll("AmneziaReq.crt"); - - for (auto &openvpnCertId : certsIds) { - openvpnCertId.replace(".crt", ""); - if (!isClientExists(openvpnCertId)) { - QJsonObject client; - client["userId"] = openvpnCertId; - - QJsonObject userData; - userData["clientName"] = QString("Client %1").arg(count); - userData["container"] = container; - client["userData"] = userData; + endResetModel(); + return error; +} - m_clientsTable.push_back(client); +ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count) +{ + ErrorCode error = ErrorCode::NoError; + QString stdOut; + auto cbReadStdOut = [&](const QString &data, libssh::Client &) { + stdOut += data + "\n"; + return ErrorCode::NoError; + }; - count++; - } - } - } - } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - const QString wireGuardConfigFile = - QString("opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); - const QString wireguardConfigString = - serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); - if (error != ErrorCode::NoError) { - return error; - } + const QString getOpenVpnClientsList = + "sudo docker exec -i $CONTAINER_NAME bash -c 'ls /opt/amnezia/openvpn/pki/issued'"; + QString script = serverController.replaceVars(getOpenVpnClientsList, + serverController.genVarsForScript(credentials, container)); + error = serverController.runScript(credentials, script, cbReadStdOut); + if (error != ErrorCode::NoError) { + logger.error() << "Failed to retrieve the list of issued certificates on the server"; + return error; + } - auto configLines = wireguardConfigString.split("\n", Qt::SkipEmptyParts); - QStringList wireguardKeys; - for (const auto &line : configLines) { - auto configPair = line.split(" = ", Qt::SkipEmptyParts); - if (configPair.front() == "PublicKey") { - wireguardKeys.push_back(configPair.back()); - } - } + if (!stdOut.isEmpty()) { + QStringList certsIds = stdOut.split("\n", Qt::SkipEmptyParts); + certsIds.removeAll("AmneziaReq.crt"); - for (auto &wireguardKey : wireguardKeys) { - if (!isClientExists(wireguardKey)) { - QJsonObject client; - client["userId"] = wireguardKey; + for (auto &openvpnCertId : certsIds) { + openvpnCertId.replace(".crt", ""); + if (!isClientExists(openvpnCertId)) { + QJsonObject client; + client[configKey::clientId] = openvpnCertId; - QJsonObject userData; - userData["clientName"] = QString("Client %1").arg(count); - userData["container"] = container; - client["userData"] = userData; + QJsonObject userData; + userData[configKey::clientName] = QString("Client %1").arg(count); + userData[configKey::container] = container; + client[configKey::userData] = userData; - m_clientsTable.push_back(client); + m_clientsTable.push_back(client); - count++; - } + count++; } } + } + return error; +} - const QByteArray newClientsTableString = QJsonDocument(m_clientsTable).toJson(); - if (clientsTableString != newClientsTableString) { - error = serverController.uploadTextFileToContainer(container, credentials, newClientsTableString, - clientsTableFile); +ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count) +{ + ErrorCode error = ErrorCode::NoError; + + const QString wireGuardConfigFile = + QString("opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); + const QString wireguardConfigString = + serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); + if (error != ErrorCode::NoError) { + logger.error() << "Failed to get the wg conf file from the server"; + return error; + } + + auto configLines = wireguardConfigString.split("\n", Qt::SkipEmptyParts); + QStringList wireguardKeys; + for (const auto &line : configLines) { + auto configPair = line.split(" = ", Qt::SkipEmptyParts); + if (configPair.front() == "PublicKey") { + wireguardKeys.push_back(configPair.back()); } } - endResetModel(); + for (auto &wireguardKey : wireguardKeys) { + if (!isClientExists(wireguardKey)) { + QJsonObject client; + client[configKey::clientId] = wireguardKey; + + QJsonObject userData; + userData[configKey::clientName] = QString("Client %1").arg(count); + userData[configKey::container] = container; + client[configKey::userData] = userData; + + m_clientsTable.push_back(client); + + count++; + } + } return error; } @@ -143,7 +181,7 @@ bool ClientManagementModel::isClientExists(const QString &clientId) for (const QJsonValue &value : qAsConst(m_clientsTable)) { if (value.isObject()) { QJsonObject obj = value.toObject(); - if (obj.contains("userId") && obj["userId"].toString() == clientId) { + if (obj.contains(configKey::clientId) && obj[configKey::clientId].toString() == clientId) { return true; } } @@ -155,39 +193,38 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt const DockerContainer container, ServerCredentials credentials) { ErrorCode error; - if (m_clientsTable.empty()) { - error = updateModel(container, credentials); - if (error != ErrorCode::NoError) { - return error; - } - for (int i = 0; i < m_clientsTable.size(); i++) { - if (m_clientsTable.at(i).toObject().value("userId") == (clientId)) { - error = renameClient(i, clientName, container, credentials); - if (error != ErrorCode::NoError) { - return error; - } - } + error = updateModel(container, credentials); + if (error != ErrorCode::NoError) { + return error; + } + + for (int i = 0; i < m_clientsTable.size(); i++) { + if (m_clientsTable.at(i).toObject().value(configKey::clientId) == clientId) { + return renameClient(i, clientName, container, credentials); } - } else { - beginResetModel(); - QJsonObject client; - client["userId"] = clientId; + } - QJsonObject userData; - userData["clientName"] = clientName; - userData["container"] = container; - client["userData"] = userData; - m_clientsTable.push_back(client); - endResetModel(); + beginResetModel(); + QJsonObject client; + client[configKey::clientId] = clientId; + + QJsonObject userData; + userData[configKey::clientName] = clientName; + userData[configKey::container] = container; + client[configKey::userData] = userData; + m_clientsTable.push_back(client); + endResetModel(); - const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); + const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); - ServerController serverController(m_settings); - const QString clientsTableFile = - QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + ServerController serverController(m_settings); + const QString clientsTableFile = + QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); - error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + if (error != ErrorCode::NoError) { + logger.error() << "Failed to upload the clientsTable file to the server"; } return error; @@ -197,9 +234,9 @@ ErrorCode ClientManagementModel::renameClient(const int row, const QString &clie ServerCredentials credentials) { auto client = m_clientsTable.at(row).toObject(); - auto userData = client["userData"].toObject(); - userData["clientName"] = clientName; - client["userData"] = userData; + auto userData = client[configKey::userData].toObject(); + userData[configKey::clientName] = clientName; + client[configKey::userData] = userData; m_clientsTable.replace(row, client); emit dataChanged(index(row, 0), index(row, 0)); @@ -212,6 +249,9 @@ ErrorCode ClientManagementModel::renameClient(const int row, const QString &clie ErrorCode error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + if (error != ErrorCode::NoError) { + logger.error() << "Failed to upload the clientsTable file to the server"; + } return error; } @@ -232,7 +272,7 @@ ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContai ServerCredentials credentials) { auto client = m_clientsTable.at(row).toObject(); - QString clientId = client.value("userId").toString(); + QString clientId = client.value(configKey::clientId).toString(); const QString getOpenVpnCertData = QString("sudo docker exec -i $CONTAINER_NAME bash -c '" "cd /opt/amnezia/openvpn ;\\" @@ -246,6 +286,7 @@ ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContai serverController.replaceVars(getOpenVpnCertData, serverController.genVarsForScript(credentials, container)); ErrorCode error = serverController.runScript(credentials, script); if (error != ErrorCode::NoError) { + logger.error() << "Failed to revoke the certificate"; return error; } @@ -259,6 +300,7 @@ ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContai QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { + logger.error() << "Failed to upload the clientsTable file to the server"; return error; } @@ -276,11 +318,12 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont const QString wireguardConfigString = serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); if (error != ErrorCode::NoError) { + logger.error() << "Failed to get the wg conf file from the server"; return error; } auto client = m_clientsTable.at(row).toObject(); - QString clientId = client.value("userId").toString(); + QString clientId = client.value(configKey::clientId).toString(); auto configSections = wireguardConfigString.split("[", Qt::SkipEmptyParts); for (auto §ion : configSections) { @@ -293,6 +336,7 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont newWireGuardConfig.insert(0, "["); error = serverController.uploadTextFileToContainer(container, credentials, newWireGuardConfig, wireGuardConfigFile); if (error != ErrorCode::NoError) { + logger.error() << "Failed to upload the wg conf file to the server"; return error; } @@ -306,6 +350,7 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { + logger.error() << "Failed to upload the clientsTable file to the server"; return error; } @@ -315,6 +360,7 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont serverController.replaceVars(script.arg(wireGuardConfigFile), serverController.genVarsForScript(credentials, container))); if (error != ErrorCode::NoError) { + logger.error() << "Failed to execute the command 'wg syncconf' on the server"; return error; } @@ -324,7 +370,7 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont QHash ClientManagementModel::roleNames() const { QHash roles; - roles[UserNameRole] = "userName"; + roles[ClientNameRole] = "clientName"; roles[ContainerNameRole] = "containerName"; return roles; } diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index c51ce8161..25089b66e 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -4,7 +4,7 @@ #include #include -#include "protocols/protocols_defs.h" +#include "core/servercontroller.h" #include "settings.h" class ClientManagementModel : public QAbstractListModel @@ -29,7 +29,7 @@ class ClientManagementModel : public QAbstractListModel public: enum Roles { - UserNameRole = Qt::UserRole + 1, + ClientNameRole = Qt::UserRole + 1, ContainerNameRole, }; @@ -55,6 +55,9 @@ public slots: ErrorCode revokeOpenVpn(const int row, const DockerContainer container, ServerCredentials credentials); ErrorCode revokeWireGuard(const int row, const DockerContainer container, ServerCredentials credentials); + ErrorCode getOpenVpnClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count); + ErrorCode getWireGuardClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count); + QJsonArray m_clientsTable; std::shared_ptr m_settings; diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 018137039..cb847583b 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -18,7 +18,6 @@ PageType { enum ConfigType { AmneziaConnection, - AmneziaFullAccess, OpenVpn, WireGuard } @@ -46,24 +45,16 @@ PageType { PageController.showBusyIndicator(true) switch (type) { - case PageShare.ConfigType.AmneziaConnection: ExportController.generateConnectionConfig(userNameTextField.textFieldText); break; - case PageShare.ConfigType.AmneziaFullAccess: { - if (Qt.platform.os === "android") { - ExportController.generateFullAccessConfigAndroid(); - } else { - ExportController.generateFullAccessConfig(); - } - break; - } + case PageShare.ConfigType.AmneziaConnection: ExportController.generateConnectionConfig(clientNameTextField.textFieldText); break; case PageShare.ConfigType.OpenVpn: { - ExportController.generateOpenVpnConfig(userNameTextField.textFieldText) + ExportController.generateOpenVpnConfig(clientNameTextField.textFieldText) shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") shareConnectionDrawer.configExtension = ".ovpn" shareConnectionDrawer.configFileName = "amnezia_for_openvpn" break; } case PageShare.ConfigType.WireGuard: { - ExportController.generateWireGuardConfig(userNameTextField.textFieldText) + ExportController.generateWireGuardConfig(clientNameTextField.textFieldText) shareConnectionDrawer.configCaption = qsTr("Save WireGuard config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_wireguard" @@ -129,6 +120,51 @@ PageType { Layout.topMargin: 24 headerText: qsTr("Share VPN Access") + + actionButtonImage: "qrc:/images/controls/more-vertical.svg" + actionButtonFunction: function() { + shareFullAccessDrawer.open() + } + + DrawerType { + id: shareFullAccessDrawer + + width: root.width + height: root.height * 0.45 + + + ColumnLayout { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 16 + + spacing: 0 + + Header2Type { + Layout.fillWidth: true + Layout.bottomMargin: 16 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + headerText: qsTr("Share full access to the server and VPN") + descriptionText: qsTr("Use for your own devices, or share with those you trust to manage the server.") + } + + + LabelWithButtonType { + Layout.fillWidth: true + + text: qsTr("Share") + rightImageSource: "qrc:/images/controls/chevron-right.svg" + + clickedFunction: function() { + PageController.goToPage(PageEnum.PageShareFullAccess) + shareFullAccessDrawer.close() + } + } + } + } } Rectangle { @@ -189,7 +225,7 @@ PageType { } TextFieldWithHeaderType { - id: userNameTextField + id: clientNameTextField Layout.fillWidth: true Layout.topMargin: 16 @@ -242,11 +278,6 @@ PageType { serverSelector.severSelectorIndexChanged() } - //full access label -// if (accessTypeSelector.currentIndex !== 0) { -// shareConnectionDrawer.headerText = qsTr("Accessing ") + serverSelector.text -// shareConnectionDrawer.configContentHeaderText = qsTr("File with accessing settings to ") + serverSelector.text -// } serverSelector.menuVisible = false } @@ -419,7 +450,7 @@ PageType { } ListView { - id: usersListView + id: clientsListView Layout.fillWidth: true Layout.preferredHeight: childrenRect.height @@ -431,7 +462,7 @@ PageType { interactive: false delegate: Item { - implicitWidth: usersListView.width + implicitWidth: clientsListView.width implicitHeight: delegateContent.implicitHeight ColumnLayout { @@ -447,19 +478,19 @@ PageType { LabelWithButtonType { Layout.fillWidth: true - text: userName + text: clientName descriptionText: containerName rightImageSource: "qrc:/images/controls/chevron-right.svg" clickedFunction: function() { - userInfoDrower.open() + clientInfoDrawer.open() } } DividerType {} DrawerType { - id: userInfoDrower + id: clientInfoDrawer width: root.width height: root.height * 0.45 @@ -478,7 +509,7 @@ PageType { Layout.fillWidth: true Layout.bottomMargin: 24 - headerText: userName + headerText: clientName descriptionText: serverSelector.text + ", " + containerName } @@ -507,7 +538,7 @@ PageType { onVisibleChanged: { if (clientNameEditDrawer.visible) { - clientName.textField.forceActiveFocus() + clientNameEditor.textField.forceActiveFocus() } } @@ -520,11 +551,10 @@ PageType { anchors.rightMargin: 16 TextFieldWithHeaderType { - id: clientName - + id: clientNameEditor Layout.fillWidth: true headerText: qsTr("Client name") - textFieldText: userName + textFieldText: clientName } BasicButtonType { @@ -533,10 +563,10 @@ PageType { text: qsTr("Save") onClicked: { - if (clientName.textFieldText !== userName) { + if (clientNameEditor.textFieldText !== clientName) { PageController.showBusyIndicator(true) ExportController.renameClient(index, - clientName.textFieldText, + clientNameEditor.textFieldText, ContainersModel.getCurrentlyProcessedContainerIndex(), ServersModel.getCurrentlyProcessedServerCredentials()) PageController.showBusyIndicator(false) @@ -561,14 +591,14 @@ PageType { text: qsTr("Revoke") onClicked: function() { - questionDrawer.headerText = qsTr("Revoke the config for a user - ") + userName + "?" + questionDrawer.headerText = qsTr("Revoke the config for a user - ") + clientName + "?" questionDrawer.descriptionText = qsTr("The user will no longer be able to connect to your server.") questionDrawer.yesButtonText = qsTr("Continue") questionDrawer.noButtonText = qsTr("Cancel") questionDrawer.yesButtonFunction = function() { questionDrawer.close() - userInfoDrower.close() + clientInfoDrawer.close() root.revokeConfig(index) } questionDrawer.noButtonFunction = function() { diff --git a/client/ui/qml/Pages2/PageShareFullAccess.qml b/client/ui/qml/Pages2/PageShareFullAccess.qml new file mode 100644 index 000000000..e59c57ef5 --- /dev/null +++ b/client/ui/qml/Pages2/PageShareFullAccess.qml @@ -0,0 +1,155 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Dialogs + +import SortFilterProxyModel 0.2 + +import PageEnum 1.0 +import ContainerProps 1.0 + +import "./" +import "../Controls2" +import "../Controls2/TextTypes" +import "../Components" + +PageType { + id: root + + BackButtonType { + id: backButton + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 20 + } + + FlickableType { + anchors.top: backButton.bottom + anchors.bottom: parent.bottom + contentHeight: content.height + + ColumnLayout { + id: content + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + anchors.rightMargin: 16 + anchors.leftMargin: 16 + + spacing: 0 + + HeaderType { + Layout.fillWidth: true + Layout.topMargin: 24 + + headerText: qsTr("Full access to the server and VPN") + } + + ParagraphTextType { + Layout.fillWidth: true + Layout.topMargin: 24 + Layout.bottomMargin: 24 + + text: qsTr("We recommend that you use full access to the server only for your own additional devices.\n") + + qsTr("If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. ") + color: "#878B91" + } + + DropDownType { + id: serverSelector + + signal severSelectorIndexChanged + property int currentIndex: 0 + + Layout.fillWidth: true + Layout.topMargin: 16 + + drawerHeight: 0.4375 + + descriptionText: qsTr("Server") + headerText: qsTr("Server") + + listView: ListViewWithRadioButtonType { + id: serverSelectorListView + + rootWidth: root.width + imageSource: "qrc:/images/controls/check.svg" + + model: SortFilterProxyModel { + id: proxyServersModel + sourceModel: ServersModel + filters: [ + ValueFilter { + roleName: "hasWriteAccess" + value: true + } + ] + } + + currentIndex: 0 + + clickedFunction: function() { + handler() + + if (serverSelector.currentIndex !== serverSelectorListView.currentIndex) { + serverSelector.currentIndex = serverSelectorListView.currentIndex + } + + shareConnectionDrawer.headerText = qsTr("Accessing ") + serverSelector.text + shareConnectionDrawer.configContentHeaderText = qsTr("File with accessing settings to ") + serverSelector.text + serverSelector.menuVisible = false + } + + Component.onCompleted: { + handler() + } + + function handler() { + serverSelector.text = selectedText + ServersModel.currentlyProcessedIndex = proxyServersModel.mapToSource(currentIndex) + } + } + } + + BasicButtonType { + Layout.fillWidth: true + Layout.topMargin: 40 + + text: qsTr("Share") + imageSource: "qrc:/images/controls/share-2.svg" + + onClicked: function() { + shareConnectionDrawer.headerText = qsTr("Connection to ") + serverSelector.text + shareConnectionDrawer.configContentHeaderText = qsTr("File with connection settings to ") + serverSelector.text + + shareConnectionDrawer.needCloseButton = false + + shareConnectionDrawer.open() + shareConnectionDrawer.contentVisible = false + PageController.showBusyIndicator(true) + + if (Qt.platform.os === "android") { + ExportController.generateFullAccessConfigAndroid(); + } else { + ExportController.generateFullAccessConfig(); + } + + PageController.showBusyIndicator(false) + + shareConnectionDrawer.needCloseButton = true + PageController.showTopCloseButton(true) + + shareConnectionDrawer.contentVisible = true + } + } + + ShareConnectionDrawer { + id: shareConnectionDrawer + } + } + } +} From 5dc3b64e0b618a79ccdce8181960e449fed54fb4 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 23 Nov 2023 14:32:16 +0700 Subject: [PATCH 053/144] added search bar for client management page --- client/images/controls/close.svg | 6 ++ client/images/controls/search.svg | 6 ++ client/resources.qrc | 2 + client/ui/controllers/exportController.cpp | 8 +++ client/ui/controllers/exportController.h | 1 + client/ui/models/clientManagementModel.cpp | 13 ++--- client/ui/models/clientManagementModel.h | 17 ------ client/ui/qml/Controls2/SwitcherType.qml | 1 + client/ui/qml/Pages2/PageShare.qml | 64 ++++++++++++++++++---- 9 files changed, 82 insertions(+), 36 deletions(-) create mode 100644 client/images/controls/close.svg create mode 100644 client/images/controls/search.svg diff --git a/client/images/controls/close.svg b/client/images/controls/close.svg new file mode 100644 index 000000000..0643cdc8c --- /dev/null +++ b/client/images/controls/close.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/images/controls/search.svg b/client/images/controls/search.svg new file mode 100644 index 000000000..56fa50e1b --- /dev/null +++ b/client/images/controls/search.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/resources.qrc b/client/resources.qrc index 1baf993b5..dfadcb205 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -223,5 +223,7 @@ server_scripts/awg/run_container.sh server_scripts/awg/Dockerfile ui/qml/Pages2/PageShareFullAccess.qml + images/controls/close.svg + images/controls/search.svg diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index a8be624d7..e3719e502 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -232,6 +232,14 @@ void ExportController::exportConfig(const QString &fileName) SystemController::saveFile(fileName, m_config); } +void ExportController::updateClientManagementModel(const DockerContainer container, ServerCredentials credentials) +{ + ErrorCode errorCode = m_clientManagementModel->updateModel(container, credentials); + if (errorCode != ErrorCode::NoError) { + emit exportErrorOccurred(errorString(errorCode)); + } +} + void ExportController::revokeConfig(const int row, const DockerContainer container, ServerCredentials credentials) { ErrorCode errorCode = m_clientManagementModel->revokeClient(row, container, credentials); diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index b34a05bc3..56db9da04 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -39,6 +39,7 @@ public slots: void exportConfig(const QString &fileName); + void updateClientManagementModel(const DockerContainer container, ServerCredentials credentials); void revokeConfig(const int row, const DockerContainer container, ServerCredentials credentials); void renameClient(const int row, const QString &clientName, const DockerContainer container, ServerCredentials credentials); diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index f53794d5b..bfc33eb9b 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -40,9 +40,6 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const switch (role) { case ClientNameRole: return userData.value(configKey::clientName).toString(); - case ContainerNameRole: - return ContainerProps::containerHumanNames().value( - static_cast(userData.value(configKey::container).toInt())); } return QVariant(); @@ -50,6 +47,9 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCredentials credentials) { + beginResetModel(); + m_clientsTable = QJsonArray(); + ServerController serverController(m_settings); ErrorCode error = ErrorCode::NoError; @@ -60,10 +60,10 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr serverController.getTextFileFromContainer(container, credentials, clientsTableFile, &error); if (error != ErrorCode::NoError) { logger.error() << "Failed to get the clientsTable file from the server"; + endResetModel(); return error; } - beginResetModel(); m_clientsTable = QJsonDocument::fromJson(clientsTableString).array(); if (m_clientsTable.isEmpty()) { @@ -76,6 +76,7 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr error = getWireGuardClients(serverController, container, credentials, count); } if (error != ErrorCode::NoError) { + endResetModel(); return error; } @@ -124,7 +125,6 @@ ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverContr QJsonObject userData; userData[configKey::clientName] = QString("Client %1").arg(count); - userData[configKey::container] = container; client[configKey::userData] = userData; m_clientsTable.push_back(client); @@ -165,7 +165,6 @@ ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverCon QJsonObject userData; userData[configKey::clientName] = QString("Client %1").arg(count); - userData[configKey::container] = container; client[configKey::userData] = userData; m_clientsTable.push_back(client); @@ -211,7 +210,6 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt QJsonObject userData; userData[configKey::clientName] = clientName; - userData[configKey::container] = container; client[configKey::userData] = userData; m_clientsTable.push_back(client); endResetModel(); @@ -371,6 +369,5 @@ QHash ClientManagementModel::roleNames() const { QHash roles; roles[ClientNameRole] = "clientName"; - roles[ContainerNameRole] = "containerName"; return roles; } diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 25089b66e..f5312db7b 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -11,26 +11,9 @@ class ClientManagementModel : public QAbstractListModel { Q_OBJECT - struct ClientManagementData - { - QString userId; - QJsonObject userData; - - bool operator==(const ClientManagementData &r) const - { - return userId == r.userId; - } - - bool operator==(const QString &otherUserId) const - { - return userId == otherUserId; - } - }; - public: enum Roles { ClientNameRole = Qt::UserRole + 1, - ContainerNameRole, }; ClientManagementModel(std::shared_ptr settings, QObject *parent = nullptr); diff --git a/client/ui/qml/Controls2/SwitcherType.qml b/client/ui/qml/Controls2/SwitcherType.qml index 1dbd0e843..37024872a 100644 --- a/client/ui/qml/Controls2/SwitcherType.qml +++ b/client/ui/qml/Controls2/SwitcherType.qml @@ -87,6 +87,7 @@ Switch { id: content anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left ListItemTitleType { Layout.fillWidth: true diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index cb847583b..e3b28529e 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -76,6 +76,7 @@ PageType { } } + property bool isSearchBarVisible: false property bool showContent: false property bool shareButtonEnabled: true property list connectionTypesModel: [ @@ -205,8 +206,8 @@ PageType { onClicked: { accessTypeSelector.currentIndex = 1 PageController.showBusyIndicator(true) - ClientManagementModel.updateModel(ContainersModel.getCurrentlyProcessedContainerIndex(), - ServersModel.getCurrentlyProcessedServerCredentials()) + ExportController.updateClientManagementModel(ContainersModel.getCurrentlyProcessedContainerIndex(), + ServersModel.getCurrentlyProcessedServerCredentials()) PageController.showBusyIndicator(false) } } @@ -354,12 +355,12 @@ PageType { ContainersModel.setCurrentlyProcessedContainerIndex(proxyContainersModel.mapToSource(currentIndex)) - if (accessTypeSelector.currentIndex === 0) { - fillConnectionTypeModel() - } else { + fillConnectionTypeModel() + + if (accessTypeSelector.currentIndex === 1) { PageController.showBusyIndicator(true) - ClientManagementModel.updateModel(ContainersModel.getCurrentlyProcessedContainerIndex(), - ServersModel.getCurrentlyProcessedServerCredentials()) + ExportController.updateClientManagementModel(ContainersModel.getCurrentlyProcessedContainerIndex(), + ServersModel.getCurrentlyProcessedServerCredentials()) PageController.showBusyIndicator(false) } } @@ -444,9 +445,36 @@ PageType { Layout.topMargin: 24 Layout.bottomMargin: 16 - visible: accessTypeSelector.currentIndex === 1 + visible: accessTypeSelector.currentIndex === 1 && !root.isSearchBarVisible headerText: qsTr("Users") + actionButtonImage: "qrc:/images/controls/search.svg" + actionButtonFunction: function() { + root.isSearchBarVisible = true + } + } + + RowLayout { + Layout.topMargin: 24 + Layout.bottomMargin: 16 + visible: accessTypeSelector.currentIndex === 1 && root.isSearchBarVisible + + TextFieldWithHeaderType { + id: searchTextField + Layout.fillWidth: true + + textFieldPlaceholderText: qsTr("Search") + } + + ImageButtonType { + image: "qrc:/images/controls/close.svg" + imageColor: "#D7D8DB" + + onClicked: function() { + root.isSearchBarVisible = false + searchTextField.textFieldText = "" + } + } } ListView { @@ -456,7 +484,15 @@ PageType { visible: accessTypeSelector.currentIndex === 1 - model: ClientManagementModel + model: SortFilterProxyModel { + id: proxyClientManagementModel + sourceModel: ClientManagementModel + filters: RegExpFilter { + roleName: "clientName" + pattern: ".*" + searchTextField.textFieldText + ".*" + caseSensitivity: Qt.CaseInsensitive + } + } clip: true interactive: false @@ -479,7 +515,6 @@ PageType { Layout.fillWidth: true text: clientName - descriptionText: containerName rightImageSource: "qrc:/images/controls/chevron-right.svg" clickedFunction: function() { @@ -510,7 +545,7 @@ PageType { Layout.bottomMargin: 24 headerText: clientName - descriptionText: serverSelector.text + ", " + containerName + descriptionText: serverSelector.text } BasicButtonType { @@ -620,4 +655,11 @@ PageType { } } } + MouseArea { + anchors.fill: parent + onPressed: function(mouse) { + forceActiveFocus() + mouse.accepted = false + } + } } From c34c3e51ea1c20738cd4a6182afcd51eb2a2a022 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 23 Nov 2023 14:13:38 +0300 Subject: [PATCH 054/144] Remove 'https://jitpack.io' repository --- client/android/settings.gradle.kts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 26b5763f8..8cd57b153 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -5,8 +5,6 @@ pluginManagement { google() mavenCentral() gradlePluginPortal() - // for jsocks todo: remove after finish refactoring - maven("https://jitpack.io") } includeBuild("./gradle/plugins") @@ -18,8 +16,6 @@ dependencyResolutionManagement { repositories { google() mavenCentral() - // for jsocks todo: remove after finish refactoring - maven("https://jitpack.io") } } From 6d6710db4a64c12eba32832219ef2fe9671c2a55 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 23 Nov 2023 14:19:51 +0300 Subject: [PATCH 055/144] Prefs refactoring --- client/android/src/org/amnezia/vpn/Prefs.kt | 33 +++++++-------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/Prefs.kt b/client/android/src/org/amnezia/vpn/Prefs.kt index cfc8d7777..4b4262cb2 100644 --- a/client/android/src/org/amnezia/vpn/Prefs.kt +++ b/client/android/src/org/amnezia/vpn/Prefs.kt @@ -1,35 +1,24 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - package org.amnezia.vpn import android.content.Context import android.content.SharedPreferences -import android.util.Log import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey +private const val TAG = "Prefs" +private const val PREFS_FILE = "org.amnezia.vpn.prefs" +private const val SECURE_PREFS_FILE = PREFS_FILE + ".secure" + object Prefs { - // Opens and returns an instance of EncryptedSharedPreferences - fun get(context: Context): SharedPreferences { + fun get(context: Context, appContext: Context = context.applicationContext): SharedPreferences = try { - val mainKey = MasterKey.Builder(context.applicationContext) - .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) - .build() - - val sharedPrefsFile = "com.amnezia.vpn.secure.prefs" - val sharedPreferences: SharedPreferences = EncryptedSharedPreferences.create( - context.applicationContext, - sharedPrefsFile, - mainKey, - EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + EncryptedSharedPreferences( + appContext, + SECURE_PREFS_FILE, + MasterKey(appContext) ) - return sharedPreferences } catch (e: Exception) { - Log.e("Android-Prefs", "Getting Encryption Storage failed, plaintext fallback") - return context.getSharedPreferences("com.amnezia.vpn.preferences", Context.MODE_PRIVATE) + Log.e(TAG, "Getting Encryption Storage failed, plaintext fallback") + appContext.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE) } - } } From de65a039980bf003369ec451aff96c5c2addc275 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 23 Nov 2023 15:45:55 +0300 Subject: [PATCH 056/144] Add ProtocolApi module --- client/android/build.gradle.kts | 1 + client/android/gradle/libs.versions.toml | 2 + client/android/protocolApi/build.gradle.kts | 17 +++ .../protocolApi/src/main/kotlin/Exceptions.kt | 9 ++ .../protocolApi/src/main/kotlin/Protocol.kt | 115 +++++++++++++++++ .../src/main/kotlin/ProtocolConfig.kt | 121 ++++++++++++++++++ .../src/main/kotlin/ProtocolState.kt | 9 ++ .../protocolApi/src/main/kotlin/Statistics.kt | 50 ++++++++ .../protocolApi/src/main/kotlin/Status.kt | 34 +++++ client/android/settings.gradle.kts | 1 + 10 files changed, 359 insertions(+) create mode 100644 client/android/protocolApi/build.gradle.kts create mode 100644 client/android/protocolApi/src/main/kotlin/Exceptions.kt create mode 100644 client/android/protocolApi/src/main/kotlin/Protocol.kt create mode 100644 client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt create mode 100644 client/android/protocolApi/src/main/kotlin/ProtocolState.kt create mode 100644 client/android/protocolApi/src/main/kotlin/Statistics.kt create mode 100644 client/android/protocolApi/src/main/kotlin/Status.kt diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 05126cf58..1957a5263 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -85,6 +85,7 @@ dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) implementation(project(":qt")) implementation(project(":utils")) + implementation(project(":protocolApi")) implementation(libs.androidx.core) implementation(libs.androidx.activity) implementation(libs.androidx.security.crypto) diff --git a/client/android/gradle/libs.versions.toml b/client/android/gradle/libs.versions.toml index 6384da262..0094ced06 100644 --- a/client/android/gradle/libs.versions.toml +++ b/client/android/gradle/libs.versions.toml @@ -3,6 +3,7 @@ agp = "8.1.3" kotlin = "1.9.20" androidx-core = "1.12.0" androidx-activity = "1.8.1" +androidx-annotation = "1.7.0" androidx-camera = "1.3.0" androidx-security-crypto = "1.1.0-alpha06" kotlinx-coroutines = "1.7.3" @@ -11,6 +12,7 @@ google-mlkit = "17.2.0" [libraries] androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } androidx-activity = { module = "androidx.activity:activity-ktx", version.ref = "androidx-activity" } +androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "androidx-annotation" } androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "androidx-camera" } androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "androidx-camera" } androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "androidx-camera" } diff --git a/client/android/protocolApi/build.gradle.kts b/client/android/protocolApi/build.gradle.kts new file mode 100644 index 000000000..9125f7f0d --- /dev/null +++ b/client/android/protocolApi/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.protocol" +} + +dependencies { + compileOnly(project(":utils")) + implementation(libs.androidx.annotation) +} \ No newline at end of file diff --git a/client/android/protocolApi/src/main/kotlin/Exceptions.kt b/client/android/protocolApi/src/main/kotlin/Exceptions.kt new file mode 100644 index 000000000..40fa965a9 --- /dev/null +++ b/client/android/protocolApi/src/main/kotlin/Exceptions.kt @@ -0,0 +1,9 @@ +package org.amnezia.vpn.protocol + +sealed class ProtocolException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) + +class LoadLibraryException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) +class VpnNotAuthorizedException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) +class BadConfigException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) + +class VpnStartException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) diff --git a/client/android/protocolApi/src/main/kotlin/Protocol.kt b/client/android/protocolApi/src/main/kotlin/Protocol.kt new file mode 100644 index 000000000..c4d549f72 --- /dev/null +++ b/client/android/protocolApi/src/main/kotlin/Protocol.kt @@ -0,0 +1,115 @@ +package org.amnezia.vpn.protocol + +import android.annotation.SuppressLint +import android.content.Context +import android.net.IpPrefix +import android.net.VpnService +import android.net.VpnService.Builder +import android.os.Build +import android.system.OsConstants +import androidx.annotation.RequiresApi +import java.io.File +import java.io.FileOutputStream +import java.util.zip.ZipFile +import org.amnezia.vpn.Log +import org.json.JSONObject + +private const val TAG = "Protocol" + +const val VPN_SESSION_NAME = "AmneziaVPN" + +abstract class Protocol(protected val context: Context) { + + open lateinit var config: ProtocolConfig + + abstract val statistics: Statistics + + abstract fun initialize() + + abstract fun parseConfig(config: JSONObject) + + protected open fun buildVpnInterface(vpnBuilder: Builder) { + vpnBuilder.setSession(VPN_SESSION_NAME) + vpnBuilder.allowFamily(OsConstants.AF_INET) + vpnBuilder.allowFamily(OsConstants.AF_INET6) + + for (addr in config.addresses) vpnBuilder.addAddress(addr) + for (addr in config.dnsServers) vpnBuilder.addDnsServer(addr) + for (addr in config.routes) vpnBuilder.addRoute(addr) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + for (addr in config.excludedRoutes) vpnBuilder.excludeRoute(addr) + + for (app in config.excludedApplications) vpnBuilder.addDisallowedApplication(app) + + vpnBuilder.setMtu(config.mtu) + vpnBuilder.setBlocking(config.blockingMode) + vpnBuilder.setUnderlyingNetworks(null) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + vpnBuilder.setMetered(false) + } + + abstract fun startVpn(vpnBuilder: Builder, protect: (Int) -> Boolean) + + abstract fun stopVpn() + + companion object { + private fun extractLibrary(context: Context, libraryName: String, destination: File): Boolean { + Log.d(TAG, "Extracting library: $libraryName") + val apks = hashSetOf() + context.applicationInfo.run { + sourceDir?.let { apks += it } + splitSourceDirs?.let { apks += it } + } + for (abi in Build.SUPPORTED_ABIS) { + for (apk in apks) { + ZipFile(File(apk), ZipFile.OPEN_READ).use { zipFile -> + val mappedName = System.mapLibraryName(libraryName) + val libraryZipPath = listOf("lib", abi, mappedName).joinToString(File.separator) + val zipEntry = zipFile.getEntry(libraryZipPath) + zipEntry?.let { + Log.d(TAG, "Extracting apk:/$libraryZipPath to ${destination.absolutePath}") + FileOutputStream(destination).use { outStream -> + zipFile.getInputStream(zipEntry).use { inStream -> + inStream.copyTo(outStream, 32 * 1024) + outStream.fd.sync() + } + } + } + return true + } + } + } + return false + } + + @SuppressLint("UnsafeDynamicallyLoadedCode") + fun loadSharedLibrary(context: Context, libraryName: String) { + Log.d(TAG, "Loading library: $libraryName") + try { + System.loadLibrary(libraryName) + return + } catch (_: UnsatisfiedLinkError) { + Log.d(TAG, "Failed to load library, try to extract it from apk") + } + var tempFile: File? = null + try { + tempFile = File.createTempFile("lib", ".so", context.codeCacheDir) + if (extractLibrary(context, libraryName, tempFile)) { + System.load(tempFile.absolutePath) + return + } + } catch (e: Exception) { + throw LoadLibraryException("Failed to load library apk: $libraryName", e) + } finally { + tempFile?.delete() + } + } + } +} + +private fun VpnService.Builder.addAddress(addr: InetNetwork) = addAddress(addr.address, addr.mask) +private fun VpnService.Builder.addRoute(addr: InetNetwork) = addRoute(addr.address, addr.mask) + +@RequiresApi(Build.VERSION_CODES.TIRAMISU) +private fun VpnService.Builder.excludeRoute(addr: InetNetwork) = excludeRoute(IpPrefix(addr.address, addr.mask)) diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt new file mode 100644 index 000000000..f6e5df7d7 --- /dev/null +++ b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt @@ -0,0 +1,121 @@ +package org.amnezia.vpn.protocol + +import android.net.InetAddresses +import android.os.Build +import androidx.annotation.RequiresApi +import java.net.InetAddress + +data class ProtocolConfig( + val addresses: Set, + val dnsServers: Set, + val routes: Set, + val excludedRoutes: Set, + val excludedApplications: Set, + val blockingMode: Boolean, + val mtu: Int +) { + + private constructor(builder: Builder) : this( + builder.addresses, + builder.dnsServers, + builder.routes, + builder.excludedRoutes, + builder.excludedApplications, + builder.blockingMode, + builder.mtu + ) + + class Builder(blockingMode: Boolean) { + internal val addresses: MutableSet = hashSetOf() + internal val dnsServers: MutableSet = hashSetOf() + internal val routes: MutableSet = hashSetOf() + internal val excludedRoutes: MutableSet = hashSetOf() + internal val excludedApplications: MutableSet = hashSetOf() + + internal var blockingMode: Boolean = blockingMode + private set + + internal var mtu: Int = 0 + private set + + fun addAddress(addr: InetNetwork) = apply { this.addresses += addr } + fun addAddresses(addresses: List) = apply { this.addresses += addresses } + + fun addDnsServer(dnsServer: InetAddress) = apply { this.dnsServers += dnsServer } + fun addDnsServers(dnsServers: List) = apply { this.dnsServers += dnsServers } + + fun addRoute(route: InetNetwork) = apply { this.routes += route } + fun addRoutes(routes: List) = apply { this.routes += routes } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun excludeRoute(route: InetNetwork) = apply { this.excludedRoutes += route } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun excludeRoutes(routes: List) = apply { this.excludedRoutes += routes } + + fun excludeApplication(application: String) = apply { this.excludedApplications += application } + fun excludeApplications(applications: List) = apply { this.excludedApplications += applications } + + fun setBlockingMode(blockingMode: Boolean) = apply { this.blockingMode = blockingMode } + + fun setMtu(mtu: Int) = apply { this.mtu = mtu } + + private fun validate() { + val errorMessage = StringBuilder() + + with(errorMessage) { + if (addresses.isEmpty()) appendLine("VPN interface network address not specified.") + if (routes.isEmpty()) appendLine("VPN interface route not specified.") + if (mtu == 0) appendLine("MTU not set.") + } + + if (errorMessage.isNotEmpty()) throw BadConfigException(errorMessage.toString()) + } + + fun build(): ProtocolConfig = validate().run { ProtocolConfig(this@Builder) } + } + + companion object { + inline fun build(blockingMode: Boolean, block: Builder.() -> Unit): ProtocolConfig = + Builder(blockingMode).apply(block).build() + } +} + +data class InetNetwork(val address: InetAddress, val mask: Int) { + + override fun toString(): String = "${address.hostAddress}/$mask" + + companion object { + fun parse(data: String): InetNetwork { + val split = data.split("/") + val address = parseInetAddress(split.first()) + val mask = split.last().toInt() + return InetNetwork(address, mask) + } + } +} + +data class InetEndpoint(val address: InetAddress, val port: Int) { + + override fun toString(): String = "${address.hostAddress}:$port" + + companion object { + fun parse(data: String): InetEndpoint { + val split = data.split(":") + val address = parseInetAddress(split.first()) + val port = split.last().toInt() + return InetEndpoint(address, port) + } + } +} + +fun parseInetAddress(address: String): InetAddress = parseNumericAddressCompat(address) + +private val parseNumericAddressCompat: (String) -> InetAddress = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + InetAddresses::parseNumericAddress + } else { + val m = InetAddress::class.java.getMethod("parseNumericAddress", String::class.java) + fun(address: String): InetAddress { + return m.invoke(null, address) as InetAddress + } + } diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolState.kt b/client/android/protocolApi/src/main/kotlin/ProtocolState.kt new file mode 100644 index 000000000..d79949fa3 --- /dev/null +++ b/client/android/protocolApi/src/main/kotlin/ProtocolState.kt @@ -0,0 +1,9 @@ +package org.amnezia.vpn.protocol + +enum class ProtocolState { + CONNECTED, + CONNECTING, + DISCONNECTED, + DISCONNECTING, + UNKNOWN +} diff --git a/client/android/protocolApi/src/main/kotlin/Statistics.kt b/client/android/protocolApi/src/main/kotlin/Statistics.kt new file mode 100644 index 000000000..d5a72fae6 --- /dev/null +++ b/client/android/protocolApi/src/main/kotlin/Statistics.kt @@ -0,0 +1,50 @@ +package org.amnezia.vpn.protocol + +import android.os.Bundle + +private const val RX_BYTES_KEY = "rxBytes" +private const val TX_BYTES_KEY = "txBytes" + +@Suppress("DataClassPrivateConstructor") +data class Statistics private constructor( + val rxBytes: Long = 0L, + val txBytes: Long = 0L +) { + + private constructor(builder: Builder) : this(builder.rxBytes, builder.txBytes) + + @Suppress("SuspiciousEqualsCombination") + fun isEmpty(): Boolean = this === EMPTY_STATISTICS || this == EMPTY_STATISTICS + + class Builder { + var rxBytes: Long = 0L + private set + + var txBytes: Long = 0L + private set + + fun setRxBytes(rxBytes: Long) = apply { this.rxBytes = rxBytes } + fun setTxBytes(txBytes: Long) = apply { this.txBytes = txBytes } + + fun build(): Statistics = + if (rxBytes + txBytes == 0L) EMPTY_STATISTICS + else Statistics(this) + } + + companion object { + val EMPTY_STATISTICS: Statistics = Statistics() + + inline fun build(block: Builder.() -> Unit): Statistics = Builder().apply(block).build() + } +} + +fun Bundle.putStatistics(statistics: Statistics) { + putLong(RX_BYTES_KEY, statistics.rxBytes) + putLong(TX_BYTES_KEY, statistics.txBytes) +} + +fun Bundle.getStatistics(): Statistics = + Statistics.build { + setRxBytes(getLong(RX_BYTES_KEY)) + setTxBytes(getLong(TX_BYTES_KEY)) + } diff --git a/client/android/protocolApi/src/main/kotlin/Status.kt b/client/android/protocolApi/src/main/kotlin/Status.kt new file mode 100644 index 000000000..0bda689ec --- /dev/null +++ b/client/android/protocolApi/src/main/kotlin/Status.kt @@ -0,0 +1,34 @@ +package org.amnezia.vpn.protocol + +import android.os.Bundle + +private const val IS_CONNECTED_KEY = "isConnected" + +@Suppress("DataClassPrivateConstructor") +data class Status private constructor( + val isConnected: Boolean = false +) { + private constructor(builder: Builder) : this(builder.isConnected) + + class Builder { + var isConnected: Boolean = false + private set + + fun setConnected(isConnected: Boolean) = apply { this.isConnected = isConnected } + + fun build(): Status = Status(this) + } + + companion object { + inline fun build(block: Builder.() -> Unit): Status = Builder().apply(block).build() + } +} + +fun Bundle.putStatus(statistics: Status) { + putBoolean(IS_CONNECTED_KEY, statistics.isConnected) +} + +fun Bundle.getStatus(): Status = + Status.build { + setConnected(getBoolean(IS_CONNECTED_KEY)) + } diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 8cd57b153..86359df29 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -31,6 +31,7 @@ rootProject.buildFileName = "build.gradle.kts" include(":qt") include(":utils") +include(":protocolApi") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties From 712fb4d0d32c379402ac19edb5a07f86b8ae9d74 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 23 Nov 2023 16:45:15 +0300 Subject: [PATCH 057/144] Add Wireguard module --- client/android/build.gradle.kts | 1 + client/android/settings.gradle.kts | 1 + client/android/wireguard/build.gradle.kts | 17 +++ .../wireguard/android/backend/GoBackend.kt | 12 ++ .../vpn/protocol/wireguard/Wireguard.kt | 118 ++++++++++++++++++ .../vpn/protocol/wireguard/WireguardConfig.kt | 83 ++++++++++++ 6 files changed, 232 insertions(+) create mode 100644 client/android/wireguard/build.gradle.kts create mode 100644 client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt create mode 100644 client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt create mode 100644 client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 1957a5263..39736074f 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -86,6 +86,7 @@ dependencies { implementation(project(":qt")) implementation(project(":utils")) implementation(project(":protocolApi")) + implementation(project(":wireguard")) implementation(libs.androidx.core) implementation(libs.androidx.activity) implementation(libs.androidx.security.crypto) diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 86359df29..9b8d3c9db 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -32,6 +32,7 @@ rootProject.buildFileName = "build.gradle.kts" include(":qt") include(":utils") include(":protocolApi") +include(":wireguard") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties diff --git a/client/android/wireguard/build.gradle.kts b/client/android/wireguard/build.gradle.kts new file mode 100644 index 000000000..047d838fa --- /dev/null +++ b/client/android/wireguard/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.protocol.wireguard" +} + +dependencies { + compileOnly(project(":utils")) + compileOnly(project(":protocolApi")) +} diff --git a/client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt b/client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt new file mode 100644 index 000000000..485df5a00 --- /dev/null +++ b/client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt @@ -0,0 +1,12 @@ +package com.wireguard.android.backend + +// TODO: Refactor Amnezia wireguard project by changing the JNI method names +// to move this object to 'org.amnezia.vpn.protocol.wireguard.backend' package +object GoBackend { + external fun wgGetConfig(handle: Int): String? + external fun wgGetSocketV4(handle: Int): Int + external fun wgGetSocketV6(handle: Int): Int + external fun wgTurnOff(handle: Int) + external fun wgTurnOn(ifName: String, tunFd: Int, settings: String): Int + external fun wgVersion(): String +} diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt new file mode 100644 index 000000000..0125198e0 --- /dev/null +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -0,0 +1,118 @@ +package org.amnezia.vpn.protocol.wireguard + +import android.content.Context +import android.net.VpnService.Builder +import java.util.TreeMap +import com.wireguard.android.backend.GoBackend +import org.amnezia.vpn.Log +import org.amnezia.vpn.protocol.InetEndpoint +import org.amnezia.vpn.protocol.InetNetwork +import org.amnezia.vpn.protocol.Protocol +import org.amnezia.vpn.protocol.Statistics +import org.amnezia.vpn.protocol.VPN_SESSION_NAME +import org.amnezia.vpn.protocol.VpnStartException +import org.amnezia.vpn.protocol.parseInetAddress +import org.json.JSONObject + +private const val TAG = "Wireguard" + +class Wireguard(context: Context) : Protocol(context) { + + private var tunnelHandle: Int = -1 + private lateinit var wireguardConfig: WireguardConfig + + override val statistics: Statistics + get() { + if (tunnelHandle == -1) return Statistics.EMPTY_STATISTICS + val config = GoBackend.wgGetConfig(tunnelHandle) ?: return Statistics.EMPTY_STATISTICS + return Statistics.build { + var optsCount = 0 + config.splitToSequence("\\n").forEach { line -> + with(line) { + when { + startsWith("rx_bytes=") -> setRxBytes(substring(9).toLong()).also { ++optsCount } + startsWith("tx_bytes=") -> setTxBytes(substring(9).toLong()).also { ++optsCount } + else -> {} + } + } + if (optsCount == 2) return@forEach + } + } + } + + override fun initialize() { + loadSharedLibrary(context, "wg-go") + } + + override fun parseConfig(config: JSONObject) { + val configDataJson = config.getJSONObject("wireguard_config_data") + val configData = parseConfigData(configDataJson.getString("config")) + wireguardConfig = WireguardConfig.build { + configureBaseProtocol(true) { + configData["Address"]?.let { addAddress(InetNetwork.parse(it)) } + configData["DNS"]?.split(",")?.map { dns -> + parseInetAddress(dns.trim()) + }?.forEach(::addDnsServer) + configData["AllowedIPs"]?.split(",")?.map { route -> + InetNetwork.parse(route.trim()) + }?.forEach(::addRoute) + setMtu(configData["MTU"]?.toInt() ?: WIREGUARD_DEFAULT_MTU) + } + configData["Endpoint"]?.let { setEndpoint(InetEndpoint.parse(it)) } + configData["PersistentKeepalive"]?.let { setPersistentKeepalive(it.toInt()) } + configData["PrivateKey"]?.let { setPrivateKeyHex(it.base64ToHex()) } + configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) } + configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) } + } + this.config = wireguardConfig.baseProtocolConfig + } + + private fun parseConfigData(data: String): Map { + val parsedData = TreeMap(String.CASE_INSENSITIVE_ORDER) + data.lineSequence() + .filter { it.isNotEmpty() && !it.startsWith('[') } + .forEach { line -> + val attr = line.split("=", limit = 2) + parsedData[attr.first().trim()] = attr.last().trim() + } + return parsedData + } + + override fun startVpn(vpnBuilder: Builder, protect: (Int) -> Boolean) { + if (tunnelHandle != -1) { + Log.w(TAG, "Tunnel already up") + return + } + + buildVpnInterface(vpnBuilder) + + vpnBuilder.establish().use { tunFd -> + if (tunFd == null) { + throw VpnStartException("Create VPN interface: permission not granted or revoked") + } + Log.v(TAG, "Wg-go backend ${GoBackend.wgVersion()}") + tunnelHandle = GoBackend.wgTurnOn(VPN_SESSION_NAME, tunFd.detachFd(), wireguardConfig.toWgUserspaceString()) + } + + if (tunnelHandle < 0) { + tunnelHandle = -1 + throw VpnStartException("Wireguard tunnel creation error") + } + + if (!protect(GoBackend.wgGetSocketV4(tunnelHandle)) || !protect(GoBackend.wgGetSocketV6(tunnelHandle))) { + GoBackend.wgTurnOff(tunnelHandle) + tunnelHandle = -1 + throw VpnStartException("Protect VPN interface: permission not granted or revoked") + } + } + + override fun stopVpn() { + if (tunnelHandle == -1) { + Log.w(TAG, "Tunnel already down") + return + } + val handleToClose = tunnelHandle + tunnelHandle = -1 + GoBackend.wgTurnOff(handleToClose) + } +} diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt new file mode 100644 index 000000000..740d1ab5e --- /dev/null +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt @@ -0,0 +1,83 @@ +package org.amnezia.vpn.protocol.wireguard + +import android.util.Base64 +import org.amnezia.vpn.protocol.InetEndpoint +import org.amnezia.vpn.protocol.ProtocolConfig + +internal const val WIREGUARD_DEFAULT_MTU = 1280 + +data class WireguardConfig( + val baseProtocolConfig: ProtocolConfig, + val endpoint: InetEndpoint, + val persistentKeepalive: Int, + val publicKeyHex: String, + val preSharedKeyHex: String, + val privateKeyHex: String +) { + + private constructor(builder: Builder) : this( + builder.baseProtocolConfig, + builder.endpoint, + builder.persistentKeepalive, + builder.publicKeyHex, + builder.preSharedKeyHex, + builder.privateKeyHex + ) + + fun toWgUserspaceString(): String = with(StringBuilder()) { + appendLine("private_key=$privateKeyHex") + appendLine("replace_peers=true") + appendLine("public_key=$publicKeyHex") + baseProtocolConfig.routes.forEach { route -> + appendLine("allowed_ip=$route") + } + appendLine("endpoint=$endpoint") + if (persistentKeepalive != 0) + appendLine("persistent_keepalive_interval=$persistentKeepalive") + appendLine("preshared_key=$preSharedKeyHex") + return this.toString() + } + + class Builder { + internal lateinit var baseProtocolConfig: ProtocolConfig + private set + + internal lateinit var endpoint: InetEndpoint + private set + + internal var persistentKeepalive: Int = 0 + private set + + internal lateinit var publicKeyHex: String + private set + + internal lateinit var preSharedKeyHex: String + private set + + internal lateinit var privateKeyHex: String + private set + + fun configureBaseProtocol(blockingMode: Boolean, block: ProtocolConfig.Builder.() -> Unit) = apply { + baseProtocolConfig = ProtocolConfig.Builder(blockingMode).apply(block).build() + } + + fun setEndpoint(endpoint: InetEndpoint) = apply { this.endpoint = endpoint } + + fun setPersistentKeepalive(persistentKeepalive: Int) = apply { this.persistentKeepalive = persistentKeepalive } + + fun setPublicKeyHex(publicKeyHex: String) = apply { this.publicKeyHex = publicKeyHex } + + fun setPreSharedKeyHex(preSharedKeyHex: String) = apply { this.preSharedKeyHex = preSharedKeyHex } + + fun setPrivateKeyHex(privateKeyHex: String) = apply { this.privateKeyHex = privateKeyHex } + + fun build(): WireguardConfig = WireguardConfig(this) + } + + companion object { + inline fun build(block: Builder.() -> Unit): WireguardConfig = Builder().apply(block).build() + } +} + +@OptIn(ExperimentalStdlibApi::class) +internal fun String.base64ToHex(): String = Base64.decode(this, Base64.DEFAULT).toHexString() From ccdcfdce8a353421daf057e397c3a10874852f76 Mon Sep 17 00:00:00 2001 From: albexk Date: Thu, 23 Nov 2023 16:49:32 +0300 Subject: [PATCH 058/144] Remove VPNPermissionHelper class --- client/android/AndroidManifest.xml | 9 ---- .../org/amnezia/vpn/VPNPermissionHelper.kt | 41 ------------------- 2 files changed, 50 deletions(-) delete mode 100644 client/android/src/org/amnezia/vpn/VPNPermissionHelper.kt diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 18e31f436..62b91cead 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -138,15 +138,6 @@ - - - - - Date: Thu, 23 Nov 2023 20:30:03 +0300 Subject: [PATCH 059/144] Android Activity refactoring --- .../src/org/amnezia/vpn/AmneziaActivity.kt | 295 +++++++++++++++++- .../src/org/amnezia/vpn/AmneziaVpnService.kt | 1 + .../src/org/amnezia/vpn/IPCContract.kt | 5 - .../android/src/org/amnezia/vpn/IpcMessage.kt | 45 +++ .../platforms/android/android_controller.cpp | 7 +- client/platforms/android/android_controller.h | 2 +- 6 files changed, 338 insertions(+), 17 deletions(-) delete mode 100644 client/android/src/org/amnezia/vpn/IPCContract.kt create mode 100644 client/android/src/org/amnezia/vpn/IpcMessage.kt diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index f484b44b4..f031a9ad9 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -1,29 +1,304 @@ package org.amnezia.vpn +import android.content.ComponentName import android.content.Intent +import android.content.ServiceConnection import android.net.Uri +import android.net.VpnService +import android.os.Bundle +import android.os.DeadObjectException +import android.os.Handler +import android.os.IBinder +import android.os.Looper +import android.os.Message +import android.os.Messenger +import android.os.RemoteException +import android.widget.Toast +import androidx.annotation.MainThread +import androidx.core.content.ContextCompat import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException +import kotlin.LazyThreadSafetyMode.NONE +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import org.amnezia.vpn.protocol.getStatistics +import org.amnezia.vpn.protocol.getStatus +import org.amnezia.vpn.qt.QtAndroidController import org.qtproject.qt.android.bindings.QtActivity private const val TAG = "AmneziaActivity" -private const val CREATE_FILE_ACTION_CODE = 102 +private const val CHECK_VPN_PERMISSION_ACTION_CODE = 1 +private const val CREATE_FILE_ACTION_CODE = 2 class AmneziaActivity : QtActivity() { + private lateinit var mainScope: CoroutineScope + private val qtInitialized = CompletableDeferred() + private var isWaitingStatus = true + private var isServiceConnected = false + private var isInBoundState = false + private var vpnServiceMessenger: Messenger? = null private var tmpFileContentToSave: String = "" + private val vpnServiceEventHandler: Handler by lazy(NONE) { + object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + val event = msg.extractIpcMessage() + Log.d(TAG, "Handle event: $event") + when (event) { + ServiceEvent.CONNECTED -> { + QtAndroidController.onVpnConnected() + } + + ServiceEvent.DISCONNECTED -> { + QtAndroidController.onVpnDisconnected() + } + + ServiceEvent.STATUS -> { + if (isWaitingStatus) { + isWaitingStatus = false + msg.data?.getStatus()?.let { (isConnected) -> + QtAndroidController.onStatus(isConnected) + } + } + } + + ServiceEvent.STATISTICS_UPDATE -> { + msg.data?.getStatistics()?.let { (rxBytes, txBytes) -> + QtAndroidController.onStatisticsUpdate(rxBytes, txBytes) + } + } + + ServiceEvent.ERROR -> { + // todo: add error reporting to Qt + QtAndroidController.onServiceError() + } + } + } + } + } + + private val activityMessenger: Messenger by lazy(NONE) { + Messenger(vpnServiceEventHandler) + } + + private val serviceConnection: ServiceConnection by lazy(NONE) { + object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { + Log.d(TAG, "Service ${name?.flattenToString()} was connected") + // get a messenger from the service to send actions to the service + vpnServiceMessenger = Messenger(service) + // send a messenger to the service to process service events + sendToService { + Action.REGISTER_CLIENT.packToMessage().apply { + replyTo = activityMessenger + } + } + isServiceConnected = true + if (isWaitingStatus) { + sendToService(Action.REQUEST_STATUS) + } + } + + override fun onServiceDisconnected(name: ComponentName?) { + Log.w(TAG, "Service ${name?.flattenToString()} was unexpectedly disconnected") + isServiceConnected = false + vpnServiceMessenger = null + isWaitingStatus = true + QtAndroidController.onServiceDisconnected() + } + + override fun onBindingDied(name: ComponentName?) { + Log.w(TAG, "Binding to the ${name?.flattenToString()} unexpectedly died") + doUnbindService() + doBindService() + } + } + } + + private data class CheckVpnPermissionCallbacks(val onSuccess: () -> Unit, val onFail: () -> Unit) + + private var checkVpnPermissionCallbacks: CheckVpnPermissionCallbacks? = null + + /** + * Activity overloaded methods + */ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.v(TAG, "Create Amnezia activity") + mainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + } + + override fun onStart() { + super.onStart() + Log.v(TAG, "Start Amnezia activity") + mainScope.launch { + qtInitialized.await() + doBindService() + } + } + + override fun onStop() { + Log.v(TAG, "Stop Amnezia activity") + doUnbindService() + super.onStop() + } + + override fun onDestroy() { + Log.v(TAG, "Destroy Amnezia activity") + mainScope.cancel() + super.onDestroy() + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (requestCode == CREATE_FILE_ACTION_CODE && resultCode == RESULT_OK) { - data?.data?.also { uri -> - alterDocument(uri) + when (requestCode) { + CREATE_FILE_ACTION_CODE -> { + when (resultCode) { + RESULT_OK -> { + data?.data?.let { uri -> + alterDocument(uri) + } + } + } + } + + CHECK_VPN_PERMISSION_ACTION_CODE -> { + when (resultCode) { + RESULT_OK -> { + Log.v(TAG, "Vpn permission granted") + Toast.makeText(this, "Vpn permission granted", Toast.LENGTH_LONG).show() + checkVpnPermissionCallbacks?.run { onSuccess() } + } + + else -> { + Log.w(TAG, "Vpn permission denied, resultCode: $resultCode") + Toast.makeText(this, "Vpn permission denied", Toast.LENGTH_LONG).show() + checkVpnPermissionCallbacks?.run { onFail() } + } + } + checkVpnPermissionCallbacks = null + } + + else -> super.onActivityResult(requestCode, resultCode, data) + } + } + + /** + * Methods of communication with the service + */ + private fun sendToService(messenger: Messenger, msg: Message) { + try { + messenger.send(msg) + } catch (e: DeadObjectException) { + Log.w(TAG, "Service messenger is dead") + doUnbindService() + } catch (e: RemoteException) { + Log.w(TAG, "Sending a message to the service failed: ${e.message}") + doUnbindService() + } + } + + @MainThread + private fun sendToService(msg: () -> Message) { + vpnServiceMessenger?.let { + sendToService(it, msg()) + } + } + + @MainThread + private fun sendToService(msg: Action) { + vpnServiceMessenger?.let { + sendToService(it, msg.packToMessage()) + } + } + + /** + * Methods for service binding + */ + @MainThread + private fun doBindService() { + Log.v(TAG, "Bind service") + Intent(this, AmneziaVpnService::class.java).also { + bindService(it, serviceConnection, BIND_ABOVE_CLIENT) + } + isInBoundState = true + } + + @MainThread + private fun doUnbindService() { + if (isInBoundState) { + Log.v(TAG, "Unbind service") + isWaitingStatus = true + QtAndroidController.onServiceDisconnected() + vpnServiceMessenger = null + isServiceConnected = false + isInBoundState = false + unbindService(serviceConnection) + } + } + + /** + * Methods of starting and stopping VpnService + */ + private fun checkVpnPermissionAndStart(vpnConfig: String) { + checkVpnPermission( + onSuccess = { startVpn(vpnConfig) }, + onFail = QtAndroidController::onVpnPermissionRejected + ) + } + + @MainThread + private fun checkVpnPermission(onSuccess: () -> Unit, onFail: () -> Unit) { + Log.v(TAG, "Check VPN permission") + VpnService.prepare(applicationContext)?.let { + checkVpnPermissionCallbacks = CheckVpnPermissionCallbacks(onSuccess, onFail) + startActivityForResult(it, CHECK_VPN_PERMISSION_ACTION_CODE) + return + } + onSuccess() + } + + @MainThread + private fun startVpn(vpnConfig: String) { + if (isServiceConnected) { + connectToVpn(vpnConfig) + } else { + isWaitingStatus = false + startVpnService(vpnConfig) + doBindService() + } + } + + private fun connectToVpn(vpnConfig: String) { + Log.v(TAG, "Connect to VPN") + sendToService { + Action.CONNECT.packToMessage { + putString(VPN_CONFIG, vpnConfig) } } - super.onActivityResult(requestCode, resultCode, data) } + private fun startVpnService(vpnConfig: String) { + Log.v(TAG, "Start VPN service") + Intent(this, AmneziaVpnService::class.java).apply { + putExtra(VPN_CONFIG, vpnConfig) + }.also { + ContextCompat.startForegroundService(this, it) + } + } + + private fun disconnectFromVpn() { + Log.v(TAG, "Disconnect from VPN") + sendToService(Action.DISCONNECT) + } + + // saving file private fun alterDocument(uri: Uri) { try { applicationContext.contentResolver.openFileDescriptor(uri, "w")?.use { fd -> @@ -46,19 +321,23 @@ class AmneziaActivity : QtActivity() { @Suppress("unused") fun qtAndroidControllerInitialized() { Log.v(TAG, "Qt Android controller initialized") - Log.w(TAG, "Not yet implemented") + qtInitialized.complete(Unit) } @Suppress("unused") fun start(vpnConfig: String) { Log.v(TAG, "Start VPN") - Log.w(TAG, "Not yet implemented") + mainScope.launch { + checkVpnPermissionAndStart(vpnConfig) + } } @Suppress("unused") fun stop() { Log.v(TAG, "Stop VPN") - Log.w(TAG, "Not yet implemented") + mainScope.launch { + disconnectFromVpn() + } } @Suppress("unused") diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 8fe824d48..8c7815474 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -45,6 +45,7 @@ import java.io.IOException import java.lang.Exception import android.net.VpnService as BaseVpnService +const val VPN_CONFIG = "VPN_CONFIG" class AmneziaVpnService : BaseVpnService()/* , LocalDnsService.Interface */ { diff --git a/client/android/src/org/amnezia/vpn/IPCContract.kt b/client/android/src/org/amnezia/vpn/IPCContract.kt deleted file mode 100644 index 4ae3596df..000000000 --- a/client/android/src/org/amnezia/vpn/IPCContract.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.amnezia.vpn - -const val IMPORT_COMMAND_CODE = 1 -const val IMPORT_ACTION_CODE = "import_action" -const val IMPORT_CONFIG_KEY = "CONFIG_DATA_KEY" diff --git a/client/android/src/org/amnezia/vpn/IpcMessage.kt b/client/android/src/org/amnezia/vpn/IpcMessage.kt new file mode 100644 index 000000000..206b47adb --- /dev/null +++ b/client/android/src/org/amnezia/vpn/IpcMessage.kt @@ -0,0 +1,45 @@ +package org.amnezia.vpn + +import android.os.Bundle +import android.os.Message +import kotlin.enums.enumEntries + +sealed interface IpcMessage { + companion object { + @OptIn(ExperimentalStdlibApi::class) + inline fun extractFromMessage(msg: Message): T + where T : Enum, + T : IpcMessage { + val values = enumEntries() + if (msg.what !in values.indices) { + throw IllegalArgumentException("IPC action or event not found for the message: $msg") + } + return values[msg.what] + } + } +} + +enum class ServiceEvent : IpcMessage { + CONNECTED, + DISCONNECTED, + STATUS, + STATISTICS_UPDATE, + ERROR +} + +enum class Action : IpcMessage { + REGISTER_CLIENT, + CONNECT, + DISCONNECT, + REQUEST_STATUS, + REQUEST_STATISTICS +} + +fun T.packToMessage(): Message + where T : Enum, T : IpcMessage = Message.obtain().also { it.what = ordinal } + +fun T.packToMessage(block: Bundle.() -> Unit): Message + where T : Enum, T : IpcMessage = packToMessage().also { it.data = Bundle().apply(block) } + +inline fun Message.extractIpcMessage(): T + where T : Enum, T : IpcMessage = IpcMessage.extractFromMessage(this) diff --git a/client/platforms/android/android_controller.cpp b/client/platforms/android/android_controller.cpp index c9888b4cd..041d18693 100644 --- a/client/platforms/android/android_controller.cpp +++ b/client/platforms/android/android_controller.cpp @@ -17,9 +17,9 @@ AndroidController::AndroidController() : QObject() connect(this, &AndroidController::status, this, [this](bool isVpnConnected) { qDebug() << "Android event: status; connected:" << isVpnConnected; - if (isWaitingInitStatus) { + if (isWaitingStatus) { qDebug() << "Android VPN service is alive, initialization by service status"; - isWaitingInitStatus = false; + isWaitingStatus = false; emit serviceIsAlive(isVpnConnected); } }, @@ -29,6 +29,7 @@ AndroidController::AndroidController() : QObject() this, &AndroidController::serviceDisconnected, this, [this]() { qDebug() << "Android event: service disconnected"; + isWaitingStatus = true; emit connectionStateChanged(Vpn::ConnectionState::Unknown); }, Qt::QueuedConnection); @@ -140,7 +141,7 @@ void AndroidController::callActivityMethod(const char *methodName, const char *s ErrorCode AndroidController::start(const QJsonObject &vpnConfig) { - isWaitingInitStatus = false; + isWaitingStatus = false; auto config = QJsonDocument(vpnConfig).toJson(); callActivityMethod("start", "(Ljava/lang/String;)V", QJniObject::fromString(config).object()); diff --git a/client/platforms/android/android_controller.h b/client/platforms/android/android_controller.h index e30dcc680..eb4109bea 100644 --- a/client/platforms/android/android_controller.h +++ b/client/platforms/android/android_controller.h @@ -37,7 +37,7 @@ class AndroidController : public QObject void serviceIsAlive(bool connected); private: - bool isWaitingInitStatus = true; + bool isWaitingStatus = true; void qtAndroidControllerInitialized(); From ad5ea1ca44088cb31109a8d8495a3198bc61455f Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 24 Nov 2023 17:10:08 +0300 Subject: [PATCH 060/144] Add IpcMessenger class --- .../src/org/amnezia/vpn/AmneziaActivity.kt | 49 +++++-------------- .../src/org/amnezia/vpn/IpcMessenger.kt | 42 ++++++++++++++++ 2 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 client/android/src/org/amnezia/vpn/IpcMessenger.kt diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index f031a9ad9..148c7eeb1 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -43,7 +43,7 @@ class AmneziaActivity : QtActivity() { private var isWaitingStatus = true private var isServiceConnected = false private var isInBoundState = false - private var vpnServiceMessenger: Messenger? = null + private lateinit var vpnServiceMessenger: IpcMessenger private var tmpFileContentToSave: String = "" private val vpnServiceEventHandler: Handler by lazy(NONE) { @@ -93,23 +93,23 @@ class AmneziaActivity : QtActivity() { override fun onServiceConnected(name: ComponentName?, service: IBinder?) { Log.d(TAG, "Service ${name?.flattenToString()} was connected") // get a messenger from the service to send actions to the service - vpnServiceMessenger = Messenger(service) + vpnServiceMessenger.set(Messenger(service)) // send a messenger to the service to process service events - sendToService { + vpnServiceMessenger.send { Action.REGISTER_CLIENT.packToMessage().apply { replyTo = activityMessenger } } isServiceConnected = true if (isWaitingStatus) { - sendToService(Action.REQUEST_STATUS) + vpnServiceMessenger.send(Action.REQUEST_STATUS) } } override fun onServiceDisconnected(name: ComponentName?) { Log.w(TAG, "Service ${name?.flattenToString()} was unexpectedly disconnected") isServiceConnected = false - vpnServiceMessenger = null + vpnServiceMessenger.reset() isWaitingStatus = true QtAndroidController.onServiceDisconnected() } @@ -133,6 +133,10 @@ class AmneziaActivity : QtActivity() { super.onCreate(savedInstanceState) Log.v(TAG, "Create Amnezia activity") mainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + vpnServiceMessenger = IpcMessenger( + onDeadObjectException = ::doUnbindService, + messengerName = "VpnService" + ) } override fun onStart() { @@ -189,35 +193,6 @@ class AmneziaActivity : QtActivity() { } } - /** - * Methods of communication with the service - */ - private fun sendToService(messenger: Messenger, msg: Message) { - try { - messenger.send(msg) - } catch (e: DeadObjectException) { - Log.w(TAG, "Service messenger is dead") - doUnbindService() - } catch (e: RemoteException) { - Log.w(TAG, "Sending a message to the service failed: ${e.message}") - doUnbindService() - } - } - - @MainThread - private fun sendToService(msg: () -> Message) { - vpnServiceMessenger?.let { - sendToService(it, msg()) - } - } - - @MainThread - private fun sendToService(msg: Action) { - vpnServiceMessenger?.let { - sendToService(it, msg.packToMessage()) - } - } - /** * Methods for service binding */ @@ -236,7 +211,7 @@ class AmneziaActivity : QtActivity() { Log.v(TAG, "Unbind service") isWaitingStatus = true QtAndroidController.onServiceDisconnected() - vpnServiceMessenger = null + vpnServiceMessenger.reset() isServiceConnected = false isInBoundState = false unbindService(serviceConnection) @@ -277,7 +252,7 @@ class AmneziaActivity : QtActivity() { private fun connectToVpn(vpnConfig: String) { Log.v(TAG, "Connect to VPN") - sendToService { + vpnServiceMessenger.send { Action.CONNECT.packToMessage { putString(VPN_CONFIG, vpnConfig) } @@ -295,7 +270,7 @@ class AmneziaActivity : QtActivity() { private fun disconnectFromVpn() { Log.v(TAG, "Disconnect from VPN") - sendToService(Action.DISCONNECT) + vpnServiceMessenger.send(Action.DISCONNECT) } // saving file diff --git a/client/android/src/org/amnezia/vpn/IpcMessenger.kt b/client/android/src/org/amnezia/vpn/IpcMessenger.kt new file mode 100644 index 000000000..7599834aa --- /dev/null +++ b/client/android/src/org/amnezia/vpn/IpcMessenger.kt @@ -0,0 +1,42 @@ +package org.amnezia.vpn + +import android.os.DeadObjectException +import android.os.Message +import android.os.Messenger +import android.os.RemoteException + +private const val TAG = "IpcMessenger" + +class IpcMessenger( + private val onDeadObjectException: () -> Unit = {}, + private val onRemoteException: () -> Unit = {}, + private val messengerName: String = "Unknown" +) { + private var messenger: Messenger? = null + + fun set(messenger: Messenger) { + this.messenger = messenger + } + + fun reset() { + messenger = null + } + + fun send(msg: () -> Message) = messenger?.sendMsg(msg()) + + fun send(msg: T) + where T : Enum, T : IpcMessage = messenger?.sendMsg(msg.packToMessage()) + + private fun Messenger.sendMsg(msg: Message) { + try { + send(msg) + } catch (e: DeadObjectException) { + Log.w(TAG, "$messengerName messenger is dead") + messenger = null + onDeadObjectException() + } catch (e: RemoteException) { + Log.w(TAG, "Sending a message to the $messengerName messenger failed: ${e.message}") + onRemoteException() + } + } +} From 8ef16781ebc5612863ca64d3454195c5436e6d17 Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 24 Nov 2023 21:49:54 +0300 Subject: [PATCH 061/144] Remove old wireguard code --- .../wireguard/android/backend/GoBackend.java | 19 - .../android/util/SharedLibraryLoader.java | 93 - .../src/com/wireguard/config/Attribute.java | 57 - .../wireguard/config/BadConfigException.java | 125 - .../src/com/wireguard/config/Config.java | 218 -- .../src/com/wireguard/config/IPRange.java | 509 ---- .../src/com/wireguard/config/IPRangeSet.java | 223 -- .../com/wireguard/config/InetAddresses.java | 73 - .../com/wireguard/config/InetEndpoint.java | 123 - .../src/com/wireguard/config/InetNetwork.java | 77 - .../src/com/wireguard/config/Interface.java | 666 ----- .../com/wireguard/config/ParseException.java | 46 - .../src/com/wireguard/config/Peer.java | 306 --- .../src/com/wireguard/config/Utils.java | 77 - .../src/com/wireguard/crypto/Curve25519.java | 497 ---- .../src/com/wireguard/crypto/Ed25519.java | 2435 ----------------- .../android/src/com/wireguard/crypto/Key.java | 283 -- .../wireguard/crypto/KeyFormatException.java | 32 - .../src/com/wireguard/crypto/KeyPair.java | 52 - .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 14 +- 20 files changed, 7 insertions(+), 5918 deletions(-) delete mode 100644 client/android/src/com/wireguard/android/backend/GoBackend.java delete mode 100644 client/android/src/com/wireguard/android/util/SharedLibraryLoader.java delete mode 100644 client/android/src/com/wireguard/config/Attribute.java delete mode 100644 client/android/src/com/wireguard/config/BadConfigException.java delete mode 100644 client/android/src/com/wireguard/config/Config.java delete mode 100644 client/android/src/com/wireguard/config/IPRange.java delete mode 100644 client/android/src/com/wireguard/config/IPRangeSet.java delete mode 100644 client/android/src/com/wireguard/config/InetAddresses.java delete mode 100644 client/android/src/com/wireguard/config/InetEndpoint.java delete mode 100644 client/android/src/com/wireguard/config/InetNetwork.java delete mode 100644 client/android/src/com/wireguard/config/Interface.java delete mode 100644 client/android/src/com/wireguard/config/ParseException.java delete mode 100644 client/android/src/com/wireguard/config/Peer.java delete mode 100644 client/android/src/com/wireguard/config/Utils.java delete mode 100644 client/android/src/com/wireguard/crypto/Curve25519.java delete mode 100644 client/android/src/com/wireguard/crypto/Ed25519.java delete mode 100644 client/android/src/com/wireguard/crypto/Key.java delete mode 100644 client/android/src/com/wireguard/crypto/KeyFormatException.java delete mode 100644 client/android/src/com/wireguard/crypto/KeyPair.java diff --git a/client/android/src/com/wireguard/android/backend/GoBackend.java b/client/android/src/com/wireguard/android/backend/GoBackend.java deleted file mode 100644 index afd629f27..000000000 --- a/client/android/src/com/wireguard/android/backend/GoBackend.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.wireguard.android.backend; - - -public final class GoBackend { - private static final String TAG = "WireGuard/GoBackend"; - - public static native String wgGetConfig(int handle); - - public static native int wgGetSocketV4(int handle); - - public static native int wgGetSocketV6(int handle); - - public static native void wgTurnOff(int handle); - - public static native int wgTurnOn(String ifName, int tunFd, String settings); - - public static native String wgVersion(); - -} diff --git a/client/android/src/com/wireguard/android/util/SharedLibraryLoader.java b/client/android/src/com/wireguard/android/util/SharedLibraryLoader.java deleted file mode 100644 index d872fd4f3..000000000 --- a/client/android/src/com/wireguard/android/util/SharedLibraryLoader.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.android.util; - -import android.content.Context; -import android.os.Build; -import android.util.Log; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import androidx.annotation.RestrictTo; -import androidx.annotation.RestrictTo.Scope; - -public final class SharedLibraryLoader { - private static final String TAG = "WireGuard/SharedLibraryLoader"; - - private SharedLibraryLoader() {} - - public static boolean extractLibrary( - final Context context, final String libName, final File destination) throws IOException { - final Collection apks = new HashSet<>(); - Log.d(TAG, "Loading Lib ->" + libName); - if (context.getApplicationInfo().sourceDir != null) - apks.add(context.getApplicationInfo().sourceDir); - if (context.getApplicationInfo().splitSourceDirs != null) - apks.addAll(Arrays.asList(context.getApplicationInfo().splitSourceDirs)); - - for (final String abi : Build.SUPPORTED_ABIS) { - for (final String apk : apks) { - try (final ZipFile zipFile = new ZipFile(new File(apk), ZipFile.OPEN_READ)) { - final String mappedLibName = System.mapLibraryName(libName); - final String libZipPath = - "lib" + File.separatorChar + abi + File.separatorChar + mappedLibName; - final ZipEntry zipEntry = zipFile.getEntry(libZipPath); - if (zipEntry == null) - continue; - Log.d(TAG, "Extracting apk:/" + libZipPath + " to " + destination.getAbsolutePath()); - try (final FileOutputStream out = new FileOutputStream(destination); - final InputStream in = zipFile.getInputStream(zipEntry)) { - int len; - final byte[] buffer = new byte[1024 * 32]; - while ((len = in.read(buffer)) != -1) { - out.write(buffer, 0, len); - } - out.getFD().sync(); - } - } - return true; - } - } - return false; - } - - public static void loadSharedLibrary(final Context context, final String libName) { - Throwable noAbiException; - try { - System.loadLibrary(libName); - return; - } catch (final UnsatisfiedLinkError e) { - Log.d(TAG, "Failed to load library normally, so attempting to extract from apk", e); - noAbiException = e; - } - File f = null; - try { - f = File.createTempFile("lib", ".so", context.getCodeCacheDir()); - if (extractLibrary(context, libName, f)) { - System.load(f.getAbsolutePath()); - return; - } - } catch (final Exception e) { - Log.d(TAG, "Failed to load library apk:/" + libName, e); - noAbiException = e; - } finally { - if (f != null) - // noinspection ResultOfMethodCallIgnored - f.delete(); - } - if (noAbiException instanceof RuntimeException) - throw(RuntimeException) noAbiException; - throw new RuntimeException(noAbiException); - } -} diff --git a/client/android/src/com/wireguard/config/Attribute.java b/client/android/src/com/wireguard/config/Attribute.java deleted file mode 100644 index 2cabe4284..000000000 --- a/client/android/src/com/wireguard/config/Attribute.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import java.util.Iterator; -import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class Attribute { - private static final Pattern LINE_PATTERN = Pattern.compile("(\\w+)\\s*=\\s*([^\\s#][^#]*)"); - private static final Pattern LIST_SEPARATOR = Pattern.compile("\\s*,\\s*"); - - private final String key; - private final String value; - - private Attribute(final String key, final String value) { - this.key = key; - this.value = value; - } - - public static String join(final Iterable values) { - final Iterator it = values.iterator(); - if (!it.hasNext()) { - return ""; - } - final StringBuilder sb = new StringBuilder(); - sb.append(it.next()); - while (it.hasNext()) { - sb.append(", "); - sb.append(it.next()); - } - return sb.toString(); - } - - public static Optional parse(final CharSequence line) { - final Matcher matcher = LINE_PATTERN.matcher(line); - if (!matcher.matches()) - return Optional.empty(); - return Optional.of(new Attribute(matcher.group(1), matcher.group(2))); - } - - public static String[] split(final CharSequence value) { - return LIST_SEPARATOR.split(value); - } - - public String getKey() { - return key; - } - - public String getValue() { - return value; - } -} diff --git a/client/android/src/com/wireguard/config/BadConfigException.java b/client/android/src/com/wireguard/config/BadConfigException.java deleted file mode 100644 index af909b0d4..000000000 --- a/client/android/src/com/wireguard/config/BadConfigException.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import com.wireguard.crypto.KeyFormatException; - -import androidx.annotation.Nullable; - -public class BadConfigException extends Exception { - private final Location location; - private final Reason reason; - private final Section section; - @Nullable private final CharSequence text; - - private BadConfigException(final Section section, final Location location, final Reason reason, - @Nullable final CharSequence text, @Nullable final Throwable cause) { - super(cause); - this.section = section; - this.location = location; - this.reason = reason; - this.text = text; - } - - public BadConfigException(final Section section, final Location location, final Reason reason, - @Nullable final CharSequence text) { - this(section, location, reason, text, null); - } - - public BadConfigException( - final Section section, final Location location, final KeyFormatException cause) { - this(section, location, Reason.INVALID_KEY, null, cause); - } - - public BadConfigException(final Section section, final Location location, - @Nullable final CharSequence text, final NumberFormatException cause) { - this(section, location, Reason.INVALID_NUMBER, text, cause); - } - - public BadConfigException( - final Section section, final Location location, final ParseException cause) { - this(section, location, Reason.INVALID_VALUE, cause.getText(), cause); - } - - public Location getLocation() { - return location; - } - - public Reason getReason() { - return reason; - } - - public Section getSection() { - return section; - } - - @Nullable - public CharSequence getText() { - return text; - } - - public enum Location { - TOP_LEVEL(""), - ADDRESS("Address"), - ALLOWED_IPS("AllowedIPs"), - DNS("DNS"), - ENDPOINT("Endpoint"), - EXCLUDED_APPLICATIONS("ExcludedApplications"), - INCLUDED_APPLICATIONS("IncludedApplications"), - LISTEN_PORT("ListenPort"), - JC("Jc"), - JMIN("Jmin"), - JMAX("Jmax"), - S1("S1"), - S2("S2"), - H1("H1"), - H2("H2"), - H3("H3"), - H4("H4"), - MTU("MTU"), - PERSISTENT_KEEPALIVE("PersistentKeepalive"), - PRE_SHARED_KEY("PresharedKey"), - PRIVATE_KEY("PrivateKey"), - PUBLIC_KEY("PublicKey"); - - private final String name; - - Location(final String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - public enum Reason { - INVALID_KEY, - INVALID_NUMBER, - INVALID_VALUE, - MISSING_ATTRIBUTE, - MISSING_SECTION, - SYNTAX_ERROR, - UNKNOWN_ATTRIBUTE, - UNKNOWN_SECTION - } - - public enum Section { - CONFIG("Config"), - INTERFACE("Interface"), - PEER("Peer"); - - private final String name; - - Section(final String name) { - this.name = name; - } - - public String getName() { - return name; - } - } -} diff --git a/client/android/src/com/wireguard/config/Config.java b/client/android/src/com/wireguard/config/Config.java deleted file mode 100644 index 06409babb..000000000 --- a/client/android/src/com/wireguard/config/Config.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import com.wireguard.config.BadConfigException.Location; -import com.wireguard.config.BadConfigException.Reason; -import com.wireguard.config.BadConfigException.Section; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import androidx.annotation.Nullable; - -/** - * Represents the contents of a wg-quick configuration file, made up of one or more "Interface" - * sections (combined together), and zero or more "Peer" sections (treated individually). - *

- * Instances of this class are immutable. - */ - -public final class Config { - private final Interface interfaze; - private final List peers; - - private Config(final Builder builder) { - interfaze = Objects.requireNonNull(builder.interfaze, "An [Interface] section is required"); - // Defensively copy to ensure immutability even if the Builder is reused. - peers = Collections.unmodifiableList(new ArrayList<>(builder.peers)); - } - - /** - * Parses an series of "Interface" and "Peer" sections into a {@code Config}. Throws - * {@link BadConfigException} if the input is not well-formed or contains data that cannot - * be parsed. - * - * @param stream a stream of UTF-8 text that is interpreted as a WireGuard configuration - * @return a {@code Config} instance representing the supplied configuration - */ - public static Config parse(final InputStream stream) throws IOException, BadConfigException { - return parse(new BufferedReader(new InputStreamReader(stream))); - } - - /** - * Parses an series of "Interface" and "Peer" sections into a {@code Config}. Throws - * {@link BadConfigException} if the input is not well-formed or contains data that cannot - * be parsed. - * - * @param reader a BufferedReader of UTF-8 text that is interpreted as a WireGuard configuration - * @return a {@code Config} instance representing the supplied configuration - */ - public static Config parse(final BufferedReader reader) throws IOException, BadConfigException { - final Builder builder = new Builder(); - final Collection interfaceLines = new ArrayList<>(); - final Collection peerLines = new ArrayList<>(); - boolean inInterfaceSection = false; - boolean inPeerSection = false; - boolean seenInterfaceSection = false; - @Nullable String line; - while ((line = reader.readLine()) != null) { - final int commentIndex = line.indexOf('#'); - if (commentIndex != -1) - line = line.substring(0, commentIndex); - line = line.trim(); - if (line.isEmpty()) - continue; - if (line.startsWith("[")) { - // Consume all [Peer] lines read so far. - if (inPeerSection) { - builder.parsePeer(peerLines); - peerLines.clear(); - } - if ("[Interface]".equalsIgnoreCase(line)) { - inInterfaceSection = true; - inPeerSection = false; - seenInterfaceSection = true; - } else if ("[Peer]".equalsIgnoreCase(line)) { - inInterfaceSection = false; - inPeerSection = true; - } else { - throw new BadConfigException( - Section.CONFIG, Location.TOP_LEVEL, Reason.UNKNOWN_SECTION, line); - } - } else if (inInterfaceSection) { - interfaceLines.add(line); - } else if (inPeerSection) { - peerLines.add(line); - } else { - throw new BadConfigException( - Section.CONFIG, Location.TOP_LEVEL, Reason.UNKNOWN_SECTION, line); - } - } - if (inPeerSection) - builder.parsePeer(peerLines); - if (!seenInterfaceSection) - throw new BadConfigException( - Section.CONFIG, Location.TOP_LEVEL, Reason.MISSING_SECTION, null); - // Combine all [Interface] sections in the file. - builder.parseInterface(interfaceLines); - return builder.build(); - } - - @Override - public boolean equals(final Object obj) { - if (!(obj instanceof Config)) - return false; - final Config other = (Config) obj; - return interfaze.equals(other.interfaze) && peers.equals(other.peers); - } - - /** - * Returns the interface section of the configuration. - * - * @return the interface configuration - */ - public Interface getInterface() { - return interfaze; - } - - /** - * Returns a list of the configuration's peer sections. - * - * @return a list of {@link Peer}s - */ - public List getPeers() { - return peers; - } - - @Override - public int hashCode() { - return 31 * interfaze.hashCode() + peers.hashCode(); - } - - /** - * Converts the {@code Config} into a string suitable for debugging purposes. The {@code Config} - * is identified by its interface's public key and the number of peers it has. - * - * @return a concise single-line identifier for the {@code Config} - */ - @Override - public String toString() { - return "(Config " + interfaze + " (" + peers.size() + " peers))"; - } - - /** - * Converts the {@code Config} into a string suitable for use as a {@code wg-quick} - * configuration file. - * - * @return the {@code Config} represented as one [Interface] and zero or more [Peer] sections - */ - public String toWgQuickString() { - final StringBuilder sb = new StringBuilder(); - sb.append("[Interface]\n").append(interfaze.toWgQuickString()); - for (final Peer peer : peers) sb.append("\n[Peer]\n").append(peer.toWgQuickString()); - return sb.toString(); - } - - /** - * Serializes the {@code Config} for use with the WireGuard cross-platform userspace API. - * - * @return the {@code Config} represented as a series of "key=value" lines - */ - public String toWgUserspaceString() { - final StringBuilder sb = new StringBuilder(); - sb.append(interfaze.toWgUserspaceString()); - sb.append("replace_peers=true\n"); - for (final Peer peer : peers) sb.append(peer.toWgUserspaceString()); - return sb.toString(); - } - - @SuppressWarnings("UnusedReturnValue") - public static final class Builder { - // Defaults to an empty set. - private final ArrayList peers = new ArrayList<>(); - // No default; must be provided before building. - @Nullable private Interface interfaze; - - public Builder addPeer(final Peer peer) { - peers.add(peer); - return this; - } - - public Builder addPeers(final Collection peers) { - this.peers.addAll(peers); - return this; - } - - public Config build() { - if (interfaze == null) - throw new IllegalArgumentException("An [Interface] section is required"); - return new Config(this); - } - - public Builder parseInterface(final Iterable lines) - throws BadConfigException { - return setInterface(Interface.parse(lines)); - } - - public Builder parsePeer(final Iterable lines) - throws BadConfigException { - return addPeer(Peer.parse(lines)); - } - - public Builder setInterface(final Interface interfaze) { - this.interfaze = interfaze; - return this; - } - } -} diff --git a/client/android/src/com/wireguard/config/IPRange.java b/client/android/src/com/wireguard/config/IPRange.java deleted file mode 100644 index 11dd66e13..000000000 --- a/client/android/src/com/wireguard/config/IPRange.java +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright (C) 2012-2017 Tobias Brunner - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -package com.wireguard.config; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import androidx.annotation.NonNull; - -/** - * Class that represents a range of IP addresses. This range could be a proper subnet, but that's - * not necessarily the case (see {@code getPrefix} and {@code toSubnets}). - */ -public class IPRange implements Comparable -{ - private final byte[] mBitmask = { (byte)0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; - private byte[] mFrom; - private byte[] mTo; - private Integer mPrefix; - - /** - * Determine if the range is a proper subnet and, if so, what the network prefix is. - */ - private void determinePrefix() - { - boolean matching = true; - - mPrefix = mFrom.length * 8; - for (int i = 0; i < mFrom.length; i++) - { - for (int bit = 0; bit < 8; bit++) - { - if (matching) - { - if ((mFrom[i] & mBitmask[bit]) != (mTo[i] & mBitmask[bit])) - { - mPrefix = (i * 8) + bit; - matching = false; - } - } - else - { - if ((mFrom[i] & mBitmask[bit]) != 0 || (mTo[i] & mBitmask[bit]) == 0) - { - mPrefix = null; - return; - } - } - } - } - } - - private IPRange(byte[] from, byte[] to) - { - mFrom = from; - mTo = to; - determinePrefix(); - } - - public IPRange(String from, String to) throws UnknownHostException - { - this(Utils.parseInetAddress(from), Utils.parseInetAddress(to)); - } - - public IPRange(InetAddress from, InetAddress to) - { - initializeFromRange(from, to); - } - - private void initializeFromRange(InetAddress from, InetAddress to) - { - byte[] fa = from.getAddress(), ta = to.getAddress(); - if (fa.length != ta.length) - { - throw new IllegalArgumentException("Invalid range"); - } - if (compareAddr(fa, ta) < 0) - { - mFrom = fa; - mTo = ta; - } - else - { - mTo = fa; - mFrom = ta; - } - determinePrefix(); - } - - public IPRange(String base, int prefix) throws UnknownHostException - { - this(Utils.parseInetAddress(base), prefix); - } - - public IPRange(InetAddress base, int prefix) - { - this(base.getAddress(), prefix); - } - - private IPRange(byte[] from, int prefix) - { - initializeFromCIDR(from, prefix); - } - - private void initializeFromCIDR(byte[] from, int prefix) - { - if (from.length != 4 && from.length != 16) - { - throw new IllegalArgumentException("Invalid address"); - } - if (prefix < 0 || prefix > from.length * 8) - { - throw new IllegalArgumentException("Invalid prefix"); - } - byte[] to = from.clone(); - byte mask = (byte)(0xff << (8 - prefix % 8)); - int i = prefix / 8; - - if (i < from.length) - { - from[i] = (byte)(from[i] & mask); - to[i] = (byte)(to[i] | ~mask); - Arrays.fill(from, i+1, from.length, (byte)0); - Arrays.fill(to, i+1, to.length, (byte)0xff); - } - mFrom = from; - mTo = to; - mPrefix = prefix; - } - - public IPRange(String cidr) throws UnknownHostException - { - /* only verify the basic structure */ - if (!cidr.matches("(?i)^(([0-9.]+)|([0-9a-f:]+))(-(([0-9.]+)|([0-9a-f:]+))|(/\\d+))?$")) - { - throw new IllegalArgumentException("Invalid CIDR or range notation"); - } - if (cidr.contains("-")) - { - String[] parts = cidr.split("-"); - InetAddress from = InetAddress.getByName(parts[0]); - InetAddress to = InetAddress.getByName(parts[1]); - initializeFromRange(from, to); - } - else - { - String[] parts = cidr.split("/"); - InetAddress addr = InetAddress.getByName(parts[0]); - byte[] base = addr.getAddress(); - int prefix = base.length * 8; - if (parts.length > 1) - { - prefix = Integer.parseInt(parts[1]); - } - initializeFromCIDR(base, prefix); - } - } - - /** - * Returns the first address of the range. The network ID in case this is a proper subnet. - */ - public InetAddress getFrom() - { - try - { - return InetAddress.getByAddress(mFrom); - } - catch (UnknownHostException ignored) - { - return null; - } - } - - /** - * Returns the last address of the range. - */ - public InetAddress getTo() - { - try - { - return InetAddress.getByAddress(mTo); - } - catch (UnknownHostException ignored) - { - return null; - } - } - - /** - * If this range is a proper subnet returns its prefix, otherwise returns null. - */ - public Integer getPrefix() - { - return mPrefix; - } - - @Override - public int compareTo(@NonNull IPRange other) - { - int cmp = compareAddr(mFrom, other.mFrom); - if (cmp == 0) - { /* smaller ranges first */ - cmp = compareAddr(mTo, other.mTo); - } - return cmp; - } - - @Override - public boolean equals(Object o) - { - if (o == null || !(o instanceof IPRange)) - { - return false; - } - return this == o || compareTo((IPRange)o) == 0; - } - - @Override - public String toString() - { - try - { - if (mPrefix != null) - { - return InetAddress.getByAddress(mFrom).getHostAddress() + "/" + mPrefix; - } - return InetAddress.getByAddress(mFrom).getHostAddress() + "-" + - InetAddress.getByAddress(mTo).getHostAddress(); - } - catch (UnknownHostException ignored) - { - return super.toString(); - } - } - - private int compareAddr(byte a[], byte b[]) - { - if (a.length != b.length) - { - return (a.length < b.length) ? -1 : 1; - } - for (int i = 0; i < a.length; i++) - { - if (a[i] != b[i]) - { - if (((int)a[i] & 0xff) < ((int)b[i] & 0xff)) - { - return -1; - } - else - { - return 1; - } - } - } - return 0; - } - - /** - * Check if this range fully contains the given range. - */ - public boolean contains(IPRange range) - { - return compareAddr(mFrom, range.mFrom) <= 0 && compareAddr(range.mTo, mTo) <= 0; - } - - /** - * Check if this and the given range overlap. - */ - public boolean overlaps(IPRange range) - { - return !(compareAddr(mTo, range.mFrom) < 0 || compareAddr(range.mTo, mFrom) < 0); - } - - private byte[] dec(byte[] addr) - { - for (int i = addr.length - 1; i >= 0; i--) - { - if (--addr[i] != (byte)0xff) - { - break; - } - } - return addr; - } - - private byte[] inc(byte[] addr) - { - for (int i = addr.length - 1; i >= 0; i--) - { - if (++addr[i] != 0) - { - break; - } - } - return addr; - } - - /** - * Remove the given range from the current range. Returns a list of resulting ranges (these are - * not proper subnets). At most two ranges are returned, in case the given range is contained in - * this but does not equal it, which would result in an empty list (which is also the case if - * this range is fully contained in the given range). - */ - public List remove(IPRange range) - { - ArrayList list = new ArrayList<>(); - if (!overlaps(range)) - { /* | this | or | this | - * | range | | range | */ - list.add(this); - } - else if (!range.contains(this)) - { /* we are not completely removed, so none of these cases applies: - * | this | or | this | or | this | - * | range | | range | | range | */ - if (compareAddr(mFrom, range.mFrom) < 0 && compareAddr(range.mTo, mTo) < 0) - { /* the removed range is completely within our boundaries: - * | this | - * | range | */ - list.add(new IPRange(mFrom, dec(range.mFrom.clone()))); - list.add(new IPRange(inc(range.mTo.clone()), mTo)); - } - else - { /* one end is within our boundaries the other at or outside it: - * | this | or | this | or | this | or | this | - * | range | | range | | range | | range | */ - byte[] from = compareAddr(mFrom, range.mFrom) < 0 ? mFrom : inc(range.mTo.clone()); - byte[] to = compareAddr(mTo, range.mTo) > 0 ? mTo : dec(range.mFrom.clone()); - list.add(new IPRange(from, to)); - } - } - return list; - } - - private boolean adjacent(IPRange range) - { - if (compareAddr(mTo, range.mFrom) < 0) - { - byte[] to = inc(mTo.clone()); - return compareAddr(to, range.mFrom) == 0; - } - byte[] from = dec(mFrom.clone()); - return compareAddr(from, range.mTo) == 0; - } - - /** - * Merge two adjacent or overlapping ranges, returns null if it's not possible to merge them. - */ - public IPRange merge(IPRange range) - { - if (overlaps(range)) - { - if (contains(range)) - { - return this; - } - else if (range.contains(this)) - { - return range; - } - } - else if (!adjacent(range)) - { - return null; - } - byte[] from = compareAddr(mFrom, range.mFrom) < 0 ? mFrom : range.mFrom; - byte[] to = compareAddr(mTo, range.mTo) > 0 ? mTo : range.mTo; - return new IPRange(from, to); - } - - /** - * Split the given range into a sorted list of proper subnets. - */ - public List toSubnets() - { - ArrayList list = new ArrayList<>(); - if (mPrefix != null) - { - list.add(this); - } - else - { - int i = 0, bit = 0, prefix, netmask, common_byte, common_bit; - int from_cur, from_prev = 0, to_cur, to_prev = 1; - boolean from_full = true, to_full = true; - - byte[] from = mFrom.clone(); - byte[] to = mTo.clone(); - - /* find a common prefix */ - while (i < from.length && (from[i] & mBitmask[bit]) == (to[i] & mBitmask[bit])) - { - if (++bit == 8) - { - bit = 0; - i++; - } - } - prefix = i * 8 + bit; - - /* at this point we know that the addresses are either equal, or that the - * current bits in the 'from' and 'to' addresses are 0 and 1, respectively. - * we now look at the rest of the bits as two binary trees (0=left, 1=right) - * where 'from' and 'to' are both leaf nodes. all leaf nodes between these - * nodes are addresses contained in the range. to collect them as subnets - * we follow the trees from both leaf nodes to their root node and record - * all complete subtrees (right for from, left for to) we come across as - * subnets. in that process host bits are zeroed out. if both addresses - * are equal we won't enter the loop below. - * 0_____|_____1 for the 'from' address we assume we start on a - * 0__|__ 1 0__|__1 left subtree (0) and follow the left edges until - * _|_ _|_ _|_ _|_ we reach the root of this subtree, which is - * | | | | | | | | either the root of this whole 'from'-subtree - * 0 1 0 1 0 1 0 1 (causing us to leave the loop) or the root node - * of the right subtree (1) of another node (which actually could be the - * leaf node we start from). that whole subtree gets recorded as subnet. - * next we follow the right edges to the root of that subtree which again is - * either the 'from'-root or the root node in the left subtree (0) of - * another node. the complete right subtree of that node is the next subnet - * we record. from there we assume that we are in that right subtree and - * recursively follow right edges to its root. for the 'to' address the - * procedure is exactly the same but with left and right reversed. - */ - if (++bit == 8) - { - bit = 0; - i++; - } - common_byte = i; - common_bit = bit; - netmask = from.length * 8; - for (i = from.length - 1; i >= common_byte; i--) - { - int bit_min = (i == common_byte) ? common_bit : 0; - for (bit = 7; bit >= bit_min; bit--) - { - byte mask = mBitmask[bit]; - - from_cur = from[i] & mask; - if (from_prev == 0 && from_cur != 0) - { /* 0 -> 1: subnet is the whole current (right) subtree */ - list.add(new IPRange(from.clone(), netmask)); - from_full = false; - } - else if (from_prev != 0 && from_cur == 0) - { /* 1 -> 0: invert bit to switch to right subtree and add it */ - from[i] ^= mask; - list.add(new IPRange(from.clone(), netmask)); - from_cur = 1; - } - /* clear the current bit */ - from[i] &= ~mask; - from_prev = from_cur; - - to_cur = to[i] & mask; - if (to_prev != 0 && to_cur == 0) - { /* 1 -> 0: subnet is the whole current (left) subtree */ - list.add(new IPRange(to.clone(), netmask)); - to_full = false; - } - else if (to_prev == 0 && to_cur != 0) - { /* 0 -> 1: invert bit to switch to left subtree and add it */ - to[i] ^= mask; - list.add(new IPRange(to.clone(), netmask)); - to_cur = 0; - } - /* clear the current bit */ - to[i] &= ~mask; - to_prev = to_cur; - netmask--; - } - } - - if (from_full && to_full) - { /* full subnet (from=to or from=0.. and to=1.. after common prefix) - not reachable - * due to the shortcut at the top */ - list.add(new IPRange(from.clone(), prefix)); - } - else if (from_full) - { /* full from subnet (from=0.. after prefix) */ - list.add(new IPRange(from.clone(), prefix + 1)); - } - else if (to_full) - { /* full to subnet (to=1.. after prefix) */ - list.add(new IPRange(to.clone(), prefix + 1)); - } - } - Collections.sort(list); - return list; - } -} diff --git a/client/android/src/com/wireguard/config/IPRangeSet.java b/client/android/src/com/wireguard/config/IPRangeSet.java deleted file mode 100644 index b77d4f737..000000000 --- a/client/android/src/com/wireguard/config/IPRangeSet.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2012-2017 Tobias Brunner - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -package com.wireguard.config; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.TreeSet; - -/** - * Class that represents a set of IP address ranges (not necessarily proper subnets) and allows - * modifying the set and enumerating the resulting subnets. - */ -public class IPRangeSet implements Iterable -{ - private TreeSet mRanges = new TreeSet<>(); - - /** - * Parse the given string (space separated ranges in CIDR or range notation) and return the - * resulting set or {@code null} if the string was invalid. An empty set is returned if the given string - * is {@code null}. - */ - public static IPRangeSet fromString(String ranges) - { - IPRangeSet set = new IPRangeSet(); - if (ranges != null) - { - for (String range : ranges.split("\\s+")) - { - try - { - set.add(new IPRange(range)); - } - catch (Exception unused) - { /* besides due to invalid strings exceptions might get thrown if the string - * contains a hostname (NetworkOnMainThreadException) */ - return null; - } - } - } - return set; - } - - /** - * Add a range to this set. Automatically gets merged with existing ranges. - */ - public void add(IPRange range) - { - if (mRanges.contains(range)) - { - return; - } - reinsert: - while (true) - { - Iterator iterator = mRanges.iterator(); - while (iterator.hasNext()) - { - IPRange existing = iterator.next(); - IPRange replacement = existing.merge(range); - if (replacement != null) - { - iterator.remove(); - range = replacement; - continue reinsert; - } - } - mRanges.add(range); - break; - } - } - - /** - * Add all ranges from the given set. - */ - public void add(IPRangeSet ranges) - { - if (ranges == this) - { - return; - } - for (IPRange range : ranges.mRanges) - { - add(range); - } - } - - /** - * Add all ranges from the given collection to this set. - */ - public void addAll(Collection coll) - { - for (IPRange range : coll) - { - add(range); - } - } - - /** - * Remove the given range from this set. Existing ranges are automatically adjusted. - */ - public void remove(IPRange range) - { - ArrayList additions = new ArrayList<>(); - Iterator iterator = mRanges.iterator(); - while (iterator.hasNext()) - { - IPRange existing = iterator.next(); - List result = existing.remove(range); - if (result.size() == 0) - { - iterator.remove(); - } - else if (!result.get(0).equals(existing)) - { - iterator.remove(); - additions.addAll(result); - } - } - mRanges.addAll(additions); - } - - /** - * Remove the given ranges from ranges in this set. - */ - public void remove(IPRangeSet ranges) - { - if (ranges == this) - { - mRanges.clear(); - return; - } - for (IPRange range : ranges.mRanges) - { - remove(range); - } - } - - /** - * Get all the subnets derived from all the ranges in this set. - */ - public Iterable subnets() - { - return new Iterable() - { - @Override - public Iterator iterator() - { - return new Iterator() - { - private Iterator mIterator = mRanges.iterator(); - private List mSubnets; - - @Override - public boolean hasNext() - { - return (mSubnets != null && mSubnets.size() > 0) || mIterator.hasNext(); - } - - @Override - public IPRange next() - { - if (mSubnets == null || mSubnets.size() == 0) - { - IPRange range = mIterator.next(); - mSubnets = range.toSubnets(); - } - return mSubnets.remove(0); - } - - @Override - public void remove() - { - throw new UnsupportedOperationException(); - } - }; - } - }; - } - - @Override - public Iterator iterator() - { - return mRanges.iterator(); - } - - /** - * Returns the number of ranges, not subnets. - */ - public int size() - { - return mRanges.size(); - } - - @Override - public String toString() - { /* we could use TextUtils, but that causes the unit tests to fail */ - StringBuilder sb = new StringBuilder(); - for (IPRange range : mRanges) - { - if (sb.length() > 0) - { - sb.append(" "); - } - sb.append(range.toString()); - } - return sb.toString(); - } -} diff --git a/client/android/src/com/wireguard/config/InetAddresses.java b/client/android/src/com/wireguard/config/InetAddresses.java deleted file mode 100644 index bb6a6854a..000000000 --- a/client/android/src/com/wireguard/config/InetAddresses.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import java.lang.reflect.Method; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.regex.Pattern; - -import androidx.annotation.Nullable; - -/** - * Utility methods for creating instances of {@link InetAddress}. - */ - -public final class InetAddresses { - @Nullable private static final Method PARSER_METHOD; - private static final Pattern WONT_TOUCH_RESOLVER = Pattern.compile( - "^(((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?)|((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$"); - - static { - Method m = null; - try { - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.Q) - // noinspection JavaReflectionMemberAccess - m = InetAddress.class.getMethod("parseNumericAddress", String.class); - } catch (final Exception ignored) { - } - PARSER_METHOD = m; - } - - private InetAddresses() {} - - /** - * Parses a numeric IPv4 or IPv6 address without performing any DNS lookups. - * - * @param address a string representing the IP address - * @return an instance of {@link Inet4Address} or {@link Inet6Address}, as appropriate - */ - public static InetAddress parse(final String address) throws ParseException { - if (address.isEmpty()) - throw new ParseException(InetAddress.class, address, "Empty address"); - try { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) - return android.net.InetAddresses.parseNumericAddress(address); - else if (PARSER_METHOD != null) - return (InetAddress) PARSER_METHOD.invoke(null, address); - else - throw new NoSuchMethodException("parseNumericAddress"); - } catch (final IllegalArgumentException e) { - throw new ParseException(InetAddress.class, address, e); - } catch (final Exception e) { - final Throwable cause = e.getCause(); - // Re-throw parsing exceptions with the original type, as callers might try to catch - // them. On the other hand, callers cannot be expected to handle reflection failures. - if (cause instanceof IllegalArgumentException) - throw new ParseException(InetAddress.class, address, cause); - try { - if (WONT_TOUCH_RESOLVER.matcher(address).matches()) - return InetAddress.getByName(address); - else - throw new ParseException(InetAddress.class, address, "Not an IP address"); - } catch (final UnknownHostException f) { - throw new ParseException(InetAddress.class, address, f); - } - } - } -} diff --git a/client/android/src/com/wireguard/config/InetEndpoint.java b/client/android/src/com/wireguard/config/InetEndpoint.java deleted file mode 100644 index d7802204f..000000000 --- a/client/android/src/com/wireguard/config/InetEndpoint.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.UnknownHostException; -import java.time.Duration; -import java.time.Instant; -import java.util.Optional; -import java.util.regex.Pattern; - -import androidx.annotation.Nullable; - -/** - * An external endpoint (host and port) used to connect to a WireGuard {@link Peer}. - *

- * Instances of this class are externally immutable. - */ - -public final class InetEndpoint { - private static final Pattern BARE_IPV6 = Pattern.compile("^[^\\[\\]]*:[^\\[\\]]*"); - private static final Pattern FORBIDDEN_CHARACTERS = Pattern.compile("[/?#]"); - - private final String host; - private final boolean isResolved; - private final Object lock = new Object(); - private final int port; - private long lastResolution; - @Nullable private InetEndpoint resolved; - - private InetEndpoint(final String host, final boolean isResolved, final int port) { - this.host = host; - this.isResolved = isResolved; - this.port = port; - } - - public static InetEndpoint parse(final String endpoint) throws ParseException { - if (FORBIDDEN_CHARACTERS.matcher(endpoint).find()) - throw new ParseException(InetEndpoint.class, endpoint, "Forbidden characters"); - final URI uri; - try { - uri = new URI("wg://" + endpoint); - } catch (final URISyntaxException e) { - throw new ParseException(InetEndpoint.class, endpoint, e); - } - if (uri.getPort() < 0 || uri.getPort() > 65535) - throw new ParseException(InetEndpoint.class, endpoint, "Missing/invalid port number"); - try { - InetAddresses.parse(uri.getHost()); - // Parsing ths host as a numeric address worked, so we don't need to do DNS lookups. - return new InetEndpoint(uri.getHost(), true, uri.getPort()); - } catch (final ParseException ignored) { - // Failed to parse the host as a numeric address, so it must be a DNS hostname/FQDN. - return new InetEndpoint(uri.getHost(), false, uri.getPort()); - } - } - - @Override - public boolean equals(final Object obj) { - if (!(obj instanceof InetEndpoint)) - return false; - final InetEndpoint other = (InetEndpoint) obj; - return host.equals(other.host) && port == other.port; - } - - public String getHost() { - return host; - } - - public int getPort() { - return port; - } - - /** - * Generate an {@code InetEndpoint} instance with the same port and the host resolved using DNS - * to a numeric address. If the host is already numeric, the existing instance may be returned. - * Because this function may perform network I/O, it must not be called from the main thread. - * - * @return the resolved endpoint, or {@link Optional#empty()} - */ - public Optional getResolved() { - if (isResolved) - return Optional.of(this); - synchronized (lock) { - // TODO(zx2c4): Implement a real timeout mechanism using DNS TTL - if (System.currentTimeMillis() - lastResolution > 60000L) { - try { - // Prefer v4 endpoints over v6 to work around DNS64 and IPv6 NAT issues. - final InetAddress[] candidates = InetAddress.getAllByName(host); - InetAddress address = candidates[0]; - for (final InetAddress candidate : candidates) { - if (candidate instanceof Inet4Address) { - address = candidate; - break; - } - } - resolved = new InetEndpoint(address.getHostAddress(), true, port); - lastResolution = System.currentTimeMillis(); - } catch (final UnknownHostException e) { - resolved = null; - } - } - return Optional.ofNullable(resolved); - } - } - - @Override - public int hashCode() { - return host.hashCode() ^ port; - } - - @Override - public String toString() { - final boolean isBareIpv6 = isResolved && BARE_IPV6.matcher(host).matches(); - return (isBareIpv6 ? '[' + host + ']' : host) + ':' + port; - } -} diff --git a/client/android/src/com/wireguard/config/InetNetwork.java b/client/android/src/com/wireguard/config/InetNetwork.java deleted file mode 100644 index 584950d43..000000000 --- a/client/android/src/com/wireguard/config/InetNetwork.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import java.net.Inet4Address; -import java.net.InetAddress; - -/** - * An Internet network, denoted by its address and netmask - *

- * Instances of this class are immutable. - */ - -public final class InetNetwork { - private final InetAddress address; - private final int mask; - - private InetNetwork(final InetAddress address, final int mask) { - this.address = address; - this.mask = mask; - } - - public static InetNetwork parse(final String network) throws ParseException { - final int slash = network.lastIndexOf('/'); - final String maskString; - final int rawMask; - final String rawAddress; - if (slash >= 0) { - maskString = network.substring(slash + 1); - try { - rawMask = Integer.parseInt(maskString, 10); - } catch (final NumberFormatException ignored) { - throw new ParseException(Integer.class, maskString); - } - rawAddress = network.substring(0, slash); - } else { - maskString = ""; - rawMask = -1; - rawAddress = network; - } - final InetAddress address = InetAddresses.parse(rawAddress); - final int maxMask = (address instanceof Inet4Address) ? 32 : 128; - if (rawMask > maxMask) - throw new ParseException(InetNetwork.class, maskString, "Invalid network mask"); - final int mask = rawMask >= 0 ? rawMask : maxMask; - return new InetNetwork(address, mask); - } - - @Override - public boolean equals(final Object obj) { - if (!(obj instanceof InetNetwork)) - return false; - final InetNetwork other = (InetNetwork) obj; - return address.equals(other.address) && mask == other.mask; - } - - public InetAddress getAddress() { - return address; - } - - public int getMask() { - return mask; - } - - @Override - public int hashCode() { - return address.hashCode() ^ mask; - } - - @Override - public String toString() { - return address.getHostAddress() + '/' + mask; - } -} diff --git a/client/android/src/com/wireguard/config/Interface.java b/client/android/src/com/wireguard/config/Interface.java deleted file mode 100644 index 4b561680f..000000000 --- a/client/android/src/com/wireguard/config/Interface.java +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import com.wireguard.config.BadConfigException.Location; -import com.wireguard.config.BadConfigException.Reason; -import com.wireguard.config.BadConfigException.Section; -import com.wireguard.crypto.Key; -import com.wireguard.crypto.KeyFormatException; -import com.wireguard.crypto.KeyPair; - -import java.net.InetAddress; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import androidx.annotation.Nullable; - -/** - * Represents the configuration for a WireGuard interface (an [Interface] block). Interfaces must - * have a private key (used to initialize a {@code KeyPair}), and may optionally have several other - * attributes. - *

- * Instances of this class are immutable. - */ - -public final class Interface { - private static final int MAX_UDP_PORT = 65535; - private static final int MIN_UDP_PORT = 0; - - private final Set addresses; - private final Set dnsServers; - private final Set excludedApplications; - private final Set includedApplications; - private final KeyPair keyPair; - private final Optional listenPort; - private final Optional mtu; - private final Optional jc; - private final Optional jmin; - private final Optional jmax; - private final Optional s1; - private final Optional s2; - private final Optional h1; - private final Optional h2; - private final Optional h3; - private final Optional h4; - - private Interface(final Builder builder) { - // Defensively copy to ensure immutability even if the Builder is reused. - addresses = Collections.unmodifiableSet(new LinkedHashSet<>(builder.addresses)); - dnsServers = Collections.unmodifiableSet(new LinkedHashSet<>(builder.dnsServers)); - excludedApplications = - Collections.unmodifiableSet(new LinkedHashSet<>(builder.excludedApplications)); - includedApplications = - Collections.unmodifiableSet(new LinkedHashSet<>(builder.includedApplications)); - keyPair = Objects.requireNonNull(builder.keyPair, "Interfaces must have a private key"); - listenPort = builder.listenPort; - mtu = builder.mtu; - jc = builder.jc; - jmax = builder.jmax; - jmin = builder.jmin; - s1 = builder.s1; - s2 = builder.s2; - h1 = builder.h1; - h2 = builder.h2; - h3 = builder.h3; - h4 = builder.h4; - } - - /** - * Parses an series of "KEY = VALUE" lines into an {@code Interface}. Throws - * {@link ParseException} if the input is not well-formed or contains unknown attributes. - * - * @param lines An iterable sequence of lines, containing at least a private key attribute - * @return An {@code Interface} with all of the attributes from {@code lines} set - */ - public static Interface parse(final Iterable lines) - throws BadConfigException { - final Builder builder = new Builder(); - for (final CharSequence line : lines) { - final Attribute attribute = - Attribute.parse(line).orElseThrow(() - -> new BadConfigException(Section.INTERFACE, - Location.TOP_LEVEL, Reason.SYNTAX_ERROR, line)); - switch (attribute.getKey().toLowerCase(Locale.ENGLISH)) { - case "address": - builder.parseAddresses(attribute.getValue()); - break; - case "dns": - builder.parseDnsServers(attribute.getValue()); - break; - case "excludedapplications": - builder.parseExcludedApplications(attribute.getValue()); - break; - case "includedapplications": - builder.parseIncludedApplications(attribute.getValue()); - break; - case "listenport": - builder.parseListenPort(attribute.getValue()); - break; - case "mtu": - builder.parseMtu(attribute.getValue()); - break; - case "privatekey": - builder.parsePrivateKey(attribute.getValue()); - break; - case "jc": - builder.parseJc(attribute.getValue()); - break; - case "jmin": - builder.parseJmin(attribute.getValue()); - break; - case "jmax": - builder.parseJmax(attribute.getValue()); - break; - case "s1": - builder.parseS1(attribute.getValue()); - break; - case "s2": - builder.parseS2(attribute.getValue()); - break; - case "h1": - builder.parseH1(attribute.getValue()); - break; - case "h2": - builder.parseH2(attribute.getValue()); - break; - case "h3": - builder.parseH3(attribute.getValue()); - break; - case "h4": - builder.parseH4(attribute.getValue()); - break; - default: - throw new BadConfigException( - Section.INTERFACE, Location.TOP_LEVEL, Reason.UNKNOWN_ATTRIBUTE, attribute.getKey()); - } - } - return builder.build(); - } - - @Override - public boolean equals(final Object obj) { - if (!(obj instanceof Interface)) - return false; - final Interface other = (Interface) obj; - return addresses.equals(other.addresses) && dnsServers.equals(other.dnsServers) - && excludedApplications.equals(other.excludedApplications) - && includedApplications.equals(other.includedApplications) && keyPair.equals(other.keyPair) - && listenPort.equals(other.listenPort) && mtu.equals(other.mtu) && jc.equals(other.jc) && jmin.equals(other.jmin) - && jmax.equals(other.jmax) && s1.equals(other.s1) && s2.equals(other.s2) && h1.equals(other.h1) && h2.equals(other.h2) - && h3.equals(other.h3) && h4.equals(other.h4); - } - - /** - * Returns the set of IP addresses assigned to the interface. - * - * @return a set of {@link InetNetwork}s - */ - public Set getAddresses() { - // The collection is already immutable. - return addresses; - } - - /** - * Returns the set of DNS servers associated with the interface. - * - * @return a set of {@link InetAddress}es - */ - public Set getDnsServers() { - // The collection is already immutable. - return dnsServers; - } - - /** - * Returns the set of applications excluded from using the interface. - * - * @return a set of package names - */ - public Set getExcludedApplications() { - // The collection is already immutable. - return excludedApplications; - } - - /** - * Returns the set of applications included exclusively for using the interface. - * - * @return a set of package names - */ - public Set getIncludedApplications() { - // The collection is already immutable. - return includedApplications; - } - - /** - * Returns the public/private key pair used by the interface. - * - * @return a key pair - */ - public KeyPair getKeyPair() { - return keyPair; - } - - /** - * Returns the UDP port number that the WireGuard interface will listen on. - * - * @return a UDP port number, or {@code Optional.empty()} if none is configured - */ - public Optional getListenPort() { - return listenPort; - } - - /** - * Returns the MTU used for the WireGuard interface. - * - * @return the MTU, or {@code Optional.empty()} if none is configured - */ - public Optional getMtu() { - return mtu; - } - - public Optional getJc() { - return jc; - } - - public Optional getJmin() { - return jmin; - } - - public Optional getJmax() { - return jmax; - } - - public Optional getS1() { - return s1; - } - - public Optional getS2() { - return s2; - } - - public Optional getH1() { - return h1; - } - - public Optional getH2() { - return h2; - } - - public Optional getH3() { - return h3; - } - - public Optional getH4() { - return h4; - } - - @Override - public int hashCode() { - int hash = 1; - hash = 31 * hash + addresses.hashCode(); - hash = 31 * hash + dnsServers.hashCode(); - hash = 31 * hash + excludedApplications.hashCode(); - hash = 31 * hash + includedApplications.hashCode(); - hash = 31 * hash + keyPair.hashCode(); - hash = 31 * hash + listenPort.hashCode(); - hash = 31 * hash + mtu.hashCode(); - hash = 31 * hash + jc.hashCode(); - hash = 31 * hash + jmin.hashCode(); - hash = 31 * hash + jmax.hashCode(); - hash = 31 * hash + s1.hashCode(); - hash = 31 * hash + s2.hashCode(); - hash = 31 * hash + h1.hashCode(); - hash = 31 * hash + h2.hashCode(); - hash = 31 * hash + h3.hashCode(); - hash = 31 * hash + h4.hashCode(); - return hash; - } - - /** - * Converts the {@code Interface} into a string suitable for debugging purposes. The {@code - * Interface} is identified by its public key and (if set) the port used for its UDP socket. - * - * @return A concise single-line identifier for the {@code Interface} - */ - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("(Interface "); - sb.append(keyPair.getPublicKey().toBase64()); - listenPort.ifPresent(lp -> sb.append(" @").append(lp)); - sb.append(')'); - return sb.toString(); - } - - /** - * Converts the {@code Interface} into a string suitable for inclusion in a {@code wg-quick} - * configuration file. - * - * @return The {@code Interface} represented as a series of "Key = Value" lines - */ - public String toWgQuickString() { - final StringBuilder sb = new StringBuilder(); - if (!addresses.isEmpty()) - sb.append("Address = ").append(Attribute.join(addresses)).append('\n'); - if (!dnsServers.isEmpty()) { - final List dnsServerStrings = - dnsServers.stream().map(InetAddress::getHostAddress).collect(Collectors.toList()); - sb.append("DNS = ").append(Attribute.join(dnsServerStrings)).append('\n'); - } - if (!excludedApplications.isEmpty()) - sb.append("ExcludedApplications = ") - .append(Attribute.join(excludedApplications)) - .append('\n'); - if (!includedApplications.isEmpty()) - sb.append("IncludedApplications = ") - .append(Attribute.join(includedApplications)) - .append('\n'); - listenPort.ifPresent(lp -> sb.append("ListenPort = ").append(lp).append('\n')); - mtu.ifPresent(m -> sb.append("MTU = ").append(m).append('\n')); - - jc.ifPresent(t_jc -> sb.append("Jc = ").append(t_jc).append('\n')); - jmin.ifPresent(t_jmin -> sb.append("Jmin = ").append(t_jmin).append('\n')); - jmax.ifPresent(t_jmax -> sb.append("Jmax = ").append(t_jmax).append('\n')); - - s1.ifPresent(t_s1 -> sb.append("S1 = ").append(t_s1).append('\n')); - s2.ifPresent(t_s2 -> sb.append("S2 = ").append(t_s2).append('\n')); - - h1.ifPresent(t_h1 -> sb.append("H1 = ").append(t_h1).append('\n')); - h2.ifPresent(t_h2 -> sb.append("H2 = ").append(t_h2).append('\n')); - h3.ifPresent(t_h3 -> sb.append("H3 = ").append(t_h3).append('\n')); - h4.ifPresent(t_h4 -> sb.append("H4 = ").append(t_h4).append('\n')); - - sb.append("PrivateKey = ").append(keyPair.getPrivateKey().toBase64()).append('\n'); - return sb.toString(); - } - - /** - * Serializes the {@code Interface} for use with the WireGuard cross-platform userspace API. - * Note that not all attributes are included in this representation. - * - * @return the {@code Interface} represented as a series of "KEY=VALUE" lines - */ - public String toWgUserspaceString() { - final StringBuilder sb = new StringBuilder(); - sb.append("private_key=").append(keyPair.getPrivateKey().toHex()).append('\n'); - listenPort.ifPresent(lp -> sb.append("listen_port=").append(lp).append('\n')); - - jc.ifPresent(t_jc -> sb.append("jc=").append(t_jc).append('\n')); - jmin.ifPresent(t_jmin -> sb.append("jmin=").append(t_jmin).append('\n')); - jmax.ifPresent(t_jmax -> sb.append("jmax=").append(t_jmax).append('\n')); - - s1.ifPresent(t_s1 -> sb.append("s1=").append(t_s1).append('\n')); - s2.ifPresent(t_s2 -> sb.append("s2=").append(t_s2).append('\n')); - - h1.ifPresent(t_h1 -> sb.append("h1=").append(t_h1).append('\n')); - h2.ifPresent(t_h2 -> sb.append("h2=").append(t_h2).append('\n')); - h3.ifPresent(t_h3 -> sb.append("h3=").append(t_h3).append('\n')); - h4.ifPresent(t_h4 -> sb.append("h4=").append(t_h4).append('\n')); - return sb.toString(); - } - - @SuppressWarnings("UnusedReturnValue") - public static final class Builder { - // Defaults to an empty set. - private final Set addresses = new LinkedHashSet<>(); - // Defaults to an empty set. - private final Set dnsServers = new LinkedHashSet<>(); - // Defaults to an empty set. - private final Set excludedApplications = new LinkedHashSet<>(); - // Defaults to an empty set. - private final Set includedApplications = new LinkedHashSet<>(); - // No default; must be provided before building. - @Nullable private KeyPair keyPair; - // Defaults to not present. - private Optional listenPort = Optional.empty(); - // Defaults to not present. - private Optional mtu = Optional.empty(); - private Optional jc = Optional.empty(); - private Optional jmin = Optional.empty(); - private Optional jmax = Optional.empty(); - - private Optional s1 = Optional.empty(); - private Optional s2 = Optional.empty(); - - private Optional h1 = Optional.empty(); - private Optional h2 = Optional.empty(); - private Optional h3 = Optional.empty(); - private Optional h4 = Optional.empty(); - - public Builder addAddress(final InetNetwork address) { - addresses.add(address); - return this; - } - - public Builder addAddresses(final Collection addresses) { - this.addresses.addAll(addresses); - return this; - } - - public Builder addDnsServer(final InetAddress dnsServer) { - dnsServers.add(dnsServer); - return this; - } - - public Builder addDnsServers(final Collection dnsServers) { - this.dnsServers.addAll(dnsServers); - return this; - } - - public Interface build() throws BadConfigException { - if (keyPair == null) - throw new BadConfigException( - Section.INTERFACE, Location.PRIVATE_KEY, Reason.MISSING_ATTRIBUTE, null); - if (!includedApplications.isEmpty() && !excludedApplications.isEmpty()) - throw new BadConfigException( - Section.INTERFACE, Location.INCLUDED_APPLICATIONS, Reason.INVALID_KEY, null); - return new Interface(this); - } - - public Builder excludeApplication(final String application) { - excludedApplications.add(application); - return this; - } - - public Builder excludeApplications(final Collection applications) { - excludedApplications.addAll(applications); - return this; - } - - public Builder includeApplication(final String application) { - includedApplications.add(application); - return this; - } - - public Builder includeApplications(final Collection applications) { - includedApplications.addAll(applications); - return this; - } - - public Builder parseAddresses(final CharSequence addresses) throws BadConfigException { - try { - for (final String address : Attribute.split(addresses)) - addAddress(InetNetwork.parse(address)); - return this; - } catch (final ParseException e) { - throw new BadConfigException(Section.INTERFACE, Location.ADDRESS, e); - } - } - - public Builder parseDnsServers(final CharSequence dnsServers) throws BadConfigException { - try { - for (final String dnsServer : Attribute.split(dnsServers)) - addDnsServer(InetAddresses.parse(dnsServer)); - return this; - } catch (final ParseException e) { - throw new BadConfigException(Section.INTERFACE, Location.DNS, e); - } - } - - public Builder parseExcludedApplications(final CharSequence apps) { - return excludeApplications(List.of(Attribute.split(apps))); - } - - public Builder parseIncludedApplications(final CharSequence apps) { - return includeApplications(List.of(Attribute.split(apps))); - } - - public Builder parseListenPort(final String listenPort) throws BadConfigException { - try { - return setListenPort(Integer.parseInt(listenPort)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.LISTEN_PORT, listenPort, e); - } - } - - public Builder parseMtu(final String mtu) throws BadConfigException { - try { - return setMtu(Integer.parseInt(mtu)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.MTU, mtu, e); - } - } - - public Builder parseJc(final String jc) throws BadConfigException { - try { - return setJc(Integer.parseInt(jc)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.JC, jc, e); - } - } - - public Builder parseJmax(final String jmax) throws BadConfigException { - try { - return setJmax(Integer.parseInt(jmax)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.JMAX, jmax, e); - } - } - - public Builder parseJmin(final String jmin) throws BadConfigException { - try { - return setJmin(Integer.parseInt(jmin)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.JMIN, jmin, e); - } - } - - public Builder parseS1(final String s1) throws BadConfigException { - try { - return setS1(Integer.parseInt(s1)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.S1, s1, e); - } - } - - public Builder parseS2(final String s2) throws BadConfigException { - try { - return setS2(Integer.parseInt(s2)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.S2, s2, e); - } - } - - public Builder parseH1(final String h1) throws BadConfigException { - try { - return setH1(Long.parseLong(h1)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.H1, h1, e); - } - } - - public Builder parseH2(final String h2) throws BadConfigException { - try { - return setH2(Long.parseLong(h2)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.H2, h2, e); - } - } - - public Builder parseH3(final String h3) throws BadConfigException { - try { - return setH3(Long.parseLong(h3)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.H3, h3, e); - } - } - - public Builder parseH4(final String h4) throws BadConfigException { - try { - return setH4(Long.parseLong(h4)); - } catch (final NumberFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.H4, h4, e); - } - } - - public Builder parsePrivateKey(final String privateKey) throws BadConfigException { - try { - return setKeyPair(new KeyPair(Key.fromBase64(privateKey))); - } catch (final KeyFormatException e) { - throw new BadConfigException(Section.INTERFACE, Location.PRIVATE_KEY, e); - } - } - - public Builder setKeyPair(final KeyPair keyPair) { - this.keyPair = keyPair; - return this; - } - - public Builder setListenPort(final int listenPort) throws BadConfigException { - if (listenPort < MIN_UDP_PORT || listenPort > MAX_UDP_PORT) - throw new BadConfigException(Section.INTERFACE, Location.LISTEN_PORT, Reason.INVALID_VALUE, - String.valueOf(listenPort)); - this.listenPort = listenPort == 0 ? Optional.empty() : Optional.of(listenPort); - return this; - } - - public Builder setMtu(final int mtu) throws BadConfigException { - if (mtu < 0) - throw new BadConfigException( - Section.INTERFACE, Location.MTU, Reason.INVALID_VALUE, String.valueOf(mtu)); - this.mtu = mtu == 0 ? Optional.empty() : Optional.of(mtu); - return this; - } - - public Builder setJc(final int jc) throws BadConfigException { - if (jc < 0) - throw new BadConfigException( - Section.INTERFACE, Location.JC, Reason.INVALID_VALUE, String.valueOf(jc)); - this.jc = Optional.of(jc); - return this; - } - - public Builder setJmin(final int jmin) throws BadConfigException { - if (jmin < 0) - throw new BadConfigException( - Section.INTERFACE, Location.JMIN, Reason.INVALID_VALUE, String.valueOf(jmin)); - this.jmin = Optional.of(jmin); - return this; - } - - public Builder setJmax(final int jmax) throws BadConfigException { - if (jmax < 0) - throw new BadConfigException( - Section.INTERFACE, Location.JMAX, Reason.INVALID_VALUE, String.valueOf(jmax)); - this.jmax = Optional.of(jmax); - return this; - } - - public Builder setS1(final int s1) throws BadConfigException { - if (s1 < 0) - throw new BadConfigException( - Section.INTERFACE, Location.S1, Reason.INVALID_VALUE, String.valueOf(s1)); - this.s1 = Optional.of(s1); - return this; - } - - public Builder setS2(final int s2) throws BadConfigException { - if (s2 < 0) - throw new BadConfigException( - Section.INTERFACE, Location.S2, Reason.INVALID_VALUE, String.valueOf(s2)); - this.s2 = Optional.of(s2); - return this; - } - - public Builder setH1(final long h1) throws BadConfigException { - if (h1 < 0) - throw new BadConfigException( - Section.INTERFACE, Location.H1, Reason.INVALID_VALUE, String.valueOf(h1)); - this.h1 = Optional.of(h1); - return this; - } - - public Builder setH2(final long h2) throws BadConfigException { - if (h2 < 0) - throw new BadConfigException( - Section.INTERFACE, Location.H2, Reason.INVALID_VALUE, String.valueOf(h2)); - this.h2 = Optional.of(h2); - return this; - } - - public Builder setH3(final long h3) throws BadConfigException { - if (h3 < 0) - throw new BadConfigException( - Section.INTERFACE, Location.H3, Reason.INVALID_VALUE, String.valueOf(h3)); - this.h3 = Optional.of(h3); - return this; - } - - public Builder setH4(final long h4) throws BadConfigException { - if (h4 < 0) - throw new BadConfigException( - Section.INTERFACE, Location.H4, Reason.INVALID_VALUE, String.valueOf(h4)); - this.h4 = Optional.of(h4); - return this; - } - } -} diff --git a/client/android/src/com/wireguard/config/ParseException.java b/client/android/src/com/wireguard/config/ParseException.java deleted file mode 100644 index 57d19e9bb..000000000 --- a/client/android/src/com/wireguard/config/ParseException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import androidx.annotation.Nullable; - -/** - * - */ - -public class ParseException extends Exception { - private final Class parsingClass; - private final CharSequence text; - - public ParseException(final Class parsingClass, final CharSequence text, - @Nullable final String message, @Nullable final Throwable cause) { - super(message, cause); - this.parsingClass = parsingClass; - this.text = text; - } - - public ParseException( - final Class parsingClass, final CharSequence text, @Nullable final String message) { - this(parsingClass, text, message, null); - } - - public ParseException( - final Class parsingClass, final CharSequence text, @Nullable final Throwable cause) { - this(parsingClass, text, null, cause); - } - - public ParseException(final Class parsingClass, final CharSequence text) { - this(parsingClass, text, null, null); - } - - public Class getParsingClass() { - return parsingClass; - } - - public CharSequence getText() { - return text; - } -} diff --git a/client/android/src/com/wireguard/config/Peer.java b/client/android/src/com/wireguard/config/Peer.java deleted file mode 100644 index 8b66b7d0f..000000000 --- a/client/android/src/com/wireguard/config/Peer.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.config; - -import com.wireguard.config.BadConfigException.Location; -import com.wireguard.config.BadConfigException.Reason; -import com.wireguard.config.BadConfigException.Section; -import com.wireguard.crypto.Key; -import com.wireguard.crypto.KeyFormatException; - -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Locale; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; - -import androidx.annotation.Nullable; - -/** - * Represents the configuration for a WireGuard peer (a [Peer] block). Peers must have a public key, - * and may optionally have several other attributes. - *

- * Instances of this class are immutable. - */ - -public final class Peer { - private final Set allowedIps; - private final Optional endpoint; - private final Optional persistentKeepalive; - private final Optional preSharedKey; - private final Key publicKey; - - private Peer(final Builder builder) { - // Defensively copy to ensure immutability even if the Builder is reused. - allowedIps = Collections.unmodifiableSet(new LinkedHashSet<>(builder.allowedIps)); - endpoint = builder.endpoint; - persistentKeepalive = builder.persistentKeepalive; - preSharedKey = builder.preSharedKey; - publicKey = Objects.requireNonNull(builder.publicKey, "Peers must have a public key"); - } - - /** - * Parses an series of "KEY = VALUE" lines into a {@code Peer}. Throws {@link ParseException} if - * the input is not well-formed or contains unknown attributes. - * - * @param lines an iterable sequence of lines, containing at least a public key attribute - * @return a {@code Peer} with all of its attributes set from {@code lines} - */ - public static Peer parse(final Iterable lines) throws BadConfigException { - final Builder builder = new Builder(); - for (final CharSequence line : lines) { - final Attribute attribute = - Attribute.parse(line).orElseThrow(() - -> new BadConfigException(Section.PEER, - Location.TOP_LEVEL, Reason.SYNTAX_ERROR, line)); - switch (attribute.getKey().toLowerCase(Locale.ENGLISH)) { - case "allowedips": - builder.parseAllowedIPs(attribute.getValue()); - break; - case "endpoint": - builder.parseEndpoint(attribute.getValue()); - break; - case "persistentkeepalive": - builder.parsePersistentKeepalive(attribute.getValue()); - break; - case "presharedkey": - builder.parsePreSharedKey(attribute.getValue()); - break; - case "publickey": - builder.parsePublicKey(attribute.getValue()); - break; - default: - throw new BadConfigException( - Section.PEER, Location.TOP_LEVEL, Reason.UNKNOWN_ATTRIBUTE, attribute.getKey()); - } - } - return builder.build(); - } - - @Override - public boolean equals(final Object obj) { - if (!(obj instanceof Peer)) - return false; - final Peer other = (Peer) obj; - return allowedIps.equals(other.allowedIps) && endpoint.equals(other.endpoint) - && persistentKeepalive.equals(other.persistentKeepalive) - && preSharedKey.equals(other.preSharedKey) && publicKey.equals(other.publicKey); - } - - /** - * Returns the peer's set of allowed IPs. - * - * @return the set of allowed IPs - */ - public Set getAllowedIps() { - // The collection is already immutable. - return allowedIps; - } - - /** - * Returns the peer's endpoint. - * - * @return the endpoint, or {@code Optional.empty()} if none is configured - */ - public Optional getEndpoint() { - return endpoint; - } - - /** - * Returns the peer's persistent keepalive. - * - * @return the persistent keepalive, or {@code Optional.empty()} if none is configured - */ - public Optional getPersistentKeepalive() { - return persistentKeepalive; - } - - /** - * Returns the peer's pre-shared key. - * - * @return the pre-shared key, or {@code Optional.empty()} if none is configured - */ - public Optional getPreSharedKey() { - return preSharedKey; - } - - /** - * Returns the peer's public key. - * - * @return the public key - */ - public Key getPublicKey() { - return publicKey; - } - - @Override - public int hashCode() { - int hash = 1; - hash = 31 * hash + allowedIps.hashCode(); - hash = 31 * hash + endpoint.hashCode(); - hash = 31 * hash + persistentKeepalive.hashCode(); - hash = 31 * hash + preSharedKey.hashCode(); - hash = 31 * hash + publicKey.hashCode(); - return hash; - } - - /** - * Converts the {@code Peer} into a string suitable for debugging purposes. The {@code Peer} is - * identified by its public key and (if known) its endpoint. - * - * @return a concise single-line identifier for the {@code Peer} - */ - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("(Peer "); - sb.append(publicKey.toBase64()); - endpoint.ifPresent(ep -> sb.append(" @").append(ep)); - sb.append(')'); - return sb.toString(); - } - - /** - * Converts the {@code Peer} into a string suitable for inclusion in a {@code wg-quick} - * configuration file. - * - * @return the {@code Peer} represented as a series of "Key = Value" lines - */ - public String toWgQuickString() { - final StringBuilder sb = new StringBuilder(); - if (!allowedIps.isEmpty()) - sb.append("AllowedIPs = ").append(Attribute.join(allowedIps)).append('\n'); - endpoint.ifPresent(ep -> sb.append("Endpoint = ").append(ep).append('\n')); - persistentKeepalive.ifPresent( - pk -> sb.append("PersistentKeepalive = ").append(pk).append('\n')); - preSharedKey.ifPresent(psk -> sb.append("PreSharedKey = ").append(psk.toBase64()).append('\n')); - sb.append("PublicKey = ").append(publicKey.toBase64()).append('\n'); - return sb.toString(); - } - - /** - * Serializes the {@code Peer} for use with the WireGuard cross-platform userspace API. Note - * that not all attributes are included in this representation. - * - * @return the {@code Peer} represented as a series of "key=value" lines - */ - public String toWgUserspaceString() { - final StringBuilder sb = new StringBuilder(); - // The order here is important: public_key signifies the beginning of a new peer. - sb.append("public_key=").append(publicKey.toHex()).append('\n'); - for (final InetNetwork allowedIp : allowedIps) - sb.append("allowed_ip=").append(allowedIp).append('\n'); - endpoint.flatMap(InetEndpoint::getResolved) - .ifPresent(ep -> sb.append("endpoint=").append(ep).append('\n')); - persistentKeepalive.ifPresent( - pk -> sb.append("persistent_keepalive_interval=").append(pk).append('\n')); - preSharedKey.ifPresent(psk -> sb.append("preshared_key=").append(psk.toHex()).append('\n')); - return sb.toString(); - } - - @SuppressWarnings("UnusedReturnValue") - public static final class Builder { - // See wg(8) - private static final int MAX_PERSISTENT_KEEPALIVE = 65535; - - // Defaults to an empty set. - private final Set allowedIps = new LinkedHashSet<>(); - // Defaults to not present. - private Optional endpoint = Optional.empty(); - // Defaults to not present. - private Optional persistentKeepalive = Optional.empty(); - // Defaults to not present. - private Optional preSharedKey = Optional.empty(); - // No default; must be provided before building. - @Nullable private Key publicKey; - - public Builder addAllowedIp(final InetNetwork allowedIp) { - allowedIps.add(allowedIp); - return this; - } - - public Builder addAllowedIps(final Collection allowedIps) { - this.allowedIps.addAll(allowedIps); - return this; - } - - public Peer build() throws BadConfigException { - if (publicKey == null) - throw new BadConfigException( - Section.PEER, Location.PUBLIC_KEY, Reason.MISSING_ATTRIBUTE, null); - return new Peer(this); - } - - public Builder parseAllowedIPs(final CharSequence allowedIps) throws BadConfigException { - try { - for (final String allowedIp : Attribute.split(allowedIps)) - addAllowedIp(InetNetwork.parse(allowedIp)); - return this; - } catch (final ParseException e) { - throw new BadConfigException(Section.PEER, Location.ALLOWED_IPS, e); - } - } - - public Builder parseEndpoint(final String endpoint) throws BadConfigException { - try { - return setEndpoint(InetEndpoint.parse(endpoint)); - } catch (final ParseException e) { - throw new BadConfigException(Section.PEER, Location.ENDPOINT, e); - } - } - - public Builder parsePersistentKeepalive(final String persistentKeepalive) - throws BadConfigException { - try { - return setPersistentKeepalive(Integer.parseInt(persistentKeepalive)); - } catch (final NumberFormatException e) { - throw new BadConfigException( - Section.PEER, Location.PERSISTENT_KEEPALIVE, persistentKeepalive, e); - } - } - - public Builder parsePreSharedKey(final String preSharedKey) throws BadConfigException { - try { - return setPreSharedKey(Key.fromBase64(preSharedKey)); - } catch (final KeyFormatException e) { - throw new BadConfigException(Section.PEER, Location.PRE_SHARED_KEY, e); - } - } - - public Builder parsePublicKey(final String publicKey) throws BadConfigException { - try { - return setPublicKey(Key.fromBase64(publicKey)); - } catch (final KeyFormatException e) { - throw new BadConfigException(Section.PEER, Location.PUBLIC_KEY, e); - } - } - - public Builder setEndpoint(final InetEndpoint endpoint) { - this.endpoint = Optional.of(endpoint); - return this; - } - - public Builder setPersistentKeepalive(final int persistentKeepalive) throws BadConfigException { - if (persistentKeepalive < 0 || persistentKeepalive > MAX_PERSISTENT_KEEPALIVE) - throw new BadConfigException(Section.PEER, Location.PERSISTENT_KEEPALIVE, - Reason.INVALID_VALUE, String.valueOf(persistentKeepalive)); - this.persistentKeepalive = - persistentKeepalive == 0 ? Optional.empty() : Optional.of(persistentKeepalive); - return this; - } - - public Builder setPreSharedKey(final Key preSharedKey) { - this.preSharedKey = Optional.of(preSharedKey); - return this; - } - - public Builder setPublicKey(final Key publicKey) { - this.publicKey = publicKey; - return this; - } - } -} diff --git a/client/android/src/com/wireguard/config/Utils.java b/client/android/src/com/wireguard/config/Utils.java deleted file mode 100644 index 58b2eb5f3..000000000 --- a/client/android/src/com/wireguard/config/Utils.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2014-2019 Tobias Brunner - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -package com.wireguard.config; - - -import java.net.InetAddress; -import java.net.UnknownHostException; - -public class Utils -{ - static final char[] HEXDIGITS = "0123456789abcdef".toCharArray(); - - /** - * Converts the given byte array to a hexadecimal string encoding. - * - * @param bytes byte array to convert - * @return hex string - */ - public static String bytesToHex(byte[] bytes) - { - char[] hex = new char[bytes.length * 2]; - for (int i = 0; i < bytes.length; i++) - { - int value = bytes[i]; - hex[i*2] = HEXDIGITS[(value & 0xf0) >> 4]; - hex[i*2+1] = HEXDIGITS[ value & 0x0f]; - } - return new String(hex); - } - - /** - * Validate the given proposal string - * - * @param ike true for IKE, false for ESP - * @param proposal proposal string - * @return true if valid - */ - public native static boolean isProposalValid(boolean ike, String proposal); - - /** - * Parse an IP address without doing a name lookup - * - * @param address IP address string - * @return address bytes if valid - */ - private native static byte[] parseInetAddressBytes(String address); - - /** - * Parse an IP address without doing a name lookup (as compared to InetAddress.fromName()) - * - * @param address IP address string - * @return address if valid - * @throws UnknownHostException if address is invalid - */ - public static InetAddress parseInetAddress(String address) throws UnknownHostException - { - byte[] bytes = parseInetAddressBytes(address); - if (bytes == null) - { - throw new UnknownHostException(); - } - return InetAddress.getByAddress(bytes); - } -} diff --git a/client/android/src/com/wireguard/crypto/Curve25519.java b/client/android/src/com/wireguard/crypto/Curve25519.java deleted file mode 100644 index 9c3142021..000000000 --- a/client/android/src/com/wireguard/crypto/Curve25519.java +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright © 2016 Southern Storm Software, Pty Ltd. - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.crypto; - -import java.util.Arrays; - -import androidx.annotation.Nullable; - -/** - * Implementation of Curve25519 ECDH. - *

- * This implementation was imported to WireGuard from noise-java: - * https://github.com/rweather/noise-java - *

- * This implementation is based on that from arduinolibs: - * https://github.com/rweather/arduinolibs - *

- * Differences in this version are due to using 26-bit limbs for the - * representation instead of the 8/16/32-bit limbs in the original. - *

- * References: http://cr.yp.to/ecdh.html, RFC 7748 - */ -@SuppressWarnings({"MagicNumber", "NonConstantFieldWithUpperCaseName", "SuspiciousNameCombination"}) - -public final class Curve25519 { - // Numbers modulo 2^255 - 19 are broken up into ten 26-bit words. - private static final int NUM_LIMBS_255BIT = 10; - private static final int NUM_LIMBS_510BIT = 20; - - private final int[] A; - private final int[] AA; - private final int[] B; - private final int[] BB; - private final int[] C; - private final int[] CB; - private final int[] D; - private final int[] DA; - private final int[] E; - private final long[] t1; - private final int[] t2; - private final int[] x_1; - private final int[] x_2; - private final int[] x_3; - private final int[] z_2; - private final int[] z_3; - - /** - * Constructs the temporary state holder for Curve25519 evaluation. - */ - private Curve25519() { - // Allocate memory for all of the temporary variables we will need. - x_1 = new int[NUM_LIMBS_255BIT]; - x_2 = new int[NUM_LIMBS_255BIT]; - x_3 = new int[NUM_LIMBS_255BIT]; - z_2 = new int[NUM_LIMBS_255BIT]; - z_3 = new int[NUM_LIMBS_255BIT]; - A = new int[NUM_LIMBS_255BIT]; - B = new int[NUM_LIMBS_255BIT]; - C = new int[NUM_LIMBS_255BIT]; - D = new int[NUM_LIMBS_255BIT]; - E = new int[NUM_LIMBS_255BIT]; - AA = new int[NUM_LIMBS_255BIT]; - BB = new int[NUM_LIMBS_255BIT]; - DA = new int[NUM_LIMBS_255BIT]; - CB = new int[NUM_LIMBS_255BIT]; - t1 = new long[NUM_LIMBS_510BIT]; - t2 = new int[NUM_LIMBS_510BIT]; - } - - /** - * Conditional swap of two values. - * - * @param select Set to 1 to swap, 0 to leave as-is. - * @param x The first value. - * @param y The second value. - */ - private static void cswap(int select, final int[] x, final int[] y) { - select = -select; - for (int index = 0; index < NUM_LIMBS_255BIT; ++index) { - final int dummy = select & (x[index] ^ y[index]); - x[index] ^= dummy; - y[index] ^= dummy; - } - } - - /** - * Evaluates the Curve25519 curve. - * - * @param result Buffer to place the result of the evaluation into. - * @param offset Offset into the result buffer. - * @param privateKey The private key to use in the evaluation. - * @param publicKey The public key to use in the evaluation, or null - * if the base point of the curve should be used. - */ - public static void eval(final byte[] result, final int offset, final byte[] privateKey, - @Nullable final byte[] publicKey) { - final Curve25519 state = new Curve25519(); - try { - // Unpack the public key value. If null, use 9 as the base point. - Arrays.fill(state.x_1, 0); - if (publicKey != null) { - // Convert the input value from little-endian into 26-bit limbs. - for (int index = 0; index < 32; ++index) { - final int bit = (index * 8) % 26; - final int word = (index * 8) / 26; - final int value = publicKey[index] & 0xFF; - if (bit <= (26 - 8)) { - state.x_1[word] |= value << bit; - } else { - state.x_1[word] |= value << bit; - state.x_1[word] &= 0x03FFFFFF; - state.x_1[word + 1] |= value >> (26 - bit); - } - } - - // Just in case, we reduce the number modulo 2^255 - 19 to - // make sure that it is in range of the field before we start. - // This eliminates values between 2^255 - 19 and 2^256 - 1. - state.reduceQuick(state.x_1); - state.reduceQuick(state.x_1); - } else { - state.x_1[0] = 9; - } - - // Initialize the other temporary variables. - Arrays.fill(state.x_2, 0); // x_2 = 1 - state.x_2[0] = 1; - Arrays.fill(state.z_2, 0); // z_2 = 0 - System.arraycopy(state.x_1, 0, state.x_3, 0, state.x_1.length); // x_3 = x_1 - Arrays.fill(state.z_3, 0); // z_3 = 1 - state.z_3[0] = 1; - - // Evaluate the curve for every bit of the private key. - state.evalCurve(privateKey); - - // Compute x_2 * (z_2 ^ (p - 2)) where p = 2^255 - 19. - state.recip(state.z_3, state.z_2); - state.mul(state.x_2, state.x_2, state.z_3); - - // Convert x_2 into little-endian in the result buffer. - for (int index = 0; index < 32; ++index) { - final int bit = (index * 8) % 26; - final int word = (index * 8) / 26; - if (bit <= (26 - 8)) - result[offset + index] = (byte) (state.x_2[word] >> bit); - else - result[offset + index] = - (byte) ((state.x_2[word] >> bit) | (state.x_2[word + 1] << (26 - bit))); - } - } finally { - // Clean up all temporary state before we exit. - state.destroy(); - } - } - - /** - * Subtracts two numbers modulo 2^255 - 19. - * - * @param result The result. - * @param x The first number to subtract. - * @param y The second number to subtract. - */ - private static void sub(final int[] result, final int[] x, final int[] y) { - int index; - int borrow; - - // Subtract y from x to generate the intermediate result. - borrow = 0; - for (index = 0; index < NUM_LIMBS_255BIT; ++index) { - borrow = x[index] - y[index] - ((borrow >> 26) & 0x01); - result[index] = borrow & 0x03FFFFFF; - } - - // If we had a borrow, then the result has gone negative and we - // have to add 2^255 - 19 to the result to make it positive again. - // The top bits of "borrow" will be all 1's if there is a borrow - // or it will be all 0's if there was no borrow. Easiest is to - // conditionally subtract 19 and then mask off the high bits. - borrow = result[0] - ((-((borrow >> 26) & 0x01)) & 19); - result[0] = borrow & 0x03FFFFFF; - for (index = 1; index < NUM_LIMBS_255BIT; ++index) { - borrow = result[index] - ((borrow >> 26) & 0x01); - result[index] = borrow & 0x03FFFFFF; - } - result[NUM_LIMBS_255BIT - 1] &= 0x001FFFFF; - } - - /** - * Adds two numbers modulo 2^255 - 19. - * - * @param result The result. - * @param x The first number to add. - * @param y The second number to add. - */ - private void add(final int[] result, final int[] x, final int[] y) { - int carry = x[0] + y[0]; - result[0] = carry & 0x03FFFFFF; - for (int index = 1; index < NUM_LIMBS_255BIT; ++index) { - carry = (carry >> 26) + x[index] + y[index]; - result[index] = carry & 0x03FFFFFF; - } - reduceQuick(result); - } - - /** - * Destroy all sensitive data in this object. - */ - private void destroy() { - // Destroy all temporary variables. - Arrays.fill(x_1, 0); - Arrays.fill(x_2, 0); - Arrays.fill(x_3, 0); - Arrays.fill(z_2, 0); - Arrays.fill(z_3, 0); - Arrays.fill(A, 0); - Arrays.fill(B, 0); - Arrays.fill(C, 0); - Arrays.fill(D, 0); - Arrays.fill(E, 0); - Arrays.fill(AA, 0); - Arrays.fill(BB, 0); - Arrays.fill(DA, 0); - Arrays.fill(CB, 0); - Arrays.fill(t1, 0L); - Arrays.fill(t2, 0); - } - - /** - * Evaluates the curve for every bit in a secret key. - * - * @param s The 32-byte secret key. - */ - private void evalCurve(final byte[] s) { - int sposn = 31; - int sbit = 6; - int svalue = s[sposn] | 0x40; - int swap = 0; - - // Iterate over all 255 bits of "s" from the highest to the lowest. - // We ignore the high bit of the 256-bit representation of "s". - while (true) { - // Conditional swaps on entry to this bit but only if we - // didn't swap on the previous bit. - final int select = (svalue >> sbit) & 0x01; - swap ^= select; - cswap(swap, x_2, x_3); - cswap(swap, z_2, z_3); - swap = select; - - // Evaluate the curve. - add(A, x_2, z_2); // A = x_2 + z_2 - square(AA, A); // AA = A^2 - sub(B, x_2, z_2); // B = x_2 - z_2 - square(BB, B); // BB = B^2 - sub(E, AA, BB); // E = AA - BB - add(C, x_3, z_3); // C = x_3 + z_3 - sub(D, x_3, z_3); // D = x_3 - z_3 - mul(DA, D, A); // DA = D * A - mul(CB, C, B); // CB = C * B - add(x_3, DA, CB); // x_3 = (DA + CB)^2 - square(x_3, x_3); - sub(z_3, DA, CB); // z_3 = x_1 * (DA - CB)^2 - square(z_3, z_3); - mul(z_3, z_3, x_1); - mul(x_2, AA, BB); // x_2 = AA * BB - mulA24(z_2, E); // z_2 = E * (AA + a24 * E) - add(z_2, z_2, AA); - mul(z_2, z_2, E); - - // Move onto the next lower bit of "s". - if (sbit > 0) { - --sbit; - } else if (sposn == 0) { - break; - } else if (sposn == 1) { - --sposn; - svalue = s[sposn] & 0xF8; - sbit = 7; - } else { - --sposn; - svalue = s[sposn]; - sbit = 7; - } - } - - // Final conditional swaps. - cswap(swap, x_2, x_3); - cswap(swap, z_2, z_3); - } - - /** - * Multiplies two numbers modulo 2^255 - 19. - * - * @param result The result. - * @param x The first number to multiply. - * @param y The second number to multiply. - */ - private void mul(final int[] result, final int[] x, final int[] y) { - // Multiply the two numbers to create the intermediate result. - long v = x[0]; - for (int i = 0; i < NUM_LIMBS_255BIT; ++i) { - t1[i] = v * y[i]; - } - for (int i = 1; i < NUM_LIMBS_255BIT; ++i) { - v = x[i]; - for (int j = 0; j < (NUM_LIMBS_255BIT - 1); ++j) { - t1[i + j] += v * y[j]; - } - t1[i + NUM_LIMBS_255BIT - 1] = v * y[NUM_LIMBS_255BIT - 1]; - } - - // Propagate carries and convert back into 26-bit words. - v = t1[0]; - t2[0] = ((int) v) & 0x03FFFFFF; - for (int i = 1; i < NUM_LIMBS_510BIT; ++i) { - v = (v >> 26) + t1[i]; - t2[i] = ((int) v) & 0x03FFFFFF; - } - - // Reduce the result modulo 2^255 - 19. - reduce(result, t2, NUM_LIMBS_255BIT); - } - - /** - * Multiplies a number by the a24 constant, modulo 2^255 - 19. - * - * @param result The result. - * @param x The number to multiply by a24. - */ - private void mulA24(final int[] result, final int[] x) { - final long a24 = 121665; - long carry = 0; - for (int index = 0; index < NUM_LIMBS_255BIT; ++index) { - carry += a24 * x[index]; - t2[index] = ((int) carry) & 0x03FFFFFF; - carry >>= 26; - } - t2[NUM_LIMBS_255BIT] = ((int) carry) & 0x03FFFFFF; - reduce(result, t2, 1); - } - - /** - * Raise x to the power of (2^250 - 1). - * - * @param result The result. Must not overlap with x. - * @param x The argument. - */ - private void pow250(final int[] result, final int[] x) { - // The big-endian hexadecimal expansion of (2^250 - 1) is: - // 03FFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF - // - // The naive implementation needs to do 2 multiplications per 1 bit and - // 1 multiplication per 0 bit. We can improve upon this by creating a - // pattern 0000000001 ... 0000000001. If we square and multiply the - // pattern by itself we can turn the pattern into the partial results - // 0000000011 ... 0000000011, 0000000111 ... 0000000111, etc. - // This averages out to about 1.1 multiplications per 1 bit instead of 2. - - // Build a pattern of 250 bits in length of repeated copies of 0000000001. - square(A, x); - for (int j = 0; j < 9; ++j) square(A, A); - mul(result, A, x); - for (int i = 0; i < 23; ++i) { - for (int j = 0; j < 10; ++j) square(A, A); - mul(result, result, A); - } - - // Multiply bit-shifted versions of the 0000000001 pattern into - // the result to "fill in" the gaps in the pattern. - square(A, result); - mul(result, result, A); - for (int j = 0; j < 8; ++j) { - square(A, A); - mul(result, result, A); - } - } - - /** - * Computes the reciprocal of a number modulo 2^255 - 19. - * - * @param result The result. Must not overlap with x. - * @param x The argument. - */ - private void recip(final int[] result, final int[] x) { - // The reciprocal is the same as x ^ (p - 2) where p = 2^255 - 19. - // The big-endian hexadecimal expansion of (p - 2) is: - // 7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFEB - // Start with the 250 upper bits of the expansion of (p - 2). - pow250(result, x); - - // Deal with the 5 lowest bits of (p - 2), 01011, from highest to lowest. - square(result, result); - square(result, result); - mul(result, result, x); - square(result, result); - square(result, result); - mul(result, result, x); - square(result, result); - mul(result, result, x); - } - - /** - * Reduce a number modulo 2^255 - 19. - * - * @param result The result. - * @param x The value to be reduced. This array will be - * modified during the reduction. - * @param size The number of limbs in the high order half of x. - */ - private void reduce(final int[] result, final int[] x, final int size) { - // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will - // either produce the answer we want or it will produce a - // value of the form "answer + j * (2^255 - 19)". There are - // 5 left-over bits in the top-most limb of the bottom half. - int carry = 0; - int limb = x[NUM_LIMBS_255BIT - 1] >> 21; - x[NUM_LIMBS_255BIT - 1] &= 0x001FFFFF; - for (int index = 0; index < size; ++index) { - limb += x[NUM_LIMBS_255BIT + index] << 5; - carry += (limb & 0x03FFFFFF) * 19 + x[index]; - x[index] = carry & 0x03FFFFFF; - limb >>= 26; - carry >>= 26; - } - if (size < NUM_LIMBS_255BIT) { - // The high order half of the number is short; e.g. for mulA24(). - // Propagate the carry through the rest of the low order part. - for (int index = size; index < NUM_LIMBS_255BIT; ++index) { - carry += x[index]; - x[index] = carry & 0x03FFFFFF; - carry >>= 26; - } - } - - // The "j" value may still be too large due to the final carry-out. - // We must repeat the reduction. If we already have the answer, - // then this won't do any harm but we must still do the calculation - // to preserve the overall timing. The "j" value will be between - // 0 and 19, which means that the carry we care about is in the - // top 5 bits of the highest limb of the bottom half. - carry = (x[NUM_LIMBS_255BIT - 1] >> 21) * 19; - x[NUM_LIMBS_255BIT - 1] &= 0x001FFFFF; - for (int index = 0; index < NUM_LIMBS_255BIT; ++index) { - carry += x[index]; - result[index] = carry & 0x03FFFFFF; - carry >>= 26; - } - - // At this point "x" will either be the answer or it will be the - // answer plus (2^255 - 19). Perform a trial subtraction to - // complete the reduction process. - reduceQuick(result); - } - - /** - * Reduces a number modulo 2^255 - 19 where it is known that the - * number can be reduced with only 1 trial subtraction. - * - * @param x The number to reduce, and the result. - */ - private void reduceQuick(final int[] x) { - // Perform a trial subtraction of (2^255 - 19) from "x" which is - // equivalent to adding 19 and subtracting 2^255. We add 19 here; - // the subtraction of 2^255 occurs in the next step. - int carry = 19; - for (int index = 0; index < NUM_LIMBS_255BIT; ++index) { - carry += x[index]; - t2[index] = carry & 0x03FFFFFF; - carry >>= 26; - } - - // If there was a borrow, then the original "x" is the correct answer. - // If there was no borrow, then "t2" is the correct answer. Select the - // correct answer but do it in a way that instruction timing will not - // reveal which value was selected. Borrow will occur if bit 21 of - // "t2" is zero. Turn the bit into a selection mask. - final int mask = -((t2[NUM_LIMBS_255BIT - 1] >> 21) & 0x01); - final int nmask = ~mask; - t2[NUM_LIMBS_255BIT - 1] &= 0x001FFFFF; - for (int index = 0; index < NUM_LIMBS_255BIT; ++index) - x[index] = (x[index] & nmask) | (t2[index] & mask); - } - - /** - * Squares a number modulo 2^255 - 19. - * - * @param result The result. - * @param x The number to square. - */ - private void square(final int[] result, final int[] x) { - mul(result, x, x); - } -} diff --git a/client/android/src/com/wireguard/crypto/Ed25519.java b/client/android/src/com/wireguard/crypto/Ed25519.java deleted file mode 100644 index 087a23d68..000000000 --- a/client/android/src/com/wireguard/crypto/Ed25519.java +++ /dev/null @@ -1,2435 +0,0 @@ -/* - * Copyright © 2020 WireGuard LLC. All Rights Reserved. - * Copyright 2017 Google Inc. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.crypto; - -import java.math.BigInteger; -import java.security.GeneralSecurityException; -import java.security.MessageDigest; -import java.util.Arrays; - -/** - * Implementation of Ed25519 signature verification. - * - *

This implementation is based on the ed25519/ref10 implementation in NaCl.

- * - *

It implements this twisted Edwards curve: - * - *

- * -x^2 + y^2 = 1 + (-121665 / 121666 mod 2^255-19)*x^2*y^2
- * 
- * - * @see Bernstein D.J., Birkner P., Joye M., Lange - * T., Peters C. (2008) Twisted Edwards Curves - * @see Hisil H., Wong K.KH., Carter G., Dawson E. - * (2008) Twisted Edwards Curves Revisited - */ -public final class Ed25519 { - // d = -121665 / 121666 mod 2^255-19 - private static final long[] D; - // 2d - private static final long[] D2; - // 2^((p-1)/4) mod p where p = 2^255-19 - private static final long[] SQRTM1; - - /** - * Base point for the Edwards twisted curve = (x, 4/5) and its exponentiations. B_TABLE[i][j] = - * (j+1)*256^i*B for i in [0, 32) and j in [0, 8). Base point B = B_TABLE[0][0] - */ - private static final CachedXYT[][] B_TABLE; - private static final CachedXYT[] B2; - - private static final BigInteger P_BI = - BigInteger.valueOf(2).pow(255).subtract(BigInteger.valueOf(19)); - private static final BigInteger D_BI = - BigInteger.valueOf(-121665).multiply(BigInteger.valueOf(121666).modInverse(P_BI)).mod(P_BI); - private static final BigInteger D2_BI = BigInteger.valueOf(2).multiply(D_BI).mod(P_BI); - private static final BigInteger SQRTM1_BI = BigInteger.valueOf(2).modPow( - P_BI.subtract(BigInteger.ONE).divide(BigInteger.valueOf(4)), P_BI); - - private Ed25519() {} - - private static class Point { - private BigInteger x; - private BigInteger y; - } - - private static BigInteger recoverX(BigInteger y) { - // x^2 = (y^2 - 1) / (d * y^2 + 1) mod 2^255-19 - BigInteger xx = y.pow(2) - .subtract(BigInteger.ONE) - .multiply(D_BI.multiply(y.pow(2)).add(BigInteger.ONE).modInverse(P_BI)); - BigInteger x = xx.modPow(P_BI.add(BigInteger.valueOf(3)).divide(BigInteger.valueOf(8)), P_BI); - if (!x.pow(2).subtract(xx).mod(P_BI).equals(BigInteger.ZERO)) { - x = x.multiply(SQRTM1_BI).mod(P_BI); - } - if (x.testBit(0)) { - x = P_BI.subtract(x); - } - return x; - } - - private static Point edwards(Point a, Point b) { - Point o = new Point(); - BigInteger xxyy = D_BI.multiply(a.x.multiply(b.x).multiply(a.y).multiply(b.y)).mod(P_BI); - o.x = (a.x.multiply(b.y).add(b.x.multiply(a.y))) - .multiply(BigInteger.ONE.add(xxyy).modInverse(P_BI)) - .mod(P_BI); - o.y = (a.y.multiply(b.y).add(a.x.multiply(b.x))) - .multiply(BigInteger.ONE.subtract(xxyy).modInverse(P_BI)) - .mod(P_BI); - return o; - } - - private static byte[] toLittleEndian(BigInteger n) { - byte[] b = new byte[32]; - byte[] nBytes = n.toByteArray(); - System.arraycopy(nBytes, 0, b, 32 - nBytes.length, nBytes.length); - for (int i = 0; i < b.length / 2; i++) { - byte t = b[i]; - b[i] = b[b.length - i - 1]; - b[b.length - i - 1] = t; - } - return b; - } - - private static CachedXYT getCachedXYT(Point p) { - return new CachedXYT(Field25519.expand(toLittleEndian(p.y.add(p.x).mod(P_BI))), - Field25519.expand(toLittleEndian(p.y.subtract(p.x).mod(P_BI))), - Field25519.expand(toLittleEndian(D2_BI.multiply(p.x).multiply(p.y).mod(P_BI)))); - } - - static { - Point b = new Point(); - b.y = BigInteger.valueOf(4).multiply(BigInteger.valueOf(5).modInverse(P_BI)).mod(P_BI); - b.x = recoverX(b.y); - - D = Field25519.expand(toLittleEndian(D_BI)); - D2 = Field25519.expand(toLittleEndian(D2_BI)); - SQRTM1 = Field25519.expand(toLittleEndian(SQRTM1_BI)); - - Point bi = b; - B_TABLE = new CachedXYT[32][8]; - for (int i = 0; i < 32; i++) { - Point bij = bi; - for (int j = 0; j < 8; j++) { - B_TABLE[i][j] = getCachedXYT(bij); - bij = edwards(bij, bi); - } - for (int j = 0; j < 8; j++) { - bi = edwards(bi, bi); - } - } - bi = b; - Point b2 = edwards(b, b); - B2 = new CachedXYT[8]; - for (int i = 0; i < 8; i++) { - B2[i] = getCachedXYT(bi); - bi = edwards(bi, b2); - } - } - - private static final int PUBLIC_KEY_LEN = Field25519.FIELD_LEN; - private static final int SIGNATURE_LEN = Field25519.FIELD_LEN * 2; - - /** - * Defines field 25519 function based on curve25519-donna - * C implementation (mostly identical). - * - *

Field elements are written as an array of signed, 64-bit limbs (an array of longs), least - * significant first. The value of the field element is: - * - *

-   * x[0] + 2^26·x[1] + 2^51·x[2] + 2^77·x[3] + 2^102·x[4] + 2^128·x[5] + 2^153·x[6] + 2^179·x[7] +
-   * 2^204·x[8] + 2^230·x[9],
-   * 
- * - *

i.e. the limbs are 26, 25, 26, 25, ... bits wide. - */ - private static final class Field25519 { - /** - * During Field25519 computation, the mixed radix representation may be in different forms: - *

    - *
  • Reduced-size form: the array has size at most 10. - *
  • Non-reduced-size form: the array is not reduced modulo 2^255 - 19 and has size at most - * 19. - *
- *

- * TODO(quannguyen): - *

    - *
  • Clarify ill-defined terminologies. - *
  • The reduction procedure is different from DJB's paper - * (http://cr.yp.to/ecdh/curve25519-20060209.pdf). The coefficients after reducing degree and - * reducing coefficients aren't guaranteed to be in range {-2^25, ..., 2^25}. We should check - * to see what's going on.
  • Consider using method mult() everywhere and making product() - * private. - *
- */ - - static final int FIELD_LEN = 32; - static final int LIMB_CNT = 10; - private static final long TWO_TO_25 = 1 << 25; - private static final long TWO_TO_26 = TWO_TO_25 << 1; - - private static final int[] EXPAND_START = {0, 3, 6, 9, 12, 16, 19, 22, 25, 28}; - private static final int[] EXPAND_SHIFT = {0, 2, 3, 5, 6, 0, 1, 3, 4, 6}; - private static final int[] MASK = {0x3ffffff, 0x1ffffff}; - private static final int[] SHIFT = {26, 25}; - - /** - * Sums two numbers: output = in1 + in2 - *

- * On entry: in1, in2 are in reduced-size form. - */ - static void sum(long[] output, long[] in1, long[] in2) { - for (int i = 0; i < LIMB_CNT; i++) { - output[i] = in1[i] + in2[i]; - } - } - - /** - * Sums two numbers: output += in - *

- * On entry: in is in reduced-size form. - */ - static void sum(long[] output, long[] in) { - sum(output, output, in); - } - - /** - * Find the difference of two numbers: output = in1 - in2 - * (note the order of the arguments!). - *

- * On entry: in1, in2 are in reduced-size form. - */ - static void sub(long[] output, long[] in1, long[] in2) { - for (int i = 0; i < LIMB_CNT; i++) { - output[i] = in1[i] - in2[i]; - } - } - - /** - * Find the difference of two numbers: output = in - output - * (note the order of the arguments!). - *

- * On entry: in, output are in reduced-size form. - */ - static void sub(long[] output, long[] in) { - sub(output, in, output); - } - - /** - * Multiply a number by a scalar: output = in * scalar - */ - static void scalarProduct(long[] output, long[] in, long scalar) { - for (int i = 0; i < LIMB_CNT; i++) { - output[i] = in[i] * scalar; - } - } - - /** - * Multiply two numbers: out = in2 * in - *

- * output must be distinct to both inputs. The inputs are reduced coefficient form, - * the output is not. - *

- * out[x] <= 14 * the largest product of the input limbs. - */ - static void product(long[] out, long[] in2, long[] in) { - out[0] = in2[0] * in[0]; - out[1] = in2[0] * in[1] + in2[1] * in[0]; - out[2] = 2 * in2[1] * in[1] + in2[0] * in[2] + in2[2] * in[0]; - out[3] = in2[1] * in[2] + in2[2] * in[1] + in2[0] * in[3] + in2[3] * in[0]; - out[4] = - in2[2] * in[2] + 2 * (in2[1] * in[3] + in2[3] * in[1]) + in2[0] * in[4] + in2[4] * in[0]; - out[5] = in2[2] * in[3] + in2[3] * in[2] + in2[1] * in[4] + in2[4] * in[1] + in2[0] * in[5] - + in2[5] * in[0]; - out[6] = 2 * (in2[3] * in[3] + in2[1] * in[5] + in2[5] * in[1]) + in2[2] * in[4] - + in2[4] * in[2] + in2[0] * in[6] + in2[6] * in[0]; - out[7] = in2[3] * in[4] + in2[4] * in[3] + in2[2] * in[5] + in2[5] * in[2] + in2[1] * in[6] - + in2[6] * in[1] + in2[0] * in[7] + in2[7] * in[0]; - out[8] = in2[4] * in[4] - + 2 * (in2[3] * in[5] + in2[5] * in[3] + in2[1] * in[7] + in2[7] * in[1]) + in2[2] * in[6] - + in2[6] * in[2] + in2[0] * in[8] + in2[8] * in[0]; - out[9] = in2[4] * in[5] + in2[5] * in[4] + in2[3] * in[6] + in2[6] * in[3] + in2[2] * in[7] - + in2[7] * in[2] + in2[1] * in[8] + in2[8] * in[1] + in2[0] * in[9] + in2[9] * in[0]; - out[10] = - 2 * (in2[5] * in[5] + in2[3] * in[7] + in2[7] * in[3] + in2[1] * in[9] + in2[9] * in[1]) - + in2[4] * in[6] + in2[6] * in[4] + in2[2] * in[8] + in2[8] * in[2]; - out[11] = in2[5] * in[6] + in2[6] * in[5] + in2[4] * in[7] + in2[7] * in[4] + in2[3] * in[8] - + in2[8] * in[3] + in2[2] * in[9] + in2[9] * in[2]; - out[12] = in2[6] * in[6] - + 2 * (in2[5] * in[7] + in2[7] * in[5] + in2[3] * in[9] + in2[9] * in[3]) + in2[4] * in[8] - + in2[8] * in[4]; - out[13] = in2[6] * in[7] + in2[7] * in[6] + in2[5] * in[8] + in2[8] * in[5] + in2[4] * in[9] - + in2[9] * in[4]; - out[14] = - 2 * (in2[7] * in[7] + in2[5] * in[9] + in2[9] * in[5]) + in2[6] * in[8] + in2[8] * in[6]; - out[15] = in2[7] * in[8] + in2[8] * in[7] + in2[6] * in[9] + in2[9] * in[6]; - out[16] = in2[8] * in[8] + 2 * (in2[7] * in[9] + in2[9] * in[7]); - out[17] = in2[8] * in[9] + in2[9] * in[8]; - out[18] = 2 * in2[9] * in[9]; - } - - /** - * Reduce a field element by calling reduceSizeByModularReduction and reduceCoefficients. - * - * @param input An input array of any length. If the array has 19 elements, it will be used as - * temporary buffer and its contents changed. - * @param output An output array of size LIMB_CNT. After the call |output[i]| < 2^26 will hold. - */ - static void reduce(long[] input, long[] output) { - long[] tmp; - if (input.length == 19) { - tmp = input; - } else { - tmp = new long[19]; - System.arraycopy(input, 0, tmp, 0, input.length); - } - reduceSizeByModularReduction(tmp); - reduceCoefficients(tmp); - System.arraycopy(tmp, 0, output, 0, LIMB_CNT); - } - - /** - * Reduce a long form to a reduced-size form by taking the input mod 2^255 - 19. - *

- * On entry: |output[i]| < 14*2^54 - * On exit: |output[0..8]| < 280*2^54 - */ - static void reduceSizeByModularReduction(long[] output) { - // The coefficients x[10], x[11],..., x[18] are eliminated by reduction modulo 2^255 - 19. - // For example, the coefficient x[18] is multiplied by 19 and added to the coefficient x[8]. - // - // Each of these shifts and adds ends up multiplying the value by 19. - // - // For output[0..8], the absolute entry value is < 14*2^54 and we add, at most, 19*14*2^54 - // thus, on exit, |output[0..8]| < 280*2^54. - output[8] += output[18] << 4; - output[8] += output[18] << 1; - output[8] += output[18]; - output[7] += output[17] << 4; - output[7] += output[17] << 1; - output[7] += output[17]; - output[6] += output[16] << 4; - output[6] += output[16] << 1; - output[6] += output[16]; - output[5] += output[15] << 4; - output[5] += output[15] << 1; - output[5] += output[15]; - output[4] += output[14] << 4; - output[4] += output[14] << 1; - output[4] += output[14]; - output[3] += output[13] << 4; - output[3] += output[13] << 1; - output[3] += output[13]; - output[2] += output[12] << 4; - output[2] += output[12] << 1; - output[2] += output[12]; - output[1] += output[11] << 4; - output[1] += output[11] << 1; - output[1] += output[11]; - output[0] += output[10] << 4; - output[0] += output[10] << 1; - output[0] += output[10]; - } - - /** - * Reduce all coefficients of the short form input so that |x| < 2^26. - *

- * On entry: |output[i]| < 280*2^54 - */ - static void reduceCoefficients(long[] output) { - output[10] = 0; - - for (int i = 0; i < LIMB_CNT; i += 2) { - long over = output[i] / TWO_TO_26; - // The entry condition (that |output[i]| < 280*2^54) means that over is, at most, 280*2^28 - // in the first iteration of this loop. This is added to the next limb and we can - // approximate the resulting bound of that limb by 281*2^54. - output[i] -= over << 26; - output[i + 1] += over; - - // For the first iteration, |output[i+1]| < 281*2^54, thus |over| < 281*2^29. When this is - // added to the next limb, the resulting bound can be approximated as 281*2^54. - // - // For subsequent iterations of the loop, 281*2^54 remains a conservative bound and no - // overflow occurs. - over = output[i + 1] / TWO_TO_25; - output[i + 1] -= over << 25; - output[i + 2] += over; - } - // Now |output[10]| < 281*2^29 and all other coefficients are reduced. - output[0] += output[10] << 4; - output[0] += output[10] << 1; - output[0] += output[10]; - - output[10] = 0; - // Now output[1..9] are reduced, and |output[0]| < 2^26 + 19*281*2^29 so |over| will be no - // more than 2^16. - long over = output[0] / TWO_TO_26; - output[0] -= over << 26; - output[1] += over; - // Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 2^16 < 2^26. The bound on - // |output[1]| is sufficient to meet our needs. - } - - /** - * A helpful wrapper around {@ref Field25519#product}: output = in * in2. - *

- * On entry: |in[i]| < 2^27 and |in2[i]| < 2^27. - *

- * The output is reduced degree (indeed, one need only provide storage for 10 limbs) and - * |output[i]| < 2^26. - */ - static void mult(long[] output, long[] in, long[] in2) { - long[] t = new long[19]; - product(t, in, in2); - // |t[i]| < 2^26 - reduce(t, output); - } - - /** - * Square a number: out = in**2 - *

- * output must be distinct from the input. The inputs are reduced coefficient form, the output - * is not.

out[x] <= 14 * the largest product of the input limbs. - */ - private static void squareInner(long[] out, long[] in) { - out[0] = in[0] * in[0]; - out[1] = 2 * in[0] * in[1]; - out[2] = 2 * (in[1] * in[1] + in[0] * in[2]); - out[3] = 2 * (in[1] * in[2] + in[0] * in[3]); - out[4] = in[2] * in[2] + 4 * in[1] * in[3] + 2 * in[0] * in[4]; - out[5] = 2 * (in[2] * in[3] + in[1] * in[4] + in[0] * in[5]); - out[6] = 2 * (in[3] * in[3] + in[2] * in[4] + in[0] * in[6] + 2 * in[1] * in[5]); - out[7] = 2 * (in[3] * in[4] + in[2] * in[5] + in[1] * in[6] + in[0] * in[7]); - out[8] = - in[4] * in[4] + 2 * (in[2] * in[6] + in[0] * in[8] + 2 * (in[1] * in[7] + in[3] * in[5])); - out[9] = 2 * (in[4] * in[5] + in[3] * in[6] + in[2] * in[7] + in[1] * in[8] + in[0] * in[9]); - out[10] = - 2 * (in[5] * in[5] + in[4] * in[6] + in[2] * in[8] + 2 * (in[3] * in[7] + in[1] * in[9])); - out[11] = 2 * (in[5] * in[6] + in[4] * in[7] + in[3] * in[8] + in[2] * in[9]); - out[12] = in[6] * in[6] + 2 * (in[4] * in[8] + 2 * (in[5] * in[7] + in[3] * in[9])); - out[13] = 2 * (in[6] * in[7] + in[5] * in[8] + in[4] * in[9]); - out[14] = 2 * (in[7] * in[7] + in[6] * in[8] + 2 * in[5] * in[9]); - out[15] = 2 * (in[7] * in[8] + in[6] * in[9]); - out[16] = in[8] * in[8] + 4 * in[7] * in[9]; - out[17] = 2 * in[8] * in[9]; - out[18] = 2 * in[9] * in[9]; - } - - /** - * Returns in^2. - *

- * On entry: The |in| argument is in reduced coefficients form and |in[i]| < 2^27. - *

- * On exit: The |output| argument is in reduced coefficients form (indeed, one need only provide - * storage for 10 limbs) and |out[i]| < 2^26. - */ - static void square(long[] output, long[] in) { - long[] t = new long[19]; - squareInner(t, in); - // |t[i]| < 14*2^54 because the largest product of two limbs will be < 2^(27+27) and - // SquareInner adds together, at most, 14 of those products. - reduce(t, output); - } - - /** - * Takes a little-endian, 32-byte number and expands it into mixed radix form. - */ - static long[] expand(byte[] input) { - long[] output = new long[LIMB_CNT]; - for (int i = 0; i < LIMB_CNT; i++) { - output[i] = ((((long) (input[EXPAND_START[i]] & 0xff)) - | ((long) (input[EXPAND_START[i] + 1] & 0xff)) << 8 - | ((long) (input[EXPAND_START[i] + 2] & 0xff)) << 16 - | ((long) (input[EXPAND_START[i] + 3] & 0xff)) << 24) - >> EXPAND_SHIFT[i]) - & MASK[i & 1]; - } - return output; - } - - /** - * Takes a fully reduced mixed radix form number and contract it into a little-endian, 32-byte - * array. - *

- * On entry: |input_limbs[i]| < 2^26 - */ - @SuppressWarnings("NarrowingCompoundAssignment") - static byte[] contract(long[] inputLimbs) { - long[] input = Arrays.copyOf(inputLimbs, LIMB_CNT); - for (int j = 0; j < 2; j++) { - for (int i = 0; i < 9; i++) { - // This calculation is a time-invariant way to make input[i] non-negative by borrowing - // from the next-larger limb. - int carry = -(int) ((input[i] & (input[i] >> 31)) >> SHIFT[i & 1]); - input[i] = input[i] + (carry << SHIFT[i & 1]); - input[i + 1] -= carry; - } - - // There's no greater limb for input[9] to borrow from, but we can multiply by 19 and borrow - // from input[0], which is valid mod 2^255-19. - { - int carry = -(int) ((input[9] & (input[9] >> 31)) >> 25); - input[9] += (carry << 25); - input[0] -= (carry * 19); - } - - // After the first iteration, input[1..9] are non-negative and fit within 25 or 26 bits, - // depending on position. However, input[0] may be negative. - } - - // The first borrow-propagation pass above ended with every limb except (possibly) input[0] - // non-negative. - // - // If input[0] was negative after the first pass, then it was because of a carry from - // input[9]. On entry, input[9] < 2^26 so the carry was, at most, one, since (2**26-1) >> 25 - // = 1. Thus input[0] >= -19. - // - // In the second pass, each limb is decreased by at most one. Thus the second - // borrow-propagation pass could only have wrapped around to decrease input[0] again if the - // first pass left input[0] negative *and* input[1] through input[9] were all zero. In that - // case, input[1] is now 2^25 - 1, and this last borrow-propagation step will leave input[1] - // non-negative. - { - int carry = -(int) ((input[0] & (input[0] >> 31)) >> 26); - input[0] += (carry << 26); - input[1] -= carry; - } - - // All input[i] are now non-negative. However, there might be values between 2^25 and 2^26 in - // a limb which is, nominally, 25 bits wide. - for (int j = 0; j < 2; j++) { - for (int i = 0; i < 9; i++) { - int carry = (int) (input[i] >> SHIFT[i & 1]); - input[i] &= MASK[i & 1]; - input[i + 1] += carry; - } - } - - { - int carry = (int) (input[9] >> 25); - input[9] &= 0x1ffffff; - input[0] += 19 * carry; - } - - // If the first carry-chain pass, just above, ended up with a carry from input[9], and that - // caused input[0] to be out-of-bounds, then input[0] was < 2^26 + 2*19, because the carry - // was, at most, two. - // - // If the second pass carried from input[9] again then input[0] is < 2*19 and the input[9] -> - // input[0] carry didn't push input[0] out of bounds. - - // It still remains the case that input might be between 2^255-19 and 2^255. In this case, - // input[1..9] must take their maximum value and input[0] must be >= (2^255-19) & 0x3ffffff, - // which is 0x3ffffed. - int mask = gte((int) input[0], 0x3ffffed); - for (int i = 1; i < LIMB_CNT; i++) { - mask &= eq((int) input[i], MASK[i & 1]); - } - - // mask is either 0xffffffff (if input >= 2^255-19) and zero otherwise. Thus this - // conditionally subtracts 2^255-19. - input[0] -= mask & 0x3ffffed; - input[1] -= mask & 0x1ffffff; - for (int i = 2; i < LIMB_CNT; i += 2) { - input[i] -= mask & 0x3ffffff; - input[i + 1] -= mask & 0x1ffffff; - } - - for (int i = 0; i < LIMB_CNT; i++) { - input[i] <<= EXPAND_SHIFT[i]; - } - byte[] output = new byte[FIELD_LEN]; - for (int i = 0; i < LIMB_CNT; i++) { - output[EXPAND_START[i]] |= input[i] & 0xff; - output[EXPAND_START[i] + 1] |= (input[i] >> 8) & 0xff; - output[EXPAND_START[i] + 2] |= (input[i] >> 16) & 0xff; - output[EXPAND_START[i] + 3] |= (input[i] >> 24) & 0xff; - } - return output; - } - - /** - * Computes inverse of z = z(2^255 - 21) - *

- * Shamelessly copied from agl's code which was shamelessly copied from djb's code. Only the - * comment format and the variable namings are different from those. - */ - static void inverse(long[] out, long[] z) { - long[] z2 = new long[Field25519.LIMB_CNT]; - long[] z9 = new long[Field25519.LIMB_CNT]; - long[] z11 = new long[Field25519.LIMB_CNT]; - long[] z2To5Minus1 = new long[Field25519.LIMB_CNT]; - long[] z2To10Minus1 = new long[Field25519.LIMB_CNT]; - long[] z2To20Minus1 = new long[Field25519.LIMB_CNT]; - long[] z2To50Minus1 = new long[Field25519.LIMB_CNT]; - long[] z2To100Minus1 = new long[Field25519.LIMB_CNT]; - long[] t0 = new long[Field25519.LIMB_CNT]; - long[] t1 = new long[Field25519.LIMB_CNT]; - - square(z2, z); // 2 - square(t1, z2); // 4 - square(t0, t1); // 8 - mult(z9, t0, z); // 9 - mult(z11, z9, z2); // 11 - square(t0, z11); // 22 - mult(z2To5Minus1, t0, z9); // 2^5 - 2^0 = 31 - - square(t0, z2To5Minus1); // 2^6 - 2^1 - square(t1, t0); // 2^7 - 2^2 - square(t0, t1); // 2^8 - 2^3 - square(t1, t0); // 2^9 - 2^4 - square(t0, t1); // 2^10 - 2^5 - mult(z2To10Minus1, t0, z2To5Minus1); // 2^10 - 2^0 - - square(t0, z2To10Minus1); // 2^11 - 2^1 - square(t1, t0); // 2^12 - 2^2 - for (int i = 2; i < 10; i += 2) { // 2^20 - 2^10 - square(t0, t1); - square(t1, t0); - } - mult(z2To20Minus1, t1, z2To10Minus1); // 2^20 - 2^0 - - square(t0, z2To20Minus1); // 2^21 - 2^1 - square(t1, t0); // 2^22 - 2^2 - for (int i = 2; i < 20; i += 2) { // 2^40 - 2^20 - square(t0, t1); - square(t1, t0); - } - mult(t0, t1, z2To20Minus1); // 2^40 - 2^0 - - square(t1, t0); // 2^41 - 2^1 - square(t0, t1); // 2^42 - 2^2 - for (int i = 2; i < 10; i += 2) { // 2^50 - 2^10 - square(t1, t0); - square(t0, t1); - } - mult(z2To50Minus1, t0, z2To10Minus1); // 2^50 - 2^0 - - square(t0, z2To50Minus1); // 2^51 - 2^1 - square(t1, t0); // 2^52 - 2^2 - for (int i = 2; i < 50; i += 2) { // 2^100 - 2^50 - square(t0, t1); - square(t1, t0); - } - mult(z2To100Minus1, t1, z2To50Minus1); // 2^100 - 2^0 - - square(t1, z2To100Minus1); // 2^101 - 2^1 - square(t0, t1); // 2^102 - 2^2 - for (int i = 2; i < 100; i += 2) { // 2^200 - 2^100 - square(t1, t0); - square(t0, t1); - } - mult(t1, t0, z2To100Minus1); // 2^200 - 2^0 - - square(t0, t1); // 2^201 - 2^1 - square(t1, t0); // 2^202 - 2^2 - for (int i = 2; i < 50; i += 2) { // 2^250 - 2^50 - square(t0, t1); - square(t1, t0); - } - mult(t0, t1, z2To50Minus1); // 2^250 - 2^0 - - square(t1, t0); // 2^251 - 2^1 - square(t0, t1); // 2^252 - 2^2 - square(t1, t0); // 2^253 - 2^3 - square(t0, t1); // 2^254 - 2^4 - square(t1, t0); // 2^255 - 2^5 - mult(out, t1, z11); // 2^255 - 21 - } - - /** - * Returns 0xffffffff iff a == b and zero otherwise. - */ - private static int eq(int a, int b) { - a = ~(a ^ b); - a &= a << 16; - a &= a << 8; - a &= a << 4; - a &= a << 2; - a &= a << 1; - return a >> 31; - } - - /** - * returns 0xffffffff if a >= b and zero otherwise, where a and b are both non-negative. - */ - private static int gte(int a, int b) { - a -= b; - // a >= 0 iff a >= b. - return ~(a >> 31); - } - } - - // (x = 0, y = 1) point - private static final CachedXYT CACHED_NEUTRAL = - new CachedXYT(new long[] {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - new long[] {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, new long[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - private static final PartialXYZT NEUTRAL = new PartialXYZT( - new XYZ(new long[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, new long[] {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - new long[] {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}), - new long[] {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - - /** - * Projective point representation (X:Y:Z) satisfying x = X/Z, y = Y/Z - *

- * Note that this is referred as ge_p2 in ref10 impl. - * Also note that x = X, y = Y and z = Z below following Java coding style. - *

- * See - * Koyama K., Tsuruoka Y. (1993) Speeding up Elliptic Cryptosystems by Using a Signed Binary - * Window Method. - *

- * https://hyperelliptic.org/EFD/g1p/auto-twisted-projective.html - */ - private static class XYZ { - final long[] x; - final long[] y; - final long[] z; - - XYZ() { - this(new long[Field25519.LIMB_CNT], new long[Field25519.LIMB_CNT], - new long[Field25519.LIMB_CNT]); - } - - XYZ(long[] x, long[] y, long[] z) { - this.x = x; - this.y = y; - this.z = z; - } - - XYZ(XYZ xyz) { - x = Arrays.copyOf(xyz.x, Field25519.LIMB_CNT); - y = Arrays.copyOf(xyz.y, Field25519.LIMB_CNT); - z = Arrays.copyOf(xyz.z, Field25519.LIMB_CNT); - } - - XYZ(PartialXYZT partialXYZT) { - this(); - fromPartialXYZT(this, partialXYZT); - } - - /** - * ge_p1p1_to_p2.c - */ - static XYZ fromPartialXYZT(XYZ out, PartialXYZT in) { - Field25519.mult(out.x, in.xyz.x, in.t); - Field25519.mult(out.y, in.xyz.y, in.xyz.z); - Field25519.mult(out.z, in.xyz.z, in.t); - return out; - } - - /** - * Encodes this point to bytes. - */ - byte[] toBytes() { - long[] recip = new long[Field25519.LIMB_CNT]; - long[] x = new long[Field25519.LIMB_CNT]; - long[] y = new long[Field25519.LIMB_CNT]; - Field25519.inverse(recip, z); - Field25519.mult(x, this.x, recip); - Field25519.mult(y, this.y, recip); - byte[] s = Field25519.contract(y); - s[31] = (byte) (s[31] ^ (getLsb(x) << 7)); - return s; - } - - /** - * Best effort fix-timing array comparison. - * - * @return true if two arrays are equal. - */ - private static boolean bytesEqual(final byte[] x, final byte[] y) { - if (x == null || y == null) { - return false; - } - if (x.length != y.length) { - return false; - } - int res = 0; - for (int i = 0; i < x.length; i++) { - res |= x[i] ^ y[i]; - } - return res == 0; - } - - /** - * Checks that the point is on curve - */ - boolean isOnCurve() { - long[] x2 = new long[Field25519.LIMB_CNT]; - Field25519.square(x2, x); - long[] y2 = new long[Field25519.LIMB_CNT]; - Field25519.square(y2, y); - long[] z2 = new long[Field25519.LIMB_CNT]; - Field25519.square(z2, z); - long[] z4 = new long[Field25519.LIMB_CNT]; - Field25519.square(z4, z2); - long[] lhs = new long[Field25519.LIMB_CNT]; - // lhs = y^2 - x^2 - Field25519.sub(lhs, y2, x2); - // lhs = z^2 * (y2 - x2) - Field25519.mult(lhs, lhs, z2); - long[] rhs = new long[Field25519.LIMB_CNT]; - // rhs = x^2 * y^2 - Field25519.mult(rhs, x2, y2); - // rhs = D * x^2 * y^2 - Field25519.mult(rhs, rhs, D); - // rhs = z^4 + D * x^2 * y^2 - Field25519.sum(rhs, z4); - // Field25519.mult reduces its output, but Field25519.sum does not, so we have to manually - // reduce it here. - Field25519.reduce(rhs, rhs); - // z^2 (y^2 - x^2) == z^4 + D * x^2 * y^2 - return bytesEqual(Field25519.contract(lhs), Field25519.contract(rhs)); - } - } - - /** - * Represents extended projective point representation (X:Y:Z:T) satisfying x = X/Z, y = Y/Z, - * XY = ZT - *

- * Note that this is referred as ge_p3 in ref10 impl. - * Also note that t = T below following Java coding style. - *

- * See - * Hisil H., Wong K.KH., Carter G., Dawson E. (2008) Twisted Edwards Curves Revisited. - *

- * https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html - */ - private static class XYZT { - final XYZ xyz; - final long[] t; - - XYZT() { - this(new XYZ(), new long[Field25519.LIMB_CNT]); - } - - XYZT(XYZ xyz, long[] t) { - this.xyz = xyz; - this.t = t; - } - - XYZT(PartialXYZT partialXYZT) { - this(); - fromPartialXYZT(this, partialXYZT); - } - - /** - * ge_p1p1_to_p2.c - */ - private static XYZT fromPartialXYZT(XYZT out, PartialXYZT in) { - Field25519.mult(out.xyz.x, in.xyz.x, in.t); - Field25519.mult(out.xyz.y, in.xyz.y, in.xyz.z); - Field25519.mult(out.xyz.z, in.xyz.z, in.t); - Field25519.mult(out.t, in.xyz.x, in.xyz.y); - return out; - } - - /** - * Decodes {@code s} into an extended projective point. - * See Section 5.1.3 Decoding in https://tools.ietf.org/html/rfc8032#section-5.1.3 - */ - private static XYZT fromBytesNegateVarTime(byte[] s) throws GeneralSecurityException { - long[] x = new long[Field25519.LIMB_CNT]; - long[] y = Field25519.expand(s); - long[] z = new long[Field25519.LIMB_CNT]; - z[0] = 1; - long[] t = new long[Field25519.LIMB_CNT]; - long[] u = new long[Field25519.LIMB_CNT]; - long[] v = new long[Field25519.LIMB_CNT]; - long[] vxx = new long[Field25519.LIMB_CNT]; - long[] check = new long[Field25519.LIMB_CNT]; - Field25519.square(u, y); - Field25519.mult(v, u, D); - Field25519.sub(u, u, z); // u = y^2 - 1 - Field25519.sum(v, v, z); // v = dy^2 + 1 - - long[] v3 = new long[Field25519.LIMB_CNT]; - Field25519.square(v3, v); - Field25519.mult(v3, v3, v); // v3 = v^3 - Field25519.square(x, v3); - Field25519.mult(x, x, v); - Field25519.mult(x, x, u); // x = uv^7 - - pow2252m3(x, x); // x = (uv^7)^((q-5)/8) - Field25519.mult(x, x, v3); - Field25519.mult(x, x, u); // x = uv^3(uv^7)^((q-5)/8) - - Field25519.square(vxx, x); - Field25519.mult(vxx, vxx, v); - Field25519.sub(check, vxx, u); // vx^2-u - if (isNonZeroVarTime(check)) { - Field25519.sum(check, vxx, u); // vx^2+u - if (isNonZeroVarTime(check)) { - throw new GeneralSecurityException("Cannot convert given bytes to extended projective " - + "coordinates. No square root exists for modulo 2^255-19"); - } - Field25519.mult(x, x, SQRTM1); - } - - if (!isNonZeroVarTime(x) && (s[31] & 0xff) >> 7 != 0) { - throw new GeneralSecurityException("Cannot convert given bytes to extended projective " - + "coordinates. Computed x is zero and encoded x's least significant bit is not zero"); - } - if (getLsb(x) == ((s[31] & 0xff) >> 7)) { - neg(x, x); - } - - Field25519.mult(t, x, y); - return new XYZT(new XYZ(x, y, z), t); - } - } - - /** - * Partial projective point representation ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T - *

- * Note that this is referred as complete form in the original ref10 impl (ge_p1p1). - * Also note that t = T below following Java coding style. - *

- * Although this has the same types as XYZT, it is redefined to have its own type so that it is - * readable and 1:1 corresponds to ref10 impl. - *

- * Can be converted to XYZT as follows: - * X1 = X * T = x * Z * T = x * Z1 - * Y1 = Y * Z = y * T * Z = y * Z1 - * Z1 = Z * T = Z * T - * T1 = X * Y = x * Z * y * T = x * y * Z1 = X1Y1 / Z1 - */ - private static class PartialXYZT { - final XYZ xyz; - final long[] t; - - PartialXYZT() { - this(new XYZ(), new long[Field25519.LIMB_CNT]); - } - - PartialXYZT(XYZ xyz, long[] t) { - this.xyz = xyz; - this.t = t; - } - - PartialXYZT(PartialXYZT other) { - xyz = new XYZ(other.xyz); - t = Arrays.copyOf(other.t, Field25519.LIMB_CNT); - } - } - - /** - * Corresponds to the caching mentioned in the last paragraph of Section 3.1 of - * Hisil H., Wong K.KH., Carter G., Dawson E. (2008) Twisted Edwards Curves Revisited. - * with Z = 1. - */ - private static class CachedXYT { - final long[] yPlusX; - final long[] yMinusX; - final long[] t2d; - - /** - * Creates a cached XYZT with Z = 1 - * - * @param yPlusX y + x - * @param yMinusX y - x - * @param t2d 2d * xy - */ - CachedXYT(long[] yPlusX, long[] yMinusX, long[] t2d) { - this.yPlusX = yPlusX; - this.yMinusX = yMinusX; - this.t2d = t2d; - } - - CachedXYT(CachedXYT other) { - yPlusX = Arrays.copyOf(other.yPlusX, Field25519.LIMB_CNT); - yMinusX = Arrays.copyOf(other.yMinusX, Field25519.LIMB_CNT); - t2d = Arrays.copyOf(other.t2d, Field25519.LIMB_CNT); - } - - // z is one implicitly, so this just copies {@code in} to {@code output}. - void multByZ(long[] output, long[] in) { - System.arraycopy(in, 0, output, 0, Field25519.LIMB_CNT); - } - - /** - * If icopy is 1, copies {@code other} into this point. Time invariant wrt to icopy value. - */ - void copyConditional(CachedXYT other, int icopy) { - copyConditional(yPlusX, other.yPlusX, icopy); - copyConditional(yMinusX, other.yMinusX, icopy); - copyConditional(t2d, other.t2d, icopy); - } - - /** - * Conditionally copies a reduced-form limb arrays {@code b} into {@code a} if {@code icopy} is - * 1, but leave {@code a} unchanged if 'iswap' is 0. Runs in data-invariant time to avoid - * side-channel attacks. - * - *

NOTE that this function requires that {@code icopy} be 1 or 0; other values give wrong - * results. Also, the two limb arrays must be in reduced-coefficient, reduced-degree form: the - * values in a[10..19] or b[10..19] aren't swapped, and all values in a[0..9],b[0..9] must - * have magnitude less than Integer.MAX_VALUE. - */ - static void copyConditional(long[] a, long[] b, int icopy) { - int copy = -icopy; - for (int i = 0; i < Field25519.LIMB_CNT; i++) { - int x = copy & (((int) a[i]) ^ ((int) b[i])); - a[i] = ((int) a[i]) ^ x; - } - } - } - - private static class CachedXYZT extends CachedXYT { - private final long[] z; - - CachedXYZT() { - this(new long[Field25519.LIMB_CNT], new long[Field25519.LIMB_CNT], - new long[Field25519.LIMB_CNT], new long[Field25519.LIMB_CNT]); - } - - /** - * ge_p3_to_cached.c - */ - CachedXYZT(XYZT xyzt) { - this(); - Field25519.sum(yPlusX, xyzt.xyz.y, xyzt.xyz.x); - Field25519.sub(yMinusX, xyzt.xyz.y, xyzt.xyz.x); - System.arraycopy(xyzt.xyz.z, 0, z, 0, Field25519.LIMB_CNT); - Field25519.mult(t2d, xyzt.t, D2); - } - - /** - * Creates a cached XYZT - * - * @param yPlusX Y + X - * @param yMinusX Y - X - * @param z Z - * @param t2d 2d * (XY/Z) - */ - CachedXYZT(long[] yPlusX, long[] yMinusX, long[] z, long[] t2d) { - super(yPlusX, yMinusX, t2d); - this.z = z; - } - - @Override - public void multByZ(long[] output, long[] in) { - Field25519.mult(output, in, z); - } - } - - /** - * Addition defined in Section 3.1 of - * Hisil H., Wong K.KH., Carter G., Dawson E. (2008) Twisted Edwards Curves Revisited. - *

- * Please note that this is a partial of the operation listed there leaving out the final - * conversion from PartialXYZT to XYZT. - * - * @param extended extended projective point input - * @param cached cached projective point input - */ - private static void add(PartialXYZT partialXYZT, XYZT extended, CachedXYT cached) { - long[] t = new long[Field25519.LIMB_CNT]; - - // Y1 + X1 - Field25519.sum(partialXYZT.xyz.x, extended.xyz.y, extended.xyz.x); - - // Y1 - X1 - Field25519.sub(partialXYZT.xyz.y, extended.xyz.y, extended.xyz.x); - - // A = (Y1 - X1) * (Y2 - X2) - Field25519.mult(partialXYZT.xyz.y, partialXYZT.xyz.y, cached.yMinusX); - - // B = (Y1 + X1) * (Y2 + X2) - Field25519.mult(partialXYZT.xyz.z, partialXYZT.xyz.x, cached.yPlusX); - - // C = T1 * 2d * T2 = 2d * T1 * T2 (2d is written as k in the paper) - Field25519.mult(partialXYZT.t, extended.t, cached.t2d); - - // Z1 * Z2 - cached.multByZ(partialXYZT.xyz.x, extended.xyz.z); - - // D = 2 * Z1 * Z2 - Field25519.sum(t, partialXYZT.xyz.x, partialXYZT.xyz.x); - - // X3 = B - A - Field25519.sub(partialXYZT.xyz.x, partialXYZT.xyz.z, partialXYZT.xyz.y); - - // Y3 = B + A - Field25519.sum(partialXYZT.xyz.y, partialXYZT.xyz.z, partialXYZT.xyz.y); - - // Z3 = D + C - Field25519.sum(partialXYZT.xyz.z, t, partialXYZT.t); - - // T3 = D - C - Field25519.sub(partialXYZT.t, t, partialXYZT.t); - } - - /** - * Based on the addition defined in Section 3.1 of - * Hisil H., Wong K.KH., Carter G., Dawson E. (2008) Twisted Edwards Curves Revisited. - *

- * Please note that this is a partial of the operation listed there leaving out the final - * conversion from PartialXYZT to XYZT. - * - * @param extended extended projective point input - * @param cached cached projective point input - */ - private static void sub(PartialXYZT partialXYZT, XYZT extended, CachedXYT cached) { - long[] t = new long[Field25519.LIMB_CNT]; - - // Y1 + X1 - Field25519.sum(partialXYZT.xyz.x, extended.xyz.y, extended.xyz.x); - - // Y1 - X1 - Field25519.sub(partialXYZT.xyz.y, extended.xyz.y, extended.xyz.x); - - // A = (Y1 - X1) * (Y2 + X2) - Field25519.mult(partialXYZT.xyz.y, partialXYZT.xyz.y, cached.yPlusX); - - // B = (Y1 + X1) * (Y2 - X2) - Field25519.mult(partialXYZT.xyz.z, partialXYZT.xyz.x, cached.yMinusX); - - // C = T1 * 2d * T2 = 2d * T1 * T2 (2d is written as k in the paper) - Field25519.mult(partialXYZT.t, extended.t, cached.t2d); - - // Z1 * Z2 - cached.multByZ(partialXYZT.xyz.x, extended.xyz.z); - - // D = 2 * Z1 * Z2 - Field25519.sum(t, partialXYZT.xyz.x, partialXYZT.xyz.x); - - // X3 = B - A - Field25519.sub(partialXYZT.xyz.x, partialXYZT.xyz.z, partialXYZT.xyz.y); - - // Y3 = B + A - Field25519.sum(partialXYZT.xyz.y, partialXYZT.xyz.z, partialXYZT.xyz.y); - - // Z3 = D - C - Field25519.sub(partialXYZT.xyz.z, t, partialXYZT.t); - - // T3 = D + C - Field25519.sum(partialXYZT.t, t, partialXYZT.t); - } - - /** - * Doubles {@code p} and puts the result into this PartialXYZT. - *

- * This is based on the addition defined in formula 7 in Section 3.3 of - * Hisil H., Wong K.KH., Carter G., Dawson E. (2008) Twisted Edwards Curves Revisited. - *

- * Please note that this is a partial of the operation listed there leaving out the final - * conversion from PartialXYZT to XYZT and also this fixes a typo in calculation of Y3 and T3 in - * the paper, H should be replaced with A+B. - */ - private static void doubleXYZ(PartialXYZT partialXYZT, XYZ p) { - long[] t0 = new long[Field25519.LIMB_CNT]; - - // XX = X1^2 - Field25519.square(partialXYZT.xyz.x, p.x); - - // YY = Y1^2 - Field25519.square(partialXYZT.xyz.z, p.y); - - // B' = Z1^2 - Field25519.square(partialXYZT.t, p.z); - - // B = 2 * B' - Field25519.sum(partialXYZT.t, partialXYZT.t, partialXYZT.t); - - // A = X1 + Y1 - Field25519.sum(partialXYZT.xyz.y, p.x, p.y); - - // AA = A^2 - Field25519.square(t0, partialXYZT.xyz.y); - - // Y3 = YY + XX - Field25519.sum(partialXYZT.xyz.y, partialXYZT.xyz.z, partialXYZT.xyz.x); - - // Z3 = YY - XX - Field25519.sub(partialXYZT.xyz.z, partialXYZT.xyz.z, partialXYZT.xyz.x); - - // X3 = AA - Y3 - Field25519.sub(partialXYZT.xyz.x, t0, partialXYZT.xyz.y); - - // T3 = B - Z3 - Field25519.sub(partialXYZT.t, partialXYZT.t, partialXYZT.xyz.z); - } - - /** - * Doubles {@code p} and puts the result into this PartialXYZT. - */ - private static void doubleXYZT(PartialXYZT partialXYZT, XYZT p) { - doubleXYZ(partialXYZT, p.xyz); - } - - /** - * Compares two byte values in constant time. - */ - private static int eq(int a, int b) { - int r = ~(a ^ b) & 0xff; - r &= r << 4; - r &= r << 2; - r &= r << 1; - return (r >> 7) & 1; - } - - /** - * This is a constant time operation where point b*B*256^pos is stored in {@code t}. - * When b is 0, t remains the same (i.e., neutral point). - *

- * Although B_TABLE[32][8] (B_TABLE[i][j] = (j+1)*B*256^i) has j values in [0, 7], the select - * method negates the corresponding point if b is negative (which is straight forward in elliptic - * curves by just negating y coordinate). Therefore we can get multiples of B with the half of - * memory requirements. - * - * @param t neutral element (i.e., point 0), also serves as output. - * @param pos in B[pos][j] = (j+1)*B*256^pos - * @param b value in [-8, 8] range. - */ - private static void select(CachedXYT t, int pos, byte b) { - int bnegative = (b & 0xff) >> 7; - int babs = b - (((-bnegative) & b) << 1); - - t.copyConditional(B_TABLE[pos][0], eq(babs, 1)); - t.copyConditional(B_TABLE[pos][1], eq(babs, 2)); - t.copyConditional(B_TABLE[pos][2], eq(babs, 3)); - t.copyConditional(B_TABLE[pos][3], eq(babs, 4)); - t.copyConditional(B_TABLE[pos][4], eq(babs, 5)); - t.copyConditional(B_TABLE[pos][5], eq(babs, 6)); - t.copyConditional(B_TABLE[pos][6], eq(babs, 7)); - t.copyConditional(B_TABLE[pos][7], eq(babs, 8)); - - long[] yPlusX = Arrays.copyOf(t.yMinusX, Field25519.LIMB_CNT); - long[] yMinusX = Arrays.copyOf(t.yPlusX, Field25519.LIMB_CNT); - long[] t2d = Arrays.copyOf(t.t2d, Field25519.LIMB_CNT); - neg(t2d, t2d); - CachedXYT minust = new CachedXYT(yPlusX, yMinusX, t2d); - t.copyConditional(minust, bnegative); - } - - /** - * Computes {@code a}*B - * where a = a[0]+256*a[1]+...+256^31 a[31] and - * B is the Ed25519 base point (x,4/5) with x positive. - *

- * Preconditions: - * a[31] <= 127 - * - * @throws IllegalStateException iff there is arithmetic error. - */ - @SuppressWarnings("NarrowingCompoundAssignment") - private static XYZ scalarMultWithBase(byte[] a) { - byte[] e = new byte[2 * Field25519.FIELD_LEN]; - for (int i = 0; i < Field25519.FIELD_LEN; i++) { - e[2 * i + 0] = (byte) (((a[i] & 0xff) >> 0) & 0xf); - e[2 * i + 1] = (byte) (((a[i] & 0xff) >> 4) & 0xf); - } - // each e[i] is between 0 and 15 - // e[63] is between 0 and 7 - - // Rewrite e in a way that each e[i] is in [-8, 8]. - // This can be done since a[63] is in [0, 7], the carry-over onto the most significant byte - // a[63] can be at most 1. - int carry = 0; - for (int i = 0; i < e.length - 1; i++) { - e[i] += carry; - carry = e[i] + 8; - carry >>= 4; - e[i] -= carry << 4; - } - e[e.length - 1] += carry; - - PartialXYZT ret = new PartialXYZT(NEUTRAL); - XYZT xyzt = new XYZT(); - // Although B_TABLE's i can be at most 31 (stores only 32 4bit multiples of B) and we have 64 - // 4bit values in e array, the below for loop adds cached values by iterating e by two in odd - // indices. After the result, we can double the result point 4 times to shift the multiplication - // scalar by 4 bits. - for (int i = 1; i < e.length; i += 2) { - CachedXYT t = new CachedXYT(CACHED_NEUTRAL); - select(t, i / 2, e[i]); - add(ret, XYZT.fromPartialXYZT(xyzt, ret), t); - } - - // Doubles the result 4 times to shift the multiplication scalar 4 bits to get the actual result - // for the odd indices in e. - XYZ xyz = new XYZ(); - doubleXYZ(ret, XYZ.fromPartialXYZT(xyz, ret)); - doubleXYZ(ret, XYZ.fromPartialXYZT(xyz, ret)); - doubleXYZ(ret, XYZ.fromPartialXYZT(xyz, ret)); - doubleXYZ(ret, XYZ.fromPartialXYZT(xyz, ret)); - - // Add multiples of B for even indices of e. - for (int i = 0; i < e.length; i += 2) { - CachedXYT t = new CachedXYT(CACHED_NEUTRAL); - select(t, i / 2, e[i]); - add(ret, XYZT.fromPartialXYZT(xyzt, ret), t); - } - - // This check is to protect against flaws, i.e. if there is a computation error through a - // faulty CPU or if the implementation contains a bug. - XYZ result = new XYZ(ret); - if (!result.isOnCurve()) { - throw new IllegalStateException("arithmetic error in scalar multiplication"); - } - return result; - } - - @SuppressWarnings("NarrowingCompoundAssignment") - private static byte[] slide(byte[] a) { - byte[] r = new byte[256]; - // Writes each bit in a[0..31] into r[0..255]: - // a = a[0]+256*a[1]+...+256^31*a[31] is equal to - // r = r[0]+2*r[1]+...+2^255*r[255] - for (int i = 0; i < 256; i++) { - r[i] = (byte) (1 & ((a[i >> 3] & 0xff) >> (i & 7))); - } - - // Transforms r[i] as odd values in [-15, 15] - for (int i = 0; i < 256; i++) { - if (r[i] != 0) { - for (int b = 1; b <= 6 && i + b < 256; b++) { - if (r[i + b] != 0) { - if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; - r[i + b] = 0; - } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; - for (int k = i + b; k < 256; k++) { - if (r[k] == 0) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else { - break; - } - } - } - } - } - return r; - } - - /** - * Computes {@code a}*{@code pointA}+{@code b}*B - * where a = a[0]+256*a[1]+...+256^31*a[31]. - * and b = b[0]+256*b[1]+...+256^31*b[31]. - * B is the Ed25519 base point (x,4/5) with x positive. - *

- * Note that execution time varies based on the input since this will only be used in verification - * of signatures. - */ - private static XYZ doubleScalarMultVarTime(byte[] a, XYZT pointA, byte[] b) { - // pointA, 3*pointA, 5*pointA, 7*pointA, 9*pointA, 11*pointA, 13*pointA, 15*pointA - CachedXYZT[] pointAArray = new CachedXYZT[8]; - pointAArray[0] = new CachedXYZT(pointA); - PartialXYZT t = new PartialXYZT(); - doubleXYZT(t, pointA); - XYZT doubleA = new XYZT(t); - for (int i = 1; i < pointAArray.length; i++) { - add(t, doubleA, pointAArray[i - 1]); - pointAArray[i] = new CachedXYZT(new XYZT(t)); - } - - byte[] aSlide = slide(a); - byte[] bSlide = slide(b); - t = new PartialXYZT(NEUTRAL); - XYZT u = new XYZT(); - int i = 255; - for (; i >= 0; i--) { - if (aSlide[i] != 0 || bSlide[i] != 0) { - break; - } - } - for (; i >= 0; i--) { - doubleXYZ(t, new XYZ(t)); - if (aSlide[i] > 0) { - add(t, XYZT.fromPartialXYZT(u, t), pointAArray[aSlide[i] / 2]); - } else if (aSlide[i] < 0) { - sub(t, XYZT.fromPartialXYZT(u, t), pointAArray[-aSlide[i] / 2]); - } - if (bSlide[i] > 0) { - add(t, XYZT.fromPartialXYZT(u, t), B2[bSlide[i] / 2]); - } else if (bSlide[i] < 0) { - sub(t, XYZT.fromPartialXYZT(u, t), B2[-bSlide[i] / 2]); - } - } - - return new XYZ(t); - } - - /** - * Returns true if {@code in} is nonzero. - *

- * Note that execution time might depend on the input {@code in}. - */ - private static boolean isNonZeroVarTime(long[] in) { - long[] inCopy = new long[in.length + 1]; - System.arraycopy(in, 0, inCopy, 0, in.length); - Field25519.reduceCoefficients(inCopy); - byte[] bytes = Field25519.contract(inCopy); - for (byte b : bytes) { - if (b != 0) { - return true; - } - } - return false; - } - - /** - * Returns the least significant bit of {@code in}. - */ - private static int getLsb(long[] in) { - return Field25519.contract(in)[0] & 1; - } - - /** - * Negates all values in {@code in} and store it in {@code out}. - */ - private static void neg(long[] out, long[] in) { - for (int i = 0; i < in.length; i++) { - out[i] = -in[i]; - } - } - - /** - * Computes {@code in}^(2^252-3) mod 2^255-19 and puts the result in {@code out}. - */ - private static void pow2252m3(long[] out, long[] in) { - long[] t0 = new long[Field25519.LIMB_CNT]; - long[] t1 = new long[Field25519.LIMB_CNT]; - long[] t2 = new long[Field25519.LIMB_CNT]; - - // z2 = z1^2^1 - Field25519.square(t0, in); - - // z8 = z2^2^2 - Field25519.square(t1, t0); - for (int i = 1; i < 2; i++) { - Field25519.square(t1, t1); - } - - // z9 = z1*z8 - Field25519.mult(t1, in, t1); - - // z11 = z2*z9 - Field25519.mult(t0, t0, t1); - - // z22 = z11^2^1 - Field25519.square(t0, t0); - - // z_5_0 = z9*z22 - Field25519.mult(t0, t1, t0); - - // z_10_5 = z_5_0^2^5 - Field25519.square(t1, t0); - for (int i = 1; i < 5; i++) { - Field25519.square(t1, t1); - } - - // z_10_0 = z_10_5*z_5_0 - Field25519.mult(t0, t1, t0); - - // z_20_10 = z_10_0^2^10 - Field25519.square(t1, t0); - for (int i = 1; i < 10; i++) { - Field25519.square(t1, t1); - } - - // z_20_0 = z_20_10*z_10_0 - Field25519.mult(t1, t1, t0); - - // z_40_20 = z_20_0^2^20 - Field25519.square(t2, t1); - for (int i = 1; i < 20; i++) { - Field25519.square(t2, t2); - } - - // z_40_0 = z_40_20*z_20_0 - Field25519.mult(t1, t2, t1); - - // z_50_10 = z_40_0^2^10 - Field25519.square(t1, t1); - for (int i = 1; i < 10; i++) { - Field25519.square(t1, t1); - } - - // z_50_0 = z_50_10*z_10_0 - Field25519.mult(t0, t1, t0); - - // z_100_50 = z_50_0^2^50 - Field25519.square(t1, t0); - for (int i = 1; i < 50; i++) { - Field25519.square(t1, t1); - } - - // z_100_0 = z_100_50*z_50_0 - Field25519.mult(t1, t1, t0); - - // z_200_100 = z_100_0^2^100 - Field25519.square(t2, t1); - for (int i = 1; i < 100; i++) { - Field25519.square(t2, t2); - } - - // z_200_0 = z_200_100*z_100_0 - Field25519.mult(t1, t2, t1); - - // z_250_50 = z_200_0^2^50 - Field25519.square(t1, t1); - for (int i = 1; i < 50; i++) { - Field25519.square(t1, t1); - } - - // z_250_0 = z_250_50*z_50_0 - Field25519.mult(t0, t1, t0); - - // z_252_2 = z_250_0^2^2 - Field25519.square(t0, t0); - for (int i = 1; i < 2; i++) { - Field25519.square(t0, t0); - } - - // z_252_3 = z_252_2*z1 - Field25519.mult(out, t0, in); - } - - /** - * Returns 3 bytes of {@code in} starting from {@code idx} in Little-Endian format. - */ - private static long load3(byte[] in, int idx) { - long result; - result = (long) in[idx] & 0xff; - result |= (long) (in[idx + 1] & 0xff) << 8; - result |= (long) (in[idx + 2] & 0xff) << 16; - return result; - } - - /** - * Returns 4 bytes of {@code in} starting from {@code idx} in Little-Endian format. - */ - private static long load4(byte[] in, int idx) { - long result = load3(in, idx); - result |= (long) (in[idx + 3] & 0xff) << 24; - return result; - } - - /** - * Input: - * s[0]+256*s[1]+...+256^63*s[63] = s - *

- * Output: - * s[0]+256*s[1]+...+256^31*s[31] = s mod l - * where l = 2^252 + 27742317777372353535851937790883648493. - * Overwrites s in place. - */ - private static void reduce(byte[] s) { - // Observation: - // 2^252 mod l is equivalent to -27742317777372353535851937790883648493 mod l - // Let m = -27742317777372353535851937790883648493 - // Thus a*2^252+b mod l is equivalent to a*m+b mod l - // - // First s is divided into chunks of 21 bits as follows: - // s0+2^21*s1+2^42*s3+...+2^462*s23 = s[0]+256*s[1]+...+256^63*s[63] - long s0 = 2097151 & load3(s, 0); - long s1 = 2097151 & (load4(s, 2) >> 5); - long s2 = 2097151 & (load3(s, 5) >> 2); - long s3 = 2097151 & (load4(s, 7) >> 7); - long s4 = 2097151 & (load4(s, 10) >> 4); - long s5 = 2097151 & (load3(s, 13) >> 1); - long s6 = 2097151 & (load4(s, 15) >> 6); - long s7 = 2097151 & (load3(s, 18) >> 3); - long s8 = 2097151 & load3(s, 21); - long s9 = 2097151 & (load4(s, 23) >> 5); - long s10 = 2097151 & (load3(s, 26) >> 2); - long s11 = 2097151 & (load4(s, 28) >> 7); - long s12 = 2097151 & (load4(s, 31) >> 4); - long s13 = 2097151 & (load3(s, 34) >> 1); - long s14 = 2097151 & (load4(s, 36) >> 6); - long s15 = 2097151 & (load3(s, 39) >> 3); - long s16 = 2097151 & load3(s, 42); - long s17 = 2097151 & (load4(s, 44) >> 5); - long s18 = 2097151 & (load3(s, 47) >> 2); - long s19 = 2097151 & (load4(s, 49) >> 7); - long s20 = 2097151 & (load4(s, 52) >> 4); - long s21 = 2097151 & (load3(s, 55) >> 1); - long s22 = 2097151 & (load4(s, 57) >> 6); - long s23 = (load4(s, 60) >> 3); - long carry0; - long carry1; - long carry2; - long carry3; - long carry4; - long carry5; - long carry6; - long carry7; - long carry8; - long carry9; - long carry10; - long carry11; - long carry12; - long carry13; - long carry14; - long carry15; - long carry16; - - // s23*2^462 = s23*2^210*2^252 is equivalent to s23*2^210*m in mod l - // As m is a 125 bit number, the result needs to scattered to 6 limbs (125/21 ceil is 6) - // starting from s11 (s11*2^210) - // m = [666643, 470296, 654183, -997805, 136657, -683901] in 21-bit limbs - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - // s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - // s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - // s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - // s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - // s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - // s18 = 0; - - // Reduce the bit length of limbs from s6 to s15 to 21-bits. - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= carry10 << 21; - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= carry12 << 21; - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= carry14 << 21; - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= carry16 << 21; - - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= carry11 << 21; - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= carry13 << 21; - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= carry15 << 21; - - // Resume reduction where we left off. - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - // s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - // s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - // s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - // s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - // s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - // Reduce the range of limbs from s0 to s11 to 21-bits. - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= carry10 << 21; - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - // Carry chain reduction to propagate excess bits from s0 to s5 to the most significant limbs. - carry0 = s0 >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry1 = s1 >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry2 = s2 >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry3 = s3 >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry4 = s4 >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry5 = s5 >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry6 = s6 >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry7 = s7 >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry8 = s8 >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry9 = s9 >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry10 = s10 >> 21; - s11 += carry10; - s10 -= carry10 << 21; - carry11 = s11 >> 21; - s12 += carry11; - s11 -= carry11 << 21; - - // Do one last reduction as s12 might be 1. - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - // s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry1 = s1 >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry2 = s2 >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry3 = s3 >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry4 = s4 >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry5 = s5 >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry6 = s6 >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry7 = s7 >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry8 = s8 >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry9 = s9 >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry10 = s10 >> 21; - s11 += carry10; - s10 -= carry10 << 21; - - // Serialize the result into the s. - s[0] = (byte) s0; - s[1] = (byte) (s0 >> 8); - s[2] = (byte) ((s0 >> 16) | (s1 << 5)); - s[3] = (byte) (s1 >> 3); - s[4] = (byte) (s1 >> 11); - s[5] = (byte) ((s1 >> 19) | (s2 << 2)); - s[6] = (byte) (s2 >> 6); - s[7] = (byte) ((s2 >> 14) | (s3 << 7)); - s[8] = (byte) (s3 >> 1); - s[9] = (byte) (s3 >> 9); - s[10] = (byte) ((s3 >> 17) | (s4 << 4)); - s[11] = (byte) (s4 >> 4); - s[12] = (byte) (s4 >> 12); - s[13] = (byte) ((s4 >> 20) | (s5 << 1)); - s[14] = (byte) (s5 >> 7); - s[15] = (byte) ((s5 >> 15) | (s6 << 6)); - s[16] = (byte) (s6 >> 2); - s[17] = (byte) (s6 >> 10); - s[18] = (byte) ((s6 >> 18) | (s7 << 3)); - s[19] = (byte) (s7 >> 5); - s[20] = (byte) (s7 >> 13); - s[21] = (byte) s8; - s[22] = (byte) (s8 >> 8); - s[23] = (byte) ((s8 >> 16) | (s9 << 5)); - s[24] = (byte) (s9 >> 3); - s[25] = (byte) (s9 >> 11); - s[26] = (byte) ((s9 >> 19) | (s10 << 2)); - s[27] = (byte) (s10 >> 6); - s[28] = (byte) ((s10 >> 14) | (s11 << 7)); - s[29] = (byte) (s11 >> 1); - s[30] = (byte) (s11 >> 9); - s[31] = (byte) (s11 >> 17); - } - - /** - * Input: - * a[0]+256*a[1]+...+256^31*a[31] = a - * b[0]+256*b[1]+...+256^31*b[31] = b - * c[0]+256*c[1]+...+256^31*c[31] = c - *

- * Output: - * s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l - * where l = 2^252 + 27742317777372353535851937790883648493. - */ - private static void mulAdd(byte[] s, byte[] a, byte[] b, byte[] c) { - // This is very similar to Ed25519.reduce, the difference in here is that it computes ab+c - // See Ed25519.reduce for related comments. - long a0 = 2097151 & load3(a, 0); - long a1 = 2097151 & (load4(a, 2) >> 5); - long a2 = 2097151 & (load3(a, 5) >> 2); - long a3 = 2097151 & (load4(a, 7) >> 7); - long a4 = 2097151 & (load4(a, 10) >> 4); - long a5 = 2097151 & (load3(a, 13) >> 1); - long a6 = 2097151 & (load4(a, 15) >> 6); - long a7 = 2097151 & (load3(a, 18) >> 3); - long a8 = 2097151 & load3(a, 21); - long a9 = 2097151 & (load4(a, 23) >> 5); - long a10 = 2097151 & (load3(a, 26) >> 2); - long a11 = (load4(a, 28) >> 7); - long b0 = 2097151 & load3(b, 0); - long b1 = 2097151 & (load4(b, 2) >> 5); - long b2 = 2097151 & (load3(b, 5) >> 2); - long b3 = 2097151 & (load4(b, 7) >> 7); - long b4 = 2097151 & (load4(b, 10) >> 4); - long b5 = 2097151 & (load3(b, 13) >> 1); - long b6 = 2097151 & (load4(b, 15) >> 6); - long b7 = 2097151 & (load3(b, 18) >> 3); - long b8 = 2097151 & load3(b, 21); - long b9 = 2097151 & (load4(b, 23) >> 5); - long b10 = 2097151 & (load3(b, 26) >> 2); - long b11 = (load4(b, 28) >> 7); - long c0 = 2097151 & load3(c, 0); - long c1 = 2097151 & (load4(c, 2) >> 5); - long c2 = 2097151 & (load3(c, 5) >> 2); - long c3 = 2097151 & (load4(c, 7) >> 7); - long c4 = 2097151 & (load4(c, 10) >> 4); - long c5 = 2097151 & (load3(c, 13) >> 1); - long c6 = 2097151 & (load4(c, 15) >> 6); - long c7 = 2097151 & (load3(c, 18) >> 3); - long c8 = 2097151 & load3(c, 21); - long c9 = 2097151 & (load4(c, 23) >> 5); - long c10 = 2097151 & (load3(c, 26) >> 2); - long c11 = (load4(c, 28) >> 7); - long s0; - long s1; - long s2; - long s3; - long s4; - long s5; - long s6; - long s7; - long s8; - long s9; - long s10; - long s11; - long s12; - long s13; - long s14; - long s15; - long s16; - long s17; - long s18; - long s19; - long s20; - long s21; - long s22; - long s23; - long carry0; - long carry1; - long carry2; - long carry3; - long carry4; - long carry5; - long carry6; - long carry7; - long carry8; - long carry9; - long carry10; - long carry11; - long carry12; - long carry13; - long carry14; - long carry15; - long carry16; - long carry17; - long carry18; - long carry19; - long carry20; - long carry21; - long carry22; - - s0 = c0 + a0 * b0; - s1 = c1 + a0 * b1 + a1 * b0; - s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; - s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; - s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; - s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; - s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; - s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; - s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 - + a8 * b0; - s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 - + a8 * b1 + a9 * b0; - s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 - + a8 * b2 + a9 * b1 + a10 * b0; - s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 - + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; - s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 - + a10 * b2 + a11 * b1; - s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 - + a11 * b2; - s14 = - a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; - s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; - s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; - s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; - s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; - s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; - s20 = a9 * b11 + a10 * b10 + a11 * b9; - s21 = a10 * b11 + a11 * b10; - s22 = a11 * b11; - s23 = 0; - - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= carry10 << 21; - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= carry12 << 21; - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= carry14 << 21; - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= carry16 << 21; - carry18 = (s18 + (1 << 20)) >> 21; - s19 += carry18; - s18 -= carry18 << 21; - carry20 = (s20 + (1 << 20)) >> 21; - s21 += carry20; - s20 -= carry20 << 21; - carry22 = (s22 + (1 << 20)) >> 21; - s23 += carry22; - s22 -= carry22 << 21; - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= carry11 << 21; - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= carry13 << 21; - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= carry15 << 21; - carry17 = (s17 + (1 << 20)) >> 21; - s18 += carry17; - s17 -= carry17 << 21; - carry19 = (s19 + (1 << 20)) >> 21; - s20 += carry19; - s19 -= carry19 << 21; - carry21 = (s21 + (1 << 20)) >> 21; - s22 += carry21; - s21 -= carry21 << 21; - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - // s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - // s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - // s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - // s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - // s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - // s18 = 0; - - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= carry10 << 21; - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= carry12 << 21; - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= carry14 << 21; - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= carry16 << 21; - - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= carry11 << 21; - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= carry13 << 21; - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= carry15 << 21; - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - // s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - // s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - // s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - // s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - // s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= carry10 << 21; - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry1 = s1 >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry2 = s2 >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry3 = s3 >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry4 = s4 >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry5 = s5 >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry6 = s6 >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry7 = s7 >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry8 = s8 >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry9 = s9 >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry10 = s10 >> 21; - s11 += carry10; - s10 -= carry10 << 21; - carry11 = s11 >> 21; - s12 += carry11; - s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - // s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= carry0 << 21; - carry1 = s1 >> 21; - s2 += carry1; - s1 -= carry1 << 21; - carry2 = s2 >> 21; - s3 += carry2; - s2 -= carry2 << 21; - carry3 = s3 >> 21; - s4 += carry3; - s3 -= carry3 << 21; - carry4 = s4 >> 21; - s5 += carry4; - s4 -= carry4 << 21; - carry5 = s5 >> 21; - s6 += carry5; - s5 -= carry5 << 21; - carry6 = s6 >> 21; - s7 += carry6; - s6 -= carry6 << 21; - carry7 = s7 >> 21; - s8 += carry7; - s7 -= carry7 << 21; - carry8 = s8 >> 21; - s9 += carry8; - s8 -= carry8 << 21; - carry9 = s9 >> 21; - s10 += carry9; - s9 -= carry9 << 21; - carry10 = s10 >> 21; - s11 += carry10; - s10 -= carry10 << 21; - - s[0] = (byte) s0; - s[1] = (byte) (s0 >> 8); - s[2] = (byte) ((s0 >> 16) | (s1 << 5)); - s[3] = (byte) (s1 >> 3); - s[4] = (byte) (s1 >> 11); - s[5] = (byte) ((s1 >> 19) | (s2 << 2)); - s[6] = (byte) (s2 >> 6); - s[7] = (byte) ((s2 >> 14) | (s3 << 7)); - s[8] = (byte) (s3 >> 1); - s[9] = (byte) (s3 >> 9); - s[10] = (byte) ((s3 >> 17) | (s4 << 4)); - s[11] = (byte) (s4 >> 4); - s[12] = (byte) (s4 >> 12); - s[13] = (byte) ((s4 >> 20) | (s5 << 1)); - s[14] = (byte) (s5 >> 7); - s[15] = (byte) ((s5 >> 15) | (s6 << 6)); - s[16] = (byte) (s6 >> 2); - s[17] = (byte) (s6 >> 10); - s[18] = (byte) ((s6 >> 18) | (s7 << 3)); - s[19] = (byte) (s7 >> 5); - s[20] = (byte) (s7 >> 13); - s[21] = (byte) s8; - s[22] = (byte) (s8 >> 8); - s[23] = (byte) ((s8 >> 16) | (s9 << 5)); - s[24] = (byte) (s9 >> 3); - s[25] = (byte) (s9 >> 11); - s[26] = (byte) ((s9 >> 19) | (s10 << 2)); - s[27] = (byte) (s10 >> 6); - s[28] = (byte) ((s10 >> 14) | (s11 << 7)); - s[29] = (byte) (s11 >> 1); - s[30] = (byte) (s11 >> 9); - s[31] = (byte) (s11 >> 17); - } - - // The order of the generator as unsigned bytes in little endian order. - // (2^252 + 0x14def9dea2f79cd65812631a5cf5d3ed, cf. RFC 7748) - private static final byte[] GROUP_ORDER = {(byte) 0xed, (byte) 0xd3, (byte) 0xf5, (byte) 0x5c, - (byte) 0x1a, (byte) 0x63, (byte) 0x12, (byte) 0x58, (byte) 0xd6, (byte) 0x9c, (byte) 0xf7, - (byte) 0xa2, (byte) 0xde, (byte) 0xf9, (byte) 0xde, (byte) 0x14, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10}; - - // Checks whether s represents an integer smaller than the order of the group. - // This is needed to ensure that EdDSA signatures are non-malleable, as failing to check - // the range of S allows to modify signatures (cf. RFC 8032, Section 5.2.7 and Section 8.4.) - // @param s an integer in little-endian order. - private static boolean isSmallerThanGroupOrder(byte[] s) { - for (int j = Field25519.FIELD_LEN - 1; j >= 0; j--) { - // compare unsigned bytes - int a = s[j] & 0xff; - int b = GROUP_ORDER[j] & 0xff; - if (a != b) { - return a < b; - } - } - return false; - } - - /** - * Returns true if the EdDSA {@code signature} with {@code message}, can be verified with - * {@code publicKey}. - */ - public static boolean verify( - final byte[] message, final byte[] signature, final byte[] publicKey) { - try { - if (signature.length != SIGNATURE_LEN) { - return false; - } - if (publicKey.length != PUBLIC_KEY_LEN) { - return false; - } - byte[] s = Arrays.copyOfRange(signature, Field25519.FIELD_LEN, SIGNATURE_LEN); - if (!isSmallerThanGroupOrder(s)) { - return false; - } - MessageDigest digest = MessageDigest.getInstance("SHA-512"); - digest.update(signature, 0, Field25519.FIELD_LEN); - digest.update(publicKey); - digest.update(message); - byte[] h = digest.digest(); - reduce(h); - - XYZT negPublicKey = XYZT.fromBytesNegateVarTime(publicKey); - XYZ xyz = doubleScalarMultVarTime(h, negPublicKey, s); - byte[] expectedR = xyz.toBytes(); - for (int i = 0; i < Field25519.FIELD_LEN; i++) { - if (expectedR[i] != signature[i]) { - return false; - } - } - return true; - } catch (final GeneralSecurityException ignored) { - return false; - } - } -} diff --git a/client/android/src/com/wireguard/crypto/Key.java b/client/android/src/com/wireguard/crypto/Key.java deleted file mode 100644 index a720624bb..000000000 --- a/client/android/src/com/wireguard/crypto/Key.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.crypto; - -import com.wireguard.crypto.KeyFormatException.Type; - -import java.security.MessageDigest; -import java.security.SecureRandom; -import java.util.Arrays; - -/** - * Represents a WireGuard public or private key. This class uses specialized constant-time base64 - * and hexadecimal codec implementations that resist side-channel attacks. - *

- * Instances of this class are immutable. - */ -@SuppressWarnings("MagicNumber") - -public final class Key { - private final byte[] key; - - /** - * Constructs an object encapsulating the supplied key. - * - * @param key an array of bytes containing a binary key. Callers of this constructor are - * responsible for ensuring that the array is of the correct length. - */ - private Key(final byte[] key) { - // Defensively copy to ensure immutability. - this.key = Arrays.copyOf(key, key.length); - } - - /** - * Decodes a single 4-character base64 chunk to an integer in constant time. - * - * @param src an array of at least 4 characters in base64 format - * @param srcOffset the offset of the beginning of the chunk in {@code src} - * @return the decoded 3-byte integer, or some arbitrary integer value if the input was not - * valid base64 - */ - private static int decodeBase64(final char[] src, final int srcOffset) { - int val = 0; - for (int i = 0; i < 4; ++i) { - final char c = src[i + srcOffset]; - val |= (-1 + ((((('A' - 1) - c) & (c - ('Z' + 1))) >>> 8) & (c - 64)) - + ((((('a' - 1) - c) & (c - ('z' + 1))) >>> 8) & (c - 70)) - + ((((('0' - 1) - c) & (c - ('9' + 1))) >>> 8) & (c + 5)) - + ((((('+' - 1) - c) & (c - ('+' + 1))) >>> 8) & 63) - + ((((('/' - 1) - c) & (c - ('/' + 1))) >>> 8) & 64)) - << (18 - 6 * i); - } - return val; - } - - /** - * Encodes a single 4-character base64 chunk from 3 consecutive bytes in constant time. - * - * @param src an array of at least 3 bytes - * @param srcOffset the offset of the beginning of the chunk in {@code src} - * @param dest an array of at least 4 characters - * @param destOffset the offset of the beginning of the chunk in {@code dest} - */ - private static void encodeBase64( - final byte[] src, final int srcOffset, final char[] dest, final int destOffset) { - final byte[] input = { - (byte) ((src[srcOffset] >>> 2) & 63), - (byte) ((src[srcOffset] << 4 | ((src[1 + srcOffset] & 0xff) >>> 4)) & 63), - (byte) ((src[1 + srcOffset] << 2 | ((src[2 + srcOffset] & 0xff) >>> 6)) & 63), - (byte) ((src[2 + srcOffset]) & 63), - }; - for (int i = 0; i < 4; ++i) { - dest[i + destOffset] = - (char) (input[i] + 'A' + (((25 - input[i]) >>> 8) & 6) - (((51 - input[i]) >>> 8) & 75) - - (((61 - input[i]) >>> 8) & 15) + (((62 - input[i]) >>> 8) & 3)); - } - } - - /** - * Decodes a WireGuard public or private key from its base64 string representation. This - * function throws a {@link KeyFormatException} if the source string is not well-formed. - * - * @param str the base64 string representation of a WireGuard key - * @return the decoded key encapsulated in an immutable container - */ - public static Key fromBase64(final String str) throws KeyFormatException { - final char[] input = str.toCharArray(); - if (input.length != Format.BASE64.length || input[Format.BASE64.length - 1] != '=') - throw new KeyFormatException(Format.BASE64, Type.LENGTH); - final byte[] key = new byte[Format.BINARY.length]; - int i; - int ret = 0; - for (i = 0; i < key.length / 3; ++i) { - final int val = decodeBase64(input, i * 4); - ret |= val >>> 31; - key[i * 3] = (byte) ((val >>> 16) & 0xff); - key[i * 3 + 1] = (byte) ((val >>> 8) & 0xff); - key[i * 3 + 2] = (byte) (val & 0xff); - } - final char[] endSegment = { - input[i * 4], - input[i * 4 + 1], - input[i * 4 + 2], - 'A', - }; - final int val = decodeBase64(endSegment, 0); - ret |= (val >>> 31) | (val & 0xff); - key[i * 3] = (byte) ((val >>> 16) & 0xff); - key[i * 3 + 1] = (byte) ((val >>> 8) & 0xff); - - if (ret != 0) - throw new KeyFormatException(Format.BASE64, Type.CONTENTS); - return new Key(key); - } - - /** - * Wraps a WireGuard public or private key in an immutable container. This function throws a - * {@link KeyFormatException} if the source data is not the correct length. - * - * @param bytes an array of bytes containing a WireGuard key in binary format - * @return the key encapsulated in an immutable container - */ - public static Key fromBytes(final byte[] bytes) throws KeyFormatException { - if (bytes.length != Format.BINARY.length) - throw new KeyFormatException(Format.BINARY, Type.LENGTH); - return new Key(bytes); - } - - /** - * Decodes a WireGuard public or private key from its hexadecimal string representation. This - * function throws a {@link KeyFormatException} if the source string is not well-formed. - * - * @param str the hexadecimal string representation of a WireGuard key - * @return the decoded key encapsulated in an immutable container - */ - public static Key fromHex(final String str) throws KeyFormatException { - final char[] input = str.toCharArray(); - if (input.length != Format.HEX.length) - throw new KeyFormatException(Format.HEX, Type.LENGTH); - final byte[] key = new byte[Format.BINARY.length]; - int ret = 0; - for (int i = 0; i < key.length; ++i) { - int c; - int cNum; - int cNum0; - int cAlpha; - int cAlpha0; - int cVal; - final int cAcc; - - c = input[i * 2]; - cNum = c ^ 48; - cNum0 = ((cNum - 10) >>> 8) & 0xff; - cAlpha = (c & ~32) - 55; - cAlpha0 = (((cAlpha - 10) ^ (cAlpha - 16)) >>> 8) & 0xff; - ret |= ((cNum0 | cAlpha0) - 1) >>> 8; - cVal = (cNum0 & cNum) | (cAlpha0 & cAlpha); - cAcc = cVal * 16; - - c = input[i * 2 + 1]; - cNum = c ^ 48; - cNum0 = ((cNum - 10) >>> 8) & 0xff; - cAlpha = (c & ~32) - 55; - cAlpha0 = (((cAlpha - 10) ^ (cAlpha - 16)) >>> 8) & 0xff; - ret |= ((cNum0 | cAlpha0) - 1) >>> 8; - cVal = (cNum0 & cNum) | (cAlpha0 & cAlpha); - key[i] = (byte) (cAcc | cVal); - } - if (ret != 0) - throw new KeyFormatException(Format.HEX, Type.CONTENTS); - return new Key(key); - } - - /** - * Generates a private key using the system's {@link SecureRandom} number generator. - * - * @return a well-formed random private key - */ - static Key generatePrivateKey() { - final SecureRandom secureRandom = new SecureRandom(); - final byte[] privateKey = new byte[Format.BINARY.getLength()]; - secureRandom.nextBytes(privateKey); - privateKey[0] &= 248; - privateKey[31] &= 127; - privateKey[31] |= 64; - return new Key(privateKey); - } - - /** - * Generates a public key from an existing private key. - * - * @param privateKey a private key - * @return a well-formed public key that corresponds to the supplied private key - */ - static Key generatePublicKey(final Key privateKey) { - final byte[] publicKey = new byte[Format.BINARY.getLength()]; - Curve25519.eval(publicKey, 0, privateKey.getBytes(), null); - return new Key(publicKey); - } - - @Override - public boolean equals(final Object obj) { - if (obj == this) - return true; - if (obj == null || obj.getClass() != getClass()) - return false; - final Key other = (Key) obj; - return MessageDigest.isEqual(key, other.key); - } - - /** - * Returns the key as an array of bytes. - * - * @return an array of bytes containing the raw binary key - */ - public byte[] getBytes() { - // Defensively copy to ensure immutability. - return Arrays.copyOf(key, key.length); - } - - @Override - public int hashCode() { - int ret = 0; - for (int i = 0; i < key.length / 4; ++i) - ret ^= (key[i * 4 + 0] >> 0) + (key[i * 4 + 1] >> 8) + (key[i * 4 + 2] >> 16) - + (key[i * 4 + 3] >> 24); - return ret; - } - - /** - * Encodes the key to base64. - * - * @return a string containing the encoded key - */ - public String toBase64() { - final char[] output = new char[Format.BASE64.length]; - int i; - for (i = 0; i < key.length / 3; ++i) encodeBase64(key, i * 3, output, i * 4); - final byte[] endSegment = { - key[i * 3], - key[i * 3 + 1], - 0, - }; - encodeBase64(endSegment, 0, output, i * 4); - output[Format.BASE64.length - 1] = '='; - return new String(output); - } - - /** - * Encodes the key to hexadecimal ASCII characters. - * - * @return a string containing the encoded key - */ - public String toHex() { - final char[] output = new char[Format.HEX.length]; - for (int i = 0; i < key.length; ++i) { - output[i * 2] = (char) (87 + (key[i] >> 4 & 0xf) + ((((key[i] >> 4 & 0xf) - 10) >> 8) & ~38)); - output[i * 2 + 1] = (char) (87 + (key[i] & 0xf) + ((((key[i] & 0xf) - 10) >> 8) & ~38)); - } - return new String(output); - } - - /** - * The supported formats for encoding a WireGuard key. - */ - public enum Format { - BASE64(44), - BINARY(32), - HEX(64); - - private final int length; - - Format(final int length) { - this.length = length; - } - - public int getLength() { - return length; - } - } -} diff --git a/client/android/src/com/wireguard/crypto/KeyFormatException.java b/client/android/src/com/wireguard/crypto/KeyFormatException.java deleted file mode 100644 index cfd6f5115..000000000 --- a/client/android/src/com/wireguard/crypto/KeyFormatException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.crypto; - -/** - * An exception thrown when attempting to parse an invalid key (too short, too long, or byte - * data inappropriate for the format). The format being parsed can be accessed with the - * {@link #getFormat} method. - */ - -public final class KeyFormatException extends Exception { - private final Key.Format format; - private final Type type; - - KeyFormatException(final Key.Format format, final Type type) { - this.format = format; - this.type = type; - } - - public Key.Format getFormat() { - return format; - } - - public Type getType() { - return type; - } - - public enum Type { CONTENTS, LENGTH } -} diff --git a/client/android/src/com/wireguard/crypto/KeyPair.java b/client/android/src/com/wireguard/crypto/KeyPair.java deleted file mode 100644 index 221915aa4..000000000 --- a/client/android/src/com/wireguard/crypto/KeyPair.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.crypto; - -/** - * Represents a Curve25519 key pair as used by WireGuard. - *

- * Instances of this class are immutable. - */ - -public class KeyPair { - private final Key privateKey; - private final Key publicKey; - - /** - * Creates a key pair using a newly-generated private key. - */ - public KeyPair() { - this(Key.generatePrivateKey()); - } - - /** - * Creates a key pair using an existing private key. - * - * @param privateKey a private key, used to derive the public key - */ - public KeyPair(final Key privateKey) { - this.privateKey = privateKey; - publicKey = Key.generatePublicKey(privateKey); - } - - /** - * Returns the private key from the key pair. - * - * @return the private key - */ - public Key getPrivateKey() { - return privateKey; - } - - /** - * Returns the public key from the key pair. - * - * @return the public key - */ - public Key getPublicKey() { - return publicKey; - } -} diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt index 68395af8a..f2496db17 100644 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt @@ -10,13 +10,13 @@ import android.os.Build import android.os.IBinder import android.system.OsConstants import java.io.File -import com.wireguard.android.util.SharedLibraryLoader -import com.wireguard.config.* -import com.wireguard.crypto.Key +// import com.wireguard.android.util.SharedLibraryLoader +// import com.wireguard.config.* +// import com.wireguard.crypto.Key import org.json.JSONObject import java.util.Base64 -import com.wireguard.config.* +// import com.wireguard.config.* import net.openvpn.ovpn3.ClientAPI_Config import net.openvpn.ovpn3.ClientAPI_EvalConfig @@ -32,8 +32,8 @@ import net.openvpn.ovpn3.ClientAPI_TransportStats import java.lang.StringBuilder -class OpenVPNThreadv3(var service: AmneziaVpnService): ClientAPI_OpenVPNClient(), Runnable { - private val tag = "OpenVPNThreadv3" +class OpenVPNThreadv3(var service: AmneziaVpnService): ClientAPI_OpenVPNClient()/* , Runnable */ { + /* private val tag = "OpenVPNThreadv3" private var mAlreadyInitialised = false private var mService: AmneziaVpnService = service @@ -255,5 +255,5 @@ class OpenVPNThreadv3(var service: AmneziaVpnService): ClientAPI_OpenVPNClient() override fun stop() { super.stop() - } + } */ } From 385a52f676ff1f4c4826d2b553b311db00c7bbfd Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 24 Nov 2023 21:51:09 +0300 Subject: [PATCH 062/144] Vpn service refactoring --- client/android/AndroidManifest.xml | 8 + .../src/main/kotlin/ProtocolState.kt | 3 +- client/android/res/values/styles.xml | 10 + .../src/org/amnezia/vpn/AmneziaActivity.kt | 5 +- .../src/org/amnezia/vpn/AmneziaApplication.kt | 18 + .../src/org/amnezia/vpn/AmneziaVpnService.kt | 1157 ++++------------- .../src/org/amnezia/vpn/NetworkState.kt | 2 +- .../src/org/amnezia/vpn/NotificationUtil.kt | 115 -- .../src/org/amnezia/vpn/VPNServiceBinder.kt | 211 --- .../src/org/amnezia/vpn/VpnRequestActivity.kt | 69 + 10 files changed, 372 insertions(+), 1226 deletions(-) delete mode 100644 client/android/src/org/amnezia/vpn/NotificationUtil.kt delete mode 100644 client/android/src/org/amnezia/vpn/VPNServiceBinder.kt create mode 100644 client/android/src/org/amnezia/vpn/VpnRequestActivity.kt diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 62b91cead..e9ae60cec 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -68,6 +68,14 @@ android:taskAffinity="" android:exported="false" /> + + diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolState.kt b/client/android/protocolApi/src/main/kotlin/ProtocolState.kt index d79949fa3..e66ed2ae1 100644 --- a/client/android/protocolApi/src/main/kotlin/ProtocolState.kt +++ b/client/android/protocolApi/src/main/kotlin/ProtocolState.kt @@ -4,6 +4,5 @@ enum class ProtocolState { CONNECTED, CONNECTING, DISCONNECTED, - DISCONNECTING, - UNKNOWN + DISCONNECTING } diff --git a/client/android/res/values/styles.xml b/client/android/res/values/styles.xml index 6358e68d2..9f4201f89 100644 --- a/client/android/res/values/styles.xml +++ b/client/android/res/values/styles.xml @@ -4,4 +4,14 @@ false true + \ No newline at end of file diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index 148c7eeb1..40b504530 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -6,13 +6,11 @@ import android.content.ServiceConnection import android.net.Uri import android.net.VpnService import android.os.Bundle -import android.os.DeadObjectException import android.os.Handler import android.os.IBinder import android.os.Looper import android.os.Message import android.os.Messenger -import android.os.RemoteException import android.widget.Toast import androidx.annotation.MainThread import androidx.core.content.ContextCompat @@ -76,6 +74,9 @@ class AmneziaActivity : QtActivity() { } ServiceEvent.ERROR -> { + msg.data?.getString(ERROR_MSG)?.let { error -> + Log.e(TAG, "From VpnService: $error") + } // todo: add error reporting to Qt QtAndroidController.onServiceError() } diff --git a/client/android/src/org/amnezia/vpn/AmneziaApplication.kt b/client/android/src/org/amnezia/vpn/AmneziaApplication.kt index df8b02ae5..e9d8fdfb7 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaApplication.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaApplication.kt @@ -3,14 +3,32 @@ package org.amnezia.vpn import androidx.camera.camera2.Camera2Config import androidx.camera.core.CameraSelector import androidx.camera.core.CameraXConfig +import androidx.core.app.NotificationChannelCompat.Builder +import androidx.core.app.NotificationManagerCompat import org.qtproject.qt.android.bindings.QtApplication +const val NOTIFICATION_CHANNEL_ID: String = "org.amnezia.vpn.notification" + class AmneziaApplication : QtApplication(), CameraXConfig.Provider { + override fun onCreate() { + super.onCreate() + createNotificationChannel() + } + override fun getCameraXConfig(): CameraXConfig = CameraXConfig.Builder .fromConfig(Camera2Config.defaultConfig()) .setMinimumLoggingLevel(android.util.Log.ERROR) .setAvailableCamerasLimiter(CameraSelector.DEFAULT_BACK_CAMERA) .build() + private fun createNotificationChannel() { + NotificationManagerCompat.from(this).createNotificationChannel( + Builder(NOTIFICATION_CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_LOW) + .setName("AmneziaVPN") + .setDescription("AmneziaVPN service notification") + .setShowBadge(false) + .build() + ) + } } diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 8c7815474..58f107198 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -1,983 +1,350 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public -* License, v. 2.0. If a copy of the MPL was not distributed with this -* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - package org.amnezia.vpn -import android.content.Context +import android.app.Notification +import android.app.PendingIntent import android.content.Intent -import android.content.pm.PackageManager -import android.net.LocalSocket -import android.net.LocalSocketAddress -import android.net.Network -import android.net.ProxyInfo -import android.os.* -import android.system.ErrnoException -import android.system.Os -import android.system.OsConstants -import android.text.TextUtils -import androidx.core.content.FileProvider -import com.wireguard.android.util.SharedLibraryLoader -import com.wireguard.config.* -import com.wireguard.crypto.Key -import com.wireguard.android.backend.GoBackend +import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST +import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE +import android.net.VpnService +import android.os.Build +import android.os.Handler +import android.os.IBinder +import android.os.Looper +import android.os.Message +import android.os.Messenger +import androidx.annotation.MainThread +import androidx.core.app.NotificationCompat +import androidx.core.app.ServiceCompat +import kotlin.LazyThreadSafetyMode.NONE +import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.delay +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -// import org.amnezia.vpn.shadowsocks.core.Core -// import org.amnezia.vpn.shadowsocks.core.R -// import org.amnezia.vpn.shadowsocks.core.VpnRequestActivity -// import org.amnezia.vpn.shadowsocks.core.acl.Acl -// import org.amnezia.vpn.shadowsocks.core.bg.* -// import org.amnezia.vpn.shadowsocks.core.database.Profile -// import org.amnezia.vpn.shadowsocks.core.database.ProfileManager -// import org.amnezia.vpn.shadowsocks.core.net.ConcurrentLocalSocketListener -// import org.amnezia.vpn.shadowsocks.core.net.DefaultNetworkListener -// import org.amnezia.vpn.shadowsocks.core.net.Subnet -// import org.amnezia.vpn.shadowsocks.core.preference.DataStore -// import org.amnezia.vpn.shadowsocks.core.utils.Key.modeVpn -// import org.amnezia.vpn.shadowsocks.core.utils.printLog +import org.amnezia.vpn.protocol.BadConfigException +import org.amnezia.vpn.protocol.LoadLibraryException +import org.amnezia.vpn.protocol.Protocol +import org.amnezia.vpn.protocol.ProtocolState.CONNECTED +import org.amnezia.vpn.protocol.ProtocolState.CONNECTING +import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED +import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTING +import org.amnezia.vpn.protocol.Statistics +import org.amnezia.vpn.protocol.Status +import org.amnezia.vpn.protocol.VpnStartException +import org.amnezia.vpn.protocol.putStatistics +import org.amnezia.vpn.protocol.putStatus +import org.amnezia.vpn.protocol.wireguard.Wireguard +import org.json.JSONException import org.json.JSONObject -import java.io.Closeable -import java.io.File -import java.io.FileDescriptor -import java.io.IOException -import java.lang.Exception -import android.net.VpnService as BaseVpnService - -const val VPN_CONFIG = "VPN_CONFIG" - -class AmneziaVpnService : BaseVpnService()/* , LocalDnsService.Interface */ { - - // override val data = BaseService.Data(this) - - /* override */ val tag: String get() = "AmneziaVpnService" -// override fun createNotification(profileName: String): ServiceNotification = -// ServiceNotification(this, profileName, "service-vpn") - - private var conn: ParcelFileDescriptor? = null - // private var worker: ProtectWorker? = null - private var active = false - private var metered = false - private var mNetworkState = NetworkState(this) - private var underlyingNetwork: Network? = null - set(value) { - field = value - if (active && Build.VERSION.SDK_INT >= 22) setUnderlyingNetworks(underlyingNetworks) - } - private val underlyingNetworks - get() = - // clearing underlyingNetworks makes Android 9+ consider the network to be metered - if (Build.VERSION.SDK_INT >= 28 && metered) null else underlyingNetwork?.let { - arrayOf( - it - ) - } - - val handler = Handler(Looper.getMainLooper()) - var runnable: Runnable = object : Runnable { - override fun run() { - if (mProtocol.equals("shadowsocks", true)) { - /* Log.e(tag, "run: -----------------: ${data.state}") - when (data.state) { - BaseService.State.Connected -> { - currentTunnelHandle = 1 - isUp = true - } - BaseService.State.Stopped -> { - currentTunnelHandle = -1 - isUp = false - } - else -> { - - } - } */ - } - handler.postDelayed(this, 1000L) //wait 4 sec and run again - } - } - - fun stopTest() { - handler.removeCallbacks(runnable) - } - fun startTest() { - handler.postDelayed(runnable, 0) //wait 0 ms and run - } - - companion object { - private const val VPN_MTU = 1500 - private const val PRIVATE_VLAN4_CLIENT = "172.19.0.1" - private const val PRIVATE_VLAN4_ROUTER = "172.19.0.2" - private const val PRIVATE_VLAN6_CLIENT = "fdfe:dcba:9876::1" - private const val PRIVATE_VLAN6_ROUTER = "fdfe:dcba:9876::2" - - /** - * https://android.googlesource.com/platform/prebuilts/runtime/+/94fec32/appcompat/hiddenapi-light-greylist.txt#9466 - */ - private val getInt = FileDescriptor::class.java.getDeclaredMethod("getInt$") - - @JvmStatic - fun startService(c: Context) { - c.applicationContext.startService( - Intent(c.applicationContext, AmneziaVpnService::class.java).apply { - putExtra("startOnly", true) - }) - } - - } +private const val TAG = "AmneziaVpnService" - private var mBinder: VPNServiceBinder = VPNServiceBinder(this) - private var mConfig: JSONObject? = null - private var mProtocol: String? = null - private var mConnectionTime: Long = 0 - private var mAlreadyInitialised = false - private var mbuilder: Builder = Builder() +const val VPN_CONFIG = "VPN_CONFIG" +const val ERROR_MSG = "ERROR_MSG" +const val AFTER_PERMISSION_CHECK = "AFTER_PERMISSION_CHECK" +private const val PREFS_CONFIG_KEY = "LAST_CONF" +private const val NOTIFICATION_ID = 1337 - private var mOpenVPNThreadv3: OpenVPNThreadv3? = null - var currentTunnelHandle = -1 +class AmneziaVpnService : VpnService() { - private var intent: Intent? = null - private var flags = 0 - private var startId = 0 + private lateinit var mainScope: CoroutineScope + private var isServiceBound = false + private var protocol: Protocol? = null + private var protocolState = MutableStateFlow(DISCONNECTED) - fun init() { - if (mAlreadyInitialised) { - return - } - // Log.init(this) - SharedLibraryLoader.loadSharedLibrary(this, "wg-go") - SharedLibraryLoader.loadSharedLibrary(this, "ovpn3") - Log.i(tag, "Loaded libs") - Log.e(tag, "Wireguard Version ${GoBackend.wgVersion()}") - mOpenVPNThreadv3 = OpenVPNThreadv3(this) - mAlreadyInitialised = true - } + private val isConnected + get() = protocolState.value == CONNECTED - override fun onCreate() { - super.onCreate() - NotificationUtil.show(this) // Go foreground - } + private val isDisconnected + get() = protocolState.value == DISCONNECTED - override fun onUnbind(intent: Intent?): Boolean { - if (!isUp) { - // If the Qt Client got closed while we were not connected - // we do not need to stay as a foreground service. - stopForeground(true) - } - return super.onUnbind(intent) - } + private var connectionJob: Job? = null + private var disconnectionJob: Job? = null + private lateinit var clientMessenger: IpcMessenger - override fun onDestroy() { - turnOff() - - super.onDestroy() - } - - /** - * EntryPoint for the Service, gets Called when AndroidController.cpp - * calles bindService. Returns the [VPNServiceBinder] so QT can send Requests to it. - */ - override fun onBind(intent: Intent): IBinder { - - when (mProtocol) { - "shadowsocks" -> { - /* when (intent.action) { - SERVICE_INTERFACE -> super.onBind(intent) - else -> super.onBind(intent) - } - startTest() */ - } - else -> { - init() - } - } + private val connectionExceptionHandler = CoroutineExceptionHandler { _, e -> + protocolState.value = DISCONNECTED + protocol = null + when (e) { + is IllegalArgumentException, + is VpnStartException -> onError(e.message ?: e.toString()) - return mBinder - } + is JSONException, + is BadConfigException -> onError("VPN config format error: ${e.message}") - /** - * Might be the entryPoint if the Service gets Started via an - * Service Intent: Might be from Always-On-Vpn from Settings - * or from Booting the device and having "connect on boot" enabled. - */ - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - this.intent = intent - this.flags = flags - this.startId = startId - init() - intent?.let { - if (!isUp && intent.getBooleanExtra("startOnly", false)) { - Log.i(tag, "Start only!") - return START_REDELIVER_INTENT -// return super.onStartCommand(intent, flags, startId) - } - } - // This start is from always-on - if (this.mConfig == null) { - // We don't have tunnel to turn on - Try to create one with last config the service got - val prefs = Prefs.get(this) - val lastConfString = prefs.getString("lastConf", "") - if (lastConfString.isNullOrEmpty()) { - // We have nothing to connect to -> Exit - Log.e(tag, "VPN service was triggered without defining a Server or having a tunnel") - return super.onStartCommand(intent, flags, startId) - } - this.mConfig = JSONObject(lastConfString) - } + is LoadLibraryException -> onError("${e.message}. Caused: ${e.cause?.message}") - mProtocol = mConfig!!.getString("protocol") - Log.e(tag, "mProtocol: $mProtocol") - if (mProtocol.equals("cloak", true) || (mProtocol.equals("openvpn", true))) { - startOpenVpn() - mNetworkState.bindNetworkListener() + else -> throw e } - /* if (mProtocol.equals("shadowsocks", true)) { - if (DataStore.serviceMode == modeVpn) { - if (prepare(this) != null) { - startActivity( - Intent( - this, - VpnRequestActivity::class.java - ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - ) - } else { - Log.e(tag, "Else part enter") -// service?.startListeningForBandwidth(serviceCallback, 1000) - Log.e(tag, "test") - return super.onStartCommand(intent, flags, startId) - } - } - stopRunner() - } */ - return START_REDELIVER_INTENT } - // Invoked when the application is revoked. - // At this moment, the VPN interface is already deactivated by the system. - override fun onRevoke() { - Log.v(tag, "Aman: onRevoke....................") - //this.turnOff() - super.onRevoke() - } + private val actionMessageHandler: Handler by lazy(NONE) { + object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + val action = msg.extractIpcMessage() + Log.d(TAG, "Handle action: $action") + when (action) { + Action.REGISTER_CLIENT -> { + clientMessenger.set(msg.replyTo) + } - var connectionTime: Long = 0 - get() { - return mConnectionTime - } + Action.CONNECT -> { + val vpnConfig = msg.data.getString(VPN_CONFIG) + saveConfigToPrefs(vpnConfig) + connect(vpnConfig) + } - var isUp: Boolean = false - get() { - return when (mProtocol) { - "cloak", - "openvpn" -> { - field - } - else -> { - currentTunnelHandle >= 0 - } - } - } - set(value) { - field = value + Action.DISCONNECT -> { + disconnect() + } - if (value) { - mBinder.dispatchEvent(VPNServiceBinder.EVENTS.connected, "") - mConnectionTime = System.currentTimeMillis() - return - } - mBinder.dispatchEvent(VPNServiceBinder.EVENTS.disconnected, "") - mConnectionTime = 0 - } + Action.REQUEST_STATUS -> { + clientMessenger.send { + ServiceEvent.STATUS.packToMessage { + putStatus(Status.build { + setConnected(this@AmneziaVpnService.isConnected) + }) + } + } + } - val status: JSONObject - get() { - val deviceIpv4: String = "" - - val status = when (mProtocol) { - "cloak", - "openvpn" -> { - if (mOpenVPNThreadv3 == null) { - Status(null, null, null, null) - } else { - val rx = mOpenVPNThreadv3?.getTotalRxBytes() ?: "" - val tx = mOpenVPNThreadv3?.getTotalTxBytes() ?: "" - - Status( - rx.toString(), - tx.toString(), - if (mConfig!!.has("server")) { mConfig?.getJSONObject("server")?.getString("ipv4Gateway") } else {""}, - if (mConfig!!.has("device")) { mConfig?.getJSONObject("device")?.getString("ipv4Address") } else {""} - ) + Action.REQUEST_STATISTICS -> { + clientMessenger.send { + ServiceEvent.STATISTICS_UPDATE.packToMessage { + putStatistics(protocol?.statistics ?: Statistics.EMPTY_STATISTICS) + } + } } } - else -> { - Status( - getConfigValue("rx_bytes"), - getConfigValue("tx_bytes"), - if (mConfig!!.has("server")) { mConfig?.getJSONObject("server")?.getString("ipv4Gateway") } else {""}, - if (mConfig!!.has("server")) {mConfig?.getJSONObject("device")?.getString("ipv4Address") } else {""} - ) - } - } - - return JSONObject().apply { - putOpt("rx_bytes", status.rxBytes) - putOpt("tx_bytes", status.txBytes) - putOpt("endpoint", status.endpoint) - putOpt("deviceIpv4", status.device) } } - - data class Status( - var rxBytes: String?, - var txBytes: String?, - var endpoint: String?, - var device: String? - ) - - /* - * Checks if the VPN Permission is given. - * If the permission is given, returns true - * Requests permission and returns false if not. - */ - fun checkPermissions(): Boolean { - // See https://developer.android.com/guide/topics/connectivity/vpn#connect_a_service - // Call Prepare, if we get an Intent back, we dont have the VPN Permission - // from the user. So we need to pass this to our main Activity and exit here. - val intent = prepare(this) - if (intent == null) { - Log.e(tag, "VPN Permission Already Present") - return true - } - Log.e(tag, "Requesting VPN Permission") - return false } - fun turnOn(json: JSONObject?): Int { - Log.v(tag, "Aman: turnOn....................") - if (!checkPermissions()) { - Log.e(tag, "turn on was called without no permissions present!") - isUp = false - return 0 - } - Log.i(tag, "Permission okay") - mConfig = json!! - Log.i(tag, "Config: $mConfig") - mProtocol = mConfig!!.getString("protocol") - Log.i(tag, "Protocol: $mProtocol") - - when (mProtocol) { - "cloak", - "openvpn" -> { - startOpenVpn() - // Store the config in case the service gets - // asked boot vpn from the OS - val prefs = Prefs.get(this) - prefs.edit() - .putString("lastConf", mConfig.toString()) - .apply() - - mNetworkState.bindNetworkListener() - } - "wireguard" -> { - startWireGuard("wireguard") - } - "awg" -> { - startWireGuard("awg") - } - /* "shadowsocks" -> { - startShadowsocks() - startTest() - } */ - else -> { - Log.e(tag, "No protocol") - return 0 - } - } - NotificationUtil.show(this) - return 1 - } - - fun establish(): ParcelFileDescriptor? { - Log.v(tag, "Aman: establish....................") - mbuilder.allowFamily(OsConstants.AF_INET) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) mbuilder.setMetered(false) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) setUnderlyingNetworks(null) - - return mbuilder.establish() + private val vpnServiceMessenger: Messenger by lazy(NONE) { + Messenger(actionMessageHandler) } - fun setMtu(mtu: Int) { - mbuilder.setMtu(mtu) - } - - fun addAddress(ip: String, len: Int) { - Log.v(tag, "mbuilder.addAddress($ip, $len)") - mbuilder.addAddress(ip, len) + /** + * Notification setup + */ + private val foregroundServiceTypeCompat + get() = when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE -> FOREGROUND_SERVICE_TYPE_SPECIAL_USE + Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> FOREGROUND_SERVICE_TYPE_MANIFEST + else -> 0 + } + + private val notification: Notification by lazy(NONE) { + NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) + .setSmallIcon(R.drawable.ic_amnezia_round) + .setShowWhen(false) + .setContentIntent( + PendingIntent.getActivity( + this, + 0, + Intent(this, AmneziaActivity::class.java), + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + ) + .setOngoing(true) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setCategory(NotificationCompat.CATEGORY_SERVICE) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) + .build() } - fun addRoute(ip: String, len: Int) { - Log.v(tag, "mbuilder.addRoute($ip, $len)") - mbuilder.addRoute(ip, len) + /** + * Service overloaded methods + */ + override fun onCreate() { + super.onCreate() + Log.v(TAG, "Create Amnezia VPN service") + mainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate + connectionExceptionHandler) + clientMessenger = IpcMessenger(messengerName = "Client") + launchProtocolStateHandler() } - fun addDNS(ip: String) { - Log.v(tag, "mbuilder.addDnsServer($ip)") - mbuilder.addDnsServer(ip) - if ("samsung".equals(Build.BRAND) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mbuilder.addRoute(ip, 32) - } - } - - fun networkChange() { - Log.i(tag, "mProtocol $mProtocol") - if (isUp){ - mbuilder = Builder() - mOpenVPNThreadv3?.reconnect(0) + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + val isAlwaysOnCompat = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) isAlwaysOn + else intent?.component?.packageName != packageName + + if (isAlwaysOnCompat) { + Log.v(TAG, "Start service via Always-on") + connect(loadConfigFromPrefs()) + } else if (intent?.getBooleanExtra(AFTER_PERMISSION_CHECK, false) == true) { + Log.v(TAG, "Start service after permission check") + connect(loadConfigFromPrefs()) + } else { + Log.v(TAG, "Start service") + val vpnConfig = intent?.getStringExtra(VPN_CONFIG) + saveConfigToPrefs(vpnConfig) + connect(vpnConfig) } + ServiceCompat.startForeground(this, NOTIFICATION_ID, notification, foregroundServiceTypeCompat) + return START_REDELIVER_INTENT } - fun setSessionName(name: String) { - Log.v(tag, "mbuilder.setSession($name)") - mbuilder.setSession(name) + override fun onBind(intent: Intent?): IBinder? { + Log.d(TAG, "onBind by $intent") + if (intent?.action == "android.net.VpnService") return super.onBind(intent) + isServiceBound = true + return vpnServiceMessenger.binder } - fun addHttpProxy(host: String, port: Int): Boolean { - val proxyInfo = ProxyInfo.buildDirectProxy(host, port) - Log.v(tag, "mbuilder.addHttpProxy($host, $port)") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - mbuilder.setHttpProxy(proxyInfo) + override fun onUnbind(intent: Intent?): Boolean { + Log.d(TAG, "onUnbind by $intent") + if (intent?.action != "android.net.VpnService") { + isServiceBound = false + clientMessenger.reset() + if (isDisconnected) stopSelf() } - return true - } - - fun setDomain(domain: String) { - Log.v(tag, "mbuilder.setDomain($domain)") - mbuilder.addSearchDomain(domain) + return super.onUnbind(intent) } - fun turnOff() { - Log.v(tag, "Aman: turnOff....................") - when (mProtocol) { - "wireguard", - "awg" -> { - GoBackend.wgTurnOff(currentTunnelHandle) - } - "cloak", - "openvpn" -> { - ovpnTurnOff() - mNetworkState.unBindNetworkListener() - } - /* "shadowsocks" -> { - stopRunner(false) - stopTest() - } */ - else -> { - Log.e(tag, "No protocol") - } + override fun onRevoke() { + Log.v(TAG, "onRevoke") + mainScope.launch { + disconnect() } - - currentTunnelHandle = -1 - stopForeground(true) - isUp = false - stopSelf() - } - - - private fun ovpnTurnOff() { - mOpenVPNThreadv3?.stop() - mOpenVPNThreadv3 = null - Log.e(tag, "mOpenVPNThreadv3 stop!") } - /** - * Configures an Android VPN Service Tunnel - * with a given Wireguard Config - */ - private fun setupBuilder(config: Config, builder: Builder) { - // Setup Split tunnel - for (excludedApplication in config.`interface`.excludedApplications) - builder.addDisallowedApplication(excludedApplication) - - // Device IP - for (addr in config.`interface`.addresses) builder.addAddress(addr.address, addr.mask) - // DNS - for (addr in config.`interface`.dnsServers) builder.addDnsServer(addr.hostAddress) - // Add All routes the VPN may route tos - for (peer in config.peers) { - for (addr in peer.allowedIps) { - builder.addRoute(addr.address, addr.mask) - } + override fun onDestroy() { + Log.v(TAG, "Destroy service") + if (!isDisconnected) { + protocol?.stopVpn() + protocolState.value = DISCONNECTED } - builder.allowFamily(OsConstants.AF_INET) - builder.allowFamily(OsConstants.AF_INET6) - builder.setMtu(config.`interface`.mtu.orElse(1280)) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) builder.setMetered(false) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) setUnderlyingNetworks(null) - - builder.setBlocking(true) + mainScope.cancel() + super.onDestroy() } /** - * Gets config value for {key} from the Current - * running Wireguard tunnel + * Methods responsible for processing VPN connection */ - private fun getConfigValue(key: String): String? { - if (!isUp) { - return null - } - val config = GoBackend.wgGetConfig(currentTunnelHandle) ?: return null - val lines = config.split("\n") - for (line in lines) { - val parts = line.split("=") - val k = parts.first() - val value = parts.last() - if (key == k) { - return value - } - } - return null - } + private fun launchProtocolStateHandler() { + mainScope.launch { + protocolState.collect { protocolState -> + Log.d(TAG, "Protocol state: $protocolState") + when (protocolState) { + CONNECTED -> { + clientMessenger.send(ServiceEvent.CONNECTED) + } - private fun parseConfigData(data: String): Map> { - val parseData = mutableMapOf>() - var currentSection: Pair>? = null - data.lines().forEach { line -> - if (line.isNotEmpty()) { - if (line.startsWith('[')) { - currentSection?.let { - parseData.put(it.first, it.second) + DISCONNECTED -> { + clientMessenger.send(ServiceEvent.DISCONNECTED) + if (!isServiceBound) stopSelf() } - currentSection = - line.substring(1, line.indexOfLast { it == ']' }) to mutableMapOf() - } else { - val parameter = line.split("=", limit = 2) - currentSection!!.second.put(parameter.first().trim(), parameter.last().trim()) + + CONNECTING, DISCONNECTING -> {} } } } - currentSection?.let { - parseData.put(it.first, it.second) - } - return parseData } - - - /** - * Create a Wireguard [Config] from a [json] string - - * The [json] will be created in AndroidVpnProtocol.cpp - */ - private fun buildWireguardConfig(obj: JSONObject, type: String): Config { - val confBuilder = Config.Builder() - val wireguardConfigData = obj.getJSONObject(type) - val splitTunnelType = obj.getInt("splitTunnelType") - val splitTunnelSites = obj.getJSONArray("splitTunnelSites") - val config = parseConfigData(wireguardConfigData.getString("config")) - val peerBuilder = Peer.Builder() - val peerConfig = config["Peer"]!! - peerBuilder.setPublicKey(Key.fromBase64(peerConfig["PublicKey"])) - peerConfig["PresharedKey"]?.let { peerBuilder.setPreSharedKey(Key.fromBase64(it)) } + @MainThread + private fun connect(vpnConfig: String?) { + Log.v(TAG, "Start VPN connection") - val allIpString = peerConfig["AllowedIPs"] + if (isConnected || protocolState.value == CONNECTING) return - var allowedIPList = peerConfig["AllowedIPs"]?.split(",") ?: emptyList() + protocolState.value = CONNECTING - /* default value in template */ - if (allIpString == "0.0.0.0/0, ::/0") { - allowedIPList = emptyList() + val config = parseConfigToJson(vpnConfig) + if (config == null) { + onError("Invalid VPN config") + protocolState.value = DISCONNECTED + return } - if (allowedIPList.isEmpty() && (splitTunnelType == 0)) { - /* AllowedIP is empty and splitTunnel is turnoff */ - /* use VPN for whole Internet */ - val internetV4 = InetNetwork.parse("0.0.0.0/0") // aka The whole internet. - peerBuilder.addAllowedIp(internetV4) - val internetV6 = InetNetwork.parse("::/0") // aka The whole internet. - peerBuilder.addAllowedIp(internetV6) - } else { - if (!allowedIPList.isEmpty()) { - /* We have predefined AllowedIP in WG config */ - /* It's have higher priority than system SplitTunnel */ - allowedIPList.forEach { - val network = InetNetwork.parse(it.trim()) - peerBuilder.addAllowedIp(network) - } - } else { - if (splitTunnelType == 1) { - /* Use system SplitTunnel */ - /* VPN connection used only for defined IPs */ - for (i in 0 until splitTunnelSites.length()) { - val site = splitTunnelSites.getString(i) - val internet = InetNetwork.parse(site) - peerBuilder.addAllowedIp(internet) - } - } - if (splitTunnelType == 2) { - /* Use system SplitTunnel */ - /* VPN connection used for all Internet exclude defined IPs */ - val ipRangeSet = IPRangeSet.fromString("0.0.0.0/0") - ipRangeSet.remove(IPRange("127.0.0.0/8")) - for (i in 0 until splitTunnelSites.length()) { - val site = splitTunnelSites.getString(i) - ipRangeSet.remove(IPRange(site)) - } - val allowedIps = ipRangeSet.subnets().joinToString(", ") + ", 2000::/3" - peerBuilder.parseAllowedIPs(allowedIps) - } - } - } - val endpointConfig = peerConfig["Endpoint"] - val endpoint = InetEndpoint.parse(endpointConfig) - peerBuilder.setEndpoint(endpoint) - peerConfig["PersistentKeepalive"]?.let { peerBuilder.setPersistentKeepalive(it.toInt()) } - confBuilder.addPeer(peerBuilder.build()) - - val ifaceBuilder = Interface.Builder() - val ifaceConfig = config["Interface"]!! - ifaceBuilder.parsePrivateKey(ifaceConfig["PrivateKey"]) - ifaceBuilder.addAddress(InetNetwork.parse(ifaceConfig["Address"])) - ifaceConfig["DNS"]!!.split(",").forEach { - ifaceBuilder.addDnsServer(InetNetwork.parse(it.trim()).address) + if (!checkPermission()) { + protocolState.value = DISCONNECTED + return } - ifaceBuilder.parsePrivateKey(ifaceConfig["PrivateKey"]) - if (type == "awg_config_data") { - ifaceBuilder.parseJc(ifaceConfig["Jc"]) - ifaceBuilder.parseJmin(ifaceConfig["Jmin"]) - ifaceBuilder.parseJmax(ifaceConfig["Jmax"]) - ifaceBuilder.parseS1(ifaceConfig["S1"]) - ifaceBuilder.parseS2(ifaceConfig["S2"]) - ifaceBuilder.parseH1(ifaceConfig["H1"]) - ifaceBuilder.parseH2(ifaceConfig["H2"]) - ifaceBuilder.parseH3(ifaceConfig["H3"]) - ifaceBuilder.parseH4(ifaceConfig["H4"]) - } else { - ifaceBuilder.parseJc("0") - ifaceBuilder.parseJmin("0") - ifaceBuilder.parseJmax("0") - ifaceBuilder.parseS1("0") - ifaceBuilder.parseS2("0") - ifaceBuilder.parseH1("0") - ifaceBuilder.parseH2("0") - ifaceBuilder.parseH3("0") - ifaceBuilder.parseH4("0") + connectionJob = mainScope.launch { + disconnectionJob?.join() + disconnectionJob = null + + protocol = getProtocol(config.getString("protocol")) + protocol?.let { protocol -> + protocol.initialize() + protocol.parseConfig(config) + protocol.startVpn(Builder(), ::protect) + } + protocolState.value = CONNECTED } - /*val jExcludedApplication = obj.getJSONArray("excludedApps") - (0 until jExcludedApplication.length()).toList().forEach { - val appName = jExcludedApplication.get(it).toString() - ifaceBuilder.excludeApplication(appName) - }*/ - confBuilder.setInterface(ifaceBuilder.build()) - - return confBuilder.build() } - fun getVpnConfig(): JSONObject { - return mConfig!! - } + @MainThread + private fun disconnect() { + Log.v(TAG, "Stop VPN connection") - /* private fun startShadowsocks() { - Log.e(tag, "startShadowsocks method enters") - if (mConfig != null) { - try { - Log.e(tag, "Config: $mConfig") - - ProfileManager.clear() - val profile = Profile() -// val iter: Iterator = mConfig!!.keys() -// while (iter.hasNext()) { -// val key = iter.next() -// try { -// val value: Any = mConfig!!.get(key) -// Log.i(tag, "startShadowsocks: $key : $value") -// } catch (e: JSONException) { -// // Something went wrong! -// } -// } - - val shadowsocksConfig = mConfig?.getJSONObject("shadowsocks_config_data") - - if (shadowsocksConfig?.has("name") == true) { - profile.name = shadowsocksConfig.getString("name") - } else { - profile.name = "amnezia" - } - if (shadowsocksConfig?.has("method") == true) { - profile.method = shadowsocksConfig.getString("method").toString() - } - if (shadowsocksConfig?.has("server") == true) { - profile.host = shadowsocksConfig.getString("server").toString() - } - if (shadowsocksConfig?.has("password") == true) { - profile.password = shadowsocksConfig.getString("password").toString() - } - if (shadowsocksConfig?.has("server_port") == true) { - profile.remotePort = shadowsocksConfig.getInt("server_port") - } -// if(mConfig?.has("local_port") == true) { -// profile. = mConfig?.getInt("local_port") -// } -// profile.name = "amnezia" -// profile.method = "chacha20-ietf-poly1305" -// profile.host = "de01-ss.sshocean.net" -// profile.password = "ZTZhN" -// profile.remotePort = 8388 - - profile.proxyApps = false - profile.bypass = false - profile.metered = false - profile.dirty = false - profile.ipv6 = true - - DataStore.profileId = ProfileManager.createProfile(profile).id - val switchProfile = Core.switchProfile(DataStore.profileId) - Log.i(tag, "startShadowsocks: SwitchProfile: $switchProfile") - intent?.putExtra("startOnly", false) - onStartCommand( - intent, - flags, - startId - ) -// startRunner() -// VpnManager.getInstance().run() -// VpnManager.getInstance() -// .setOnStatusChangeListener(object : VpnManager.OnStatusChangeListener { -// override fun onStatusChanged(state: BaseService.State) { -// when (state) { -// BaseService.State.Connected -> { -// isUp = true -// } -// BaseService.State.Stopped -> { -// isUp = false -// } -// else -> {} -// } -// } -// -// override fun onTrafficUpdated(profileId: Long, stats: TrafficStats) { -// -// } -// }) -//// Core.startService() - } catch (e: Exception) { - Log.e(tag, "Error in startShadowsocks: $e") - } - } else { - Log.e(tag, "Invalid config file!!") - } - } */ + if (isDisconnected || protocolState.value == DISCONNECTING) return - private fun startOpenVpn() { - if (isUp || mOpenVPNThreadv3 != null) { - ovpnTurnOff() - } + protocolState.value = DISCONNECTING - mOpenVPNThreadv3 = OpenVPNThreadv3(this) + disconnectionJob = mainScope.launch { + connectionJob?.let { + if (it.isActive) it.cancelAndJoin() + } + connectionJob = null - Thread({ - mOpenVPNThreadv3?.run() - }).start() + protocol?.stopVpn() + protocol = null + protocolState.value = DISCONNECTED + } } - private fun startWireGuard(type: String) { - val wireguard_conf = buildWireguardConfig(mConfig!!, type + "_config_data") - if (currentTunnelHandle != -1) { - Log.e(tag, "Tunnel already up") - // Turn the tunnel down because this might be a switch - GoBackend.wgTurnOff(currentTunnelHandle) + private fun getProtocol(protocolName: String): Protocol = + when (protocolName) { + "wireguard" -> Wireguard(applicationContext) + else -> throw IllegalArgumentException("Failed to load $protocolName protocol") } - val wgConfig: String = wireguard_conf.toWgUserspaceString() - - val builder = Builder() - setupBuilder(wireguard_conf, builder) - builder.setSession("Amnezia") - - - builder.establish().use { tun -> - if (tun == null) return - if (type == "awg"){ - currentTunnelHandle = GoBackend.wgTurnOn("awg0", tun.detachFd(), wgConfig) - } else { - currentTunnelHandle = GoBackend.wgTurnOn("amn0", tun.detachFd(), wgConfig) + + /** + * Utils methods + */ + @MainThread + private fun onError(msg: String) { + Log.e(TAG, msg) + clientMessenger.send { + ServiceEvent.ERROR.packToMessage { + putString(ERROR_MSG, msg) } } - if (currentTunnelHandle < 0) { - Log.e(tag, "Activation Error Code -> $currentTunnelHandle") - isUp = false - return - } - protect(GoBackend.wgGetSocketV4(currentTunnelHandle)) - protect(GoBackend.wgGetSocketV6(currentTunnelHandle)) - isUp = true - - // Store the config in case the service gets - // asked boot vpn from the OS - val prefs = Prefs.get(this) - prefs.edit() - .putString("lastConf", mConfig.toString()) - .apply() } - /* override suspend fun startProcesses() { - worker = ProtectWorker().apply { start() } + private fun parseConfigToJson(vpnConfig: String?): JSONObject? = try { - Log.i(tag, "startProcesses: ------------------1") - super.startProcesses() - Log.i(tag, "startProcesses: ------------------2") - sendFd(startVpn()) - Log.i(tag, "startProcesses: ------------------3") - } catch (e: Exception) { - e.printStackTrace() - } - } */ - - /* override fun killProcesses(scope: CoroutineScope) { - super.killProcesses(scope) - active = false - scope.launch { DefaultNetworkListener.stop(this) } - worker?.shutdown(scope) - worker = null - conn?.close() - conn = null - } */ - - /* private suspend fun startVpn(): FileDescriptor { - val profile = data.proxy!!.profile - Log.i(tag, "startVpn: -----------------------1") - val builder = Builder() - .setConfigureIntent(Core.configureIntent(this)) - .setSession(profile.formattedName) - .setMtu(VPN_MTU) - .addAddress(PRIVATE_VLAN4_CLIENT, 30) - .addDnsServer(PRIVATE_VLAN4_ROUTER) - Log.i(tag, "startVpn: -----------------------2") - if (profile.ipv6) { - builder.addAddress(PRIVATE_VLAN6_CLIENT, 126) - builder.addRoute("::", 0) - } - Log.i(tag, "startVpn: -----------------------3") - val me = packageName - if (profile.proxyApps) { - profile.individual.split('\n') - .filter { it != me } - .forEach { - try { - if (profile.bypass) builder.addDisallowedApplication(it) - else builder.addAllowedApplication(it) - } catch (ex: PackageManager.NameNotFoundException) { - printLog(ex) - } - } - if (profile.bypass) { - builder.addDisallowedApplication(me) + vpnConfig?.let { + JSONObject(it) } - } else { - builder.addDisallowedApplication(me) + } catch (e: JSONException) { + onError("Invalid VPN config json format: ${e.message}") + null } - Log.i(tag, "startVpn: -----------------------4") - when (profile.route) { - Acl.ALL, Acl.BYPASS_CHN, Acl.CUSTOM_RULES -> builder.addRoute("0.0.0.0", 0) - else -> { - resources.getStringArray(R.array.bypass_private_route).forEach { - val subnet = Subnet.fromString(it)!! - builder.addRoute(subnet.address.hostAddress, subnet.prefixSize) - } - builder.addRoute(PRIVATE_VLAN4_ROUTER, 32) - } - } - Log.i(tag, "startVpn: -----------------------5") - metered = profile.metered - active = true // possible race condition here? - Log.i(tag, "startVpn: -----------------------6") - builder.setUnderlyingNetworks(underlyingNetworks) - Log.i(tag, "startVpn: -----------------------7") - val conn = builder.establish() ?: throw NullConnectionException() - Log.i(tag, "startVpn: -----------------------8") - this.conn = conn - Log.i(tag, "startVpn: -----------------------9") - val cmd = arrayListOf( - File(applicationInfo.nativeLibraryDir, Executable.TUN2SOCKS).absolutePath, - "--netif-ipaddr", PRIVATE_VLAN4_ROUTER, - "--socks-server-addr", "${DataStore.listenAddress}:${DataStore.portProxy}", - "--tunmtu", VPN_MTU.toString(), - "--sock-path", "sock_path", - "--dnsgw", "127.0.0.1:${DataStore.portLocalDns}", - "--loglevel", "warning" - ) - Log.i(tag, "startVpn: -----------------------10") - if (profile.ipv6) { - cmd += "--netif-ip6addr" - cmd += PRIVATE_VLAN6_ROUTER - } - Log.i(tag, "startVpn: -----------------------11") - cmd += "--enable-udprelay" - Log.i(tag, "startVpn: -----------------------12") - data.processes!!.start(cmd, onRestartCallback = { - try { - sendFd(conn.fileDescriptor) - } catch (e: ErrnoException) { - e.printStackTrace() - stopRunner(false, e.message) - } - }) - Log.i(tag, "startVpn: -----------------------13") - return conn.fileDescriptor - } */ - - /* private suspend fun sendFd(fd: FileDescriptor) { - var tries = 0 - val path = File(Core.deviceStorage.noBackupFilesDir, "sock_path").absolutePath - while (true) try { - delay(50L shl tries) - LocalSocket().use { localSocket -> - localSocket.connect( - LocalSocketAddress( - path, - LocalSocketAddress.Namespace.FILESYSTEM - ) - ) - localSocket.setFileDescriptorsForSend(arrayOf(fd)) - localSocket.outputStream.write(42) - } - return - } catch (e: IOException) { - if (tries > 5) throw e - tries += 1 - } - } */ - - - /* private inner class ProtectWorker : ConcurrentLocalSocketListener( - "ShadowsocksVpnThread", - File(Core.deviceStorage.noBackupFilesDir, "protect_path") - ) { - override fun acceptInternal(socket: LocalSocket) { - socket.inputStream.read() - val fd = socket.ancillaryFileDescriptors!!.single()!! - CloseableFd(fd).use { - socket.outputStream.write(if (underlyingNetwork.let { network -> - if (network != null && Build.VERSION.SDK_INT >= 23) try { - network.bindSocket(fd) - true - } catch (e: IOException) { - // suppress ENONET (Machine is not on the network) - if ((e.cause as? ErrnoException)?.errno != 64) printLog(e) - false - } else protect(getInt.invoke(fd) as Int) - }) 0 else 1) + + private fun checkPermission(): Boolean = + if (prepare(applicationContext) != null) { + Intent(this, VpnRequestActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + }.also { + startActivity(it) } + false + } else { + true } - } */ - /* inner class NullConnectionException : NullPointerException() { - override fun getLocalizedMessage() = getString(R.string.reboot_required) - } */ + private fun loadConfigFromPrefs(): String? = + Prefs.get(this).getString(PREFS_CONFIG_KEY, null) - class CloseableFd(val fd: FileDescriptor) : Closeable { - override fun close() = Os.close(fd) - } + private fun saveConfigToPrefs(config: String?) = + Prefs.get(this).edit().putString(PREFS_CONFIG_KEY, config).apply() } diff --git a/client/android/src/org/amnezia/vpn/NetworkState.kt b/client/android/src/org/amnezia/vpn/NetworkState.kt index 2ea573186..e1696fa92 100644 --- a/client/android/src/org/amnezia/vpn/NetworkState.kt +++ b/client/android/src/org/amnezia/vpn/NetworkState.kt @@ -153,7 +153,7 @@ class NetworkState(var service: AmneziaVpnService) { defaultNetwork = NetworkTransports(network, newTransports) } if (capabilitiesChanged) { - mService.networkChange() + // mService.networkChange() Log.i(tag, "onCapabilitiesChanged capabilitiesChanged $network $networkCapabilities") defaultNetworkCapabilities = newCapabilities diff --git a/client/android/src/org/amnezia/vpn/NotificationUtil.kt b/client/android/src/org/amnezia/vpn/NotificationUtil.kt deleted file mode 100644 index 541e27cd6..000000000 --- a/client/android/src/org/amnezia/vpn/NotificationUtil.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.amnezia.vpn - -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.os.Build -import android.os.Parcel -import androidx.core.app.NotificationCompat -import org.json.JSONObject - -object NotificationUtil { - var sCurrentContext: Context? = null - private var sNotificationBuilder: NotificationCompat.Builder? = null - - const val NOTIFICATION_CHANNEL_ID = "com.amnezia.vpnNotification" - const val CONNECTED_NOTIFICATION_ID = 1337 - const val tag = "NotificationUtil" - - /** - * Updates the current shown notification from a - * Parcel - Gets called from AndroidController.cpp - */ - fun update(data: Parcel) { - // [data] is here a json containing the notification content - val buffer = data.createByteArray() - val json = buffer?.let { String(it) } - val content = JSONObject(json) - - update(content.getString("title"), content.getString("message")) - } - - /** - * Updates the current shown notification - */ - fun update(heading: String, message: String) { - if (sCurrentContext == null) return - val notificationManager: NotificationManager = - sCurrentContext?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - - sNotificationBuilder?.let { - it.setContentTitle(heading) - .setContentText(message) - notificationManager.notify(CONNECTED_NOTIFICATION_ID, it.build()) - } - } - - /** - * Saves the default translated "connected" notification, in case the vpn gets started - * without the app. - */ - fun saveFallBackMessage(data: Parcel, context: Context) { - // [data] is here a json containing the notification content - val buffer = data.createByteArray() - val json = buffer?.let { String(it) } - val content = JSONObject(json) - - val prefs = Prefs.get(context) - prefs.edit() - .putString("fallbackNotificationHeader", content.getString("title")) - .putString("fallbackNotificationMessage", content.getString("message")) - .apply() - Log.v(tag, "Saved new fallback message -> ${content.getString("title")}") - } - - /* - * Creates a new Notification using the current set of Strings - * Shows the notification in the given {context} - */ - fun show(service: AmneziaVpnService) { - sNotificationBuilder = NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID) - sCurrentContext = service - val notificationManager: NotificationManager = - sCurrentContext?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - // From Oreo on we need to have a "notification channel" to post to. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val name = "vpn" - val descriptionText = " " - val importance = NotificationManager.IMPORTANCE_LOW - val channel = NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance).apply { - description = descriptionText - } - // Register the channel with the system - notificationManager.createNotificationChannel(channel) - } - // In case we do not have gotten a message to show from the Frontend - // try to populate the notification with a translated Fallback message - val prefs = Prefs.get(service) - val message = - "" + prefs.getString("fallbackNotificationMessage", "Running in the Background") - val header = "" + prefs.getString("fallbackNotificationHeader", "Amnezia VPN") - - // Create the Intent that Should be Fired if the User Clicks the notification - val mainActivityName = "org.amnezia.vpn.AmneziaActivity" - val activity = Class.forName(mainActivityName) - val intent = Intent(service, activity) - val pendingIntent = PendingIntent.getActivity(service, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) - // Build our notification - sNotificationBuilder?.let { - it.setSmallIcon(R.drawable.ic_amnezia_round) - .setContentTitle(header) - .setContentText(message) - .setOnlyAlertOnce(true) - .setPriority(NotificationCompat.PRIORITY_DEFAULT) - .setContentIntent(pendingIntent) - - service.startForeground(CONNECTED_NOTIFICATION_ID, it.build()) - } - } -} diff --git a/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt b/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt deleted file mode 100644 index 56777daf1..000000000 --- a/client/android/src/org/amnezia/vpn/VPNServiceBinder.kt +++ /dev/null @@ -1,211 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public -* License, v. 2.0. If a copy of the MPL was not distributed with this -* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.amnezia.vpn -import android.os.Binder -import android.os.DeadObjectException -import android.os.IBinder -import android.os.Parcel -import com.wireguard.config.* -import org.json.JSONObject -import java.lang.Exception - -class VPNServiceBinder(service: AmneziaVpnService) : Binder() { - - private val mService = service - private val tag = "VPNServiceBinder" - private var mListener: IBinder? = null - private var mResumeConfig: JSONObject? = null - private var mImportedConfig: String? = null - - /** - * The codes this Binder does accept in [onTransact] - */ - object ACTIONS { - const val activate = 1 - const val deactivate = 2 - const val registerEventListener = 3 - const val requestStatistic = 4 - const val requestGetLog = 5 - const val requestCleanupLog = 6 - const val resumeActivate = 7 - const val setNotificationText = 8 - const val setFallBackNotification = 9 - const val importConfig = 11 - } - - /** - * Gets called when the VPNServiceBinder gets a request from a Client. - * The [code] determines what action is requested. - see [ACTIONS] - * [data] may contain a utf-8 encoded json string with optional args or is null. - * [reply] is a pointer to a buffer in the clients memory, to reply results. - * we use this to send result data. - * - * returns true if the [code] was accepted - */ - override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean { - Log.i(tag, "GOT TRANSACTION " + code) - - when (code) { - ACTIONS.activate -> { - try { - Log.i(tag, "Activation Requested, parsing Config") - // [data] is here a json containing the wireguard/openvpn conf - val buffer = data.createByteArray() - val json = buffer?.let { String(it) } - val config = JSONObject(json) - Log.v(tag, "Stored new Tunnel config in Service") - Log.i(tag, "Config: $config") - if (!mService.checkPermissions()) { - mResumeConfig = config - // The Permission prompt was already - // send, in case it's accepted we will - // receive ACTIONS.resumeActivate - return true - } - this.mService.turnOn(config) - } catch (e: Exception) { - Log.e(tag, "An Error occurred while enabling the VPN: ${e.localizedMessage}") - dispatchEvent(EVENTS.activationError, e.localizedMessage) - } - return true - } - - ACTIONS.resumeActivate -> { - // [data] is empty - // Activate the current tunnel - Log.i(tag, "resume activate") - try { - mResumeConfig?.let { this.mService.turnOn(it) } - } catch (e: Exception) { - Log.e(tag, "An Error occurred while enabling the VPN: ${e.localizedMessage}") - } - return true - } - - ACTIONS.deactivate -> { - // [data] here is empty - this.mService.turnOff() - return true - } - - ACTIONS.registerEventListener -> { - Log.i(tag, "register: start") - // [data] contains the Binder that we need to dispatch the Events - val binder = data.readStrongBinder() - mListener = binder - val obj = JSONObject() - obj.put("connected", mService.isUp) - obj.put("time", mService.connectionTime) - dispatchEvent(EVENTS.init, obj.toString()) - - //// - if (mImportedConfig != null) { - Log.i(tag, "register: config not null") - dispatchEvent(EVENTS.configImport, mImportedConfig) - mImportedConfig = null - } else { - Log.i(tag, "register: config is null") - } - - return true - } - - ACTIONS.requestStatistic -> { - dispatchEvent(EVENTS.statisticUpdate, mService.status.toString()) - return true - } - - ACTIONS.requestGetLog -> { - // Grabs all the Logs and dispatch new Log Event - // dispatchEvent(EVENTS.backendLogs, Log.getContent()) - return true - } - - ACTIONS.requestCleanupLog -> { - // Log.clearFile() - return true - } - - ACTIONS.setNotificationText -> { - NotificationUtil.update(data) - return true - } - - ACTIONS.setFallBackNotification -> { - NotificationUtil.saveFallBackMessage(data, mService) - return true - } - - ACTIONS.importConfig -> { - val buffer = data.readString() - - val obj = JSONObject() - obj.put("config", buffer) - - val resultString = obj.toString() - - Log.i(tag, "Transact import config request") - - if (mListener != null) { - dispatchEvent(EVENTS.configImport, resultString) - } else { - mImportedConfig = resultString - } - } - - IBinder.LAST_CALL_TRANSACTION -> { - Log.e(tag, "The OS Requested to shut down the VPN") - this.mService.turnOff() - return true - } - - else -> { - Log.e(tag, "Received invalid bind request \t Code -> $code") - // If we're hitting this there is probably something wrong in the client. - return false - } - } - - return false - } - - /** - * Dispatches an Event to all registered Binders - * [code] the Event that happened - see [EVENTS] - * To register an Eventhandler use [onTransact] with - * [ACTIONS.registerEventListener] - */ - fun dispatchEvent(code: Int, payload: String?) { - try { - mListener?.let { - if (it.isBinderAlive) { - val data = Parcel.obtain() - data.writeByteArray(payload?.toByteArray(charset("UTF-8"))) - it.transact(code, data, Parcel.obtain(), 0) - } else { - Log.i(tag, "Dispatching event: binder NOT alive") - } - } - } catch (e: DeadObjectException) { - // If the QT Process is killed (not just inactive) - // we cant access isBinderAlive, so nothing to do here. - } - } - - /** - * The codes we Are Using in case of [dispatchEvent] - * Qt codes in the androidvpnactivity.h - */ - object EVENTS { - const val init = 0 - const val connected = 1 - const val disconnected = 2 - const val statisticUpdate = 3 - const val backendLogs = 4 - const val activationError = 5 - const val permissionRequired = 6 - const val configImport = 7 - } -} diff --git a/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt b/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt new file mode 100644 index 000000000..4fa878e10 --- /dev/null +++ b/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt @@ -0,0 +1,69 @@ +package org.amnezia.vpn + +import android.app.KeyguardManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.VpnService +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult +import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService + +private const val TAG = "VpnRequestActivity" + +class VpnRequestActivity : ComponentActivity() { + + private var userPresentReceiver: BroadcastReceiver? = null + private val requestLauncher = + registerForActivityResult(StartActivityForResult(), ::checkRequestResult) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.v(TAG, "Start request activity") + val requestIntent = VpnService.prepare(applicationContext) + if (requestIntent != null) { + if (getSystemService()!!.isKeyguardLocked) { + userPresentReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) = + requestLauncher.launch(requestIntent) + } + registerReceiver(userPresentReceiver, IntentFilter(Intent.ACTION_USER_PRESENT)) + } else { + requestLauncher.launch(requestIntent) + } + return + } else { + onPermissionGranted() + finish() + } + } + + override fun onDestroy() { + userPresentReceiver?.let { + unregisterReceiver(it) + } + super.onDestroy() + } + + private fun checkRequestResult(result: ActivityResult) { + when (result.resultCode) { + RESULT_OK -> onPermissionGranted() + else -> Toast.makeText(this, "Vpn permission denied", Toast.LENGTH_LONG).show() + } + finish() + } + + private fun onPermissionGranted() { + Toast.makeText(this, "Vpn permission granted", Toast.LENGTH_LONG).show() + Intent(applicationContext, AmneziaVpnService::class.java).apply { + putExtra(AFTER_PERMISSION_CHECK, true) + }.also { + ContextCompat.startForegroundService(this, it) + } + } +} From 91f44fb394360dae5c52aa0962bd20e6aa43a4f7 Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 24 Nov 2023 22:22:15 +0300 Subject: [PATCH 063/144] Up Qt to version 6.6.1 --- .github/workflows/deploy.yml | 2 +- client/android/AndroidManifest.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 173970478..a218a1ad9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -275,7 +275,7 @@ jobs: env: ANDROID_BUILD_PLATFORM: android-34 - QT_VERSION: 6.6.0 + QT_VERSION: 6.6.1 QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' steps: diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index e9ae60cec..ee6f1b866 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -30,7 +30,6 @@ From 1bf808c9ee546135ffdb13d0d47f7db033c50de0 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sat, 25 Nov 2023 13:02:02 +0700 Subject: [PATCH 064/144] fixed qr code generation for native configs --- client/ui/controllers/exportController.cpp | 44 ++++++++++++------- client/ui/controllers/exportController.h | 3 ++ .../qml/Components/ShareConnectionDrawer.qml | 31 ++++++++++++- 3 files changed, 60 insertions(+), 18 deletions(-) diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 06bddb8a0..048eadb02 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -8,10 +8,10 @@ #include #include +#include "configurators/cloak_configurator.h" #include "configurators/openvpn_configurator.h" -#include "configurators/wireguard_configurator.h" #include "configurators/shadowsocks_configurator.h" -#include "configurators/cloak_configurator.h" +#include "configurators/wireguard_configurator.h" #include "core/errorstrings.h" #include "systemController.h" #ifdef Q_OS_ANDROID @@ -157,8 +157,6 @@ void ExportController::generateOpenVpnConfig() m_config.append(line + "\n"); } - m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); - emit exportConfigChanged(); } @@ -191,7 +189,8 @@ void ExportController::generateWireGuardConfig() m_config.append(line + "\n"); } - m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_config.toUtf8(), qrcodegen::QrCode::Ecc::LOW); + m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1))); emit exportConfigChanged(); } @@ -211,7 +210,8 @@ void ExportController::generateShadowSocksConfig() containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); ErrorCode errorCode = ErrorCode::NoError; - QString config = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, &errorCode); + QString config = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, + containerConfig, &errorCode); if (errorCode) { emit exportErrorOccurred(errorString(errorCode)); @@ -220,15 +220,20 @@ void ExportController::generateShadowSocksConfig() config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::ShadowSocks, config); QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object(); - m_config = QString("%1:%2@%3:%4") - .arg(configJson.value("method").toString(), - configJson.value("password").toString(), - configJson.value("server").toString(), - configJson.value("server_port").toString()); + QStringList lines = QString(QJsonDocument(configJson).toJson()).replace("\r", "").split("\n"); + for (const QString &line : lines) { + m_config.append(line + "\n"); + } + + m_nativeConfigString = + QString("%1:%2@%3:%4") + .arg(configJson.value("method").toString(), configJson.value("password").toString(), + configJson.value("server").toString(), configJson.value("server_port").toString()); - m_config = "ss://" + m_config.toUtf8().toBase64(); + m_nativeConfigString = "ss://" + m_config.toUtf8().toBase64(); - m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); + qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_nativeConfigString.toUtf8(), qrcodegen::QrCode::Ecc::LOW); + m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1))); emit exportConfigChanged(); } @@ -248,7 +253,8 @@ void ExportController::generateCloakConfig() containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); ErrorCode errorCode = ErrorCode::NoError; - QString config = m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &errorCode); + QString config = + m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &errorCode); if (errorCode) { emit exportErrorOccurred(errorString(errorCode)); @@ -265,8 +271,6 @@ void ExportController::generateCloakConfig() m_config.append(line + "\n"); } - m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); - emit exportConfigChanged(); } @@ -275,6 +279,11 @@ QString ExportController::getConfig() return m_config; } +QString ExportController::getNativeConfigString() +{ + return m_nativeConfigString; +} + QList ExportController::getQrCodes() { return m_qrCodes; @@ -299,7 +308,7 @@ QList ExportController::generateQrCodeImageSeries(const QByteArray &dat QByteArray ba = chunk.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(ba, qrcodegen::QrCode::Ecc::LOW); - QString svg = QString::fromStdString(toSvgString(qr, 0)); + QString svg = QString::fromStdString(toSvgString(qr, 1)); chunks.append(svgToBase64(svg)); } @@ -319,5 +328,6 @@ int ExportController::getQrCodesCount() void ExportController::clearPreviousConfig() { m_config.clear(); + m_nativeConfigString.clear(); m_qrCodes.clear(); } diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index ee94e7412..256585291 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -22,6 +22,7 @@ class ExportController : public QObject Q_PROPERTY(QList qrCodes READ getQrCodes NOTIFY exportConfigChanged) Q_PROPERTY(int qrCodesCount READ getQrCodesCount NOTIFY exportConfigChanged) Q_PROPERTY(QString config READ getConfig NOTIFY exportConfigChanged) + Q_PROPERTY(QString nativeConfigString READ getNativeConfigString NOTIFY exportConfigChanged) public slots: void generateFullAccessConfig(); @@ -35,6 +36,7 @@ public slots: void generateCloakConfig(); QString getConfig(); + QString getNativeConfigString(); QList getQrCodes(); void exportConfig(const QString &fileName); @@ -61,6 +63,7 @@ public slots: std::shared_ptr m_configurator; QString m_config; + QString m_nativeConfigString; QList m_qrCodes; #ifdef Q_OS_ANDROID diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index 1158dadc3..e354e9517 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -112,6 +112,30 @@ DrawerType { } } + BasicButtonType { + Layout.fillWidth: true + Layout.topMargin: 8 + + visible: nativeConfigString.text !== "" + + defaultColor: "transparent" + hoveredColor: Qt.rgba(1, 1, 1, 0.08) + pressedColor: Qt.rgba(1, 1, 1, 0.12) + disabledColor: "#878B91" + textColor: "#D7D8DB" + borderWidth: 1 + + text: qsTr("Copy config string") + imageSource: "qrc:/images/controls/copy.svg" + + onClicked: { + nativeConfigString.selectAll() + nativeConfigString.copy() + nativeConfigString.select(0, 0) + PageController.showNotificationMessage(qsTr("Copied")) + } + } + BasicButtonType { Layout.fillWidth: true Layout.topMargin: 24 @@ -170,6 +194,12 @@ DrawerType { } TextField { + id: nativeConfigString + visible: false + text: ExportController.nativeConfigString + } + + TextArea { id: configText Layout.fillWidth: true @@ -213,7 +243,6 @@ DrawerType { Image { anchors.fill: parent - anchors.margins: 2 smooth: false source: ExportController.qrCodesCount ? ExportController.qrCodes[0] : "" From 9297f877c4d99ebc071943e88bfe68bbb4ce6181 Mon Sep 17 00:00:00 2001 From: albexk Date: Sun, 26 Nov 2023 13:07:31 +0300 Subject: [PATCH 065/144] Add AWG module --- client/android/awg/build.gradle.kts | 18 +++ client/android/awg/src/main/kotlin/Awg.kt | 79 ++++++++++++ .../android/awg/src/main/kotlin/AwgConfig.kt | 115 ++++++++++++++++++ client/android/build.gradle.kts | 1 + client/android/protocolApi/build.gradle.kts | 2 +- .../protocolApi/src/main/kotlin/Protocol.kt | 16 +-- .../src/main/kotlin/ProtocolConfig.kt | 5 +- client/android/settings.gradle.kts | 1 + .../src/org/amnezia/vpn/AmneziaVpnService.kt | 18 +-- .../vpn/protocol/wireguard/Wireguard.kt | 65 ++++++++-- .../vpn/protocol/wireguard/WireguardConfig.kt | 18 +-- 11 files changed, 295 insertions(+), 43 deletions(-) create mode 100644 client/android/awg/build.gradle.kts create mode 100644 client/android/awg/src/main/kotlin/Awg.kt create mode 100644 client/android/awg/src/main/kotlin/AwgConfig.kt diff --git a/client/android/awg/build.gradle.kts b/client/android/awg/build.gradle.kts new file mode 100644 index 000000000..8d280c7f3 --- /dev/null +++ b/client/android/awg/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.protocol.awg" +} + +dependencies { + compileOnly(project(":utils")) + compileOnly(project(":protocolApi")) + implementation(project(":wireguard")) +} diff --git a/client/android/awg/src/main/kotlin/Awg.kt b/client/android/awg/src/main/kotlin/Awg.kt new file mode 100644 index 000000000..2bc06af55 --- /dev/null +++ b/client/android/awg/src/main/kotlin/Awg.kt @@ -0,0 +1,79 @@ +package org.amnezia.vpn.protocol.awg + +import org.amnezia.vpn.protocol.wireguard.Wireguard +import org.json.JSONObject + +/** + * Config example: + * { + * "protocol": "awg", + * "description": "Server 1", + * "dns1": "1.1.1.1", + * "dns2": "1.0.0.1", + * "hostName": "100.100.100.0", + * "splitTunnelSites": [ + * ], + * "splitTunnelType": 0, + * "awg_config_data": { + * "H1": "969537490", + * "H2": "481688153", + * "H3": "2049399200", + * "H4": "52029755", + * "Jc": "3", + * "Jmax": "1000", + * "Jmin": "50", + * "S1": "49", + * "S2": "60", + * "client_ip": "10.8.1.1", + * "hostName": "100.100.100.0", + * "port": 12345, + * "client_pub_key": "clientPublicKeyBase64", + * "client_priv_key": "privateKeyBase64", + * "psk_key": "presharedKeyBase64", + * "server_pub_key": "publicKeyBase64", + * "config": "[Interface] + * Address = 10.8.1.1/32 + * DNS = 1.1.1.1, 1.0.0.1 + * PrivateKey = privateKeyBase64 + * Jc = 3 + * Jmin = 50 + * Jmax = 1000 + * S1 = 49 + * S2 = 60 + * H1 = 969537490 + * H2 = 481688153 + * H3 = 2049399200 + * H4 = 52029755 + * + * [Peer] + * PublicKey = publicKeyBase64 + * PresharedKey = presharedKeyBase64 + * AllowedIPs = 0.0.0.0/0, ::/0 + * Endpoint = 100.100.100.0:12345 + * PersistentKeepalive = 25 + * " + * } + * } + */ + +class Awg : Wireguard() { + + override val ifName: String = "awg0" + + override fun parseConfig(config: JSONObject): AwgConfig { + val configDataJson = config.getJSONObject("awg_config_data") + val configData = parseConfigData(configDataJson.getString("config")) + return AwgConfig.build { + configureWireguard(wireguardConfigBuilder(configData)) + configData["Jc"]?.let { setJc(it.toInt()) } + configData["Jmin"]?.let { setJmin(it.toInt()) } + configData["Jmax"]?.let { setJmax(it.toInt()) } + configData["S1"]?.let { setS1(it.toInt()) } + configData["S2"]?.let { setS2(it.toInt()) } + configData["H1"]?.let { setH1(it.toLong()) } + configData["H2"]?.let { setH2(it.toLong()) } + configData["H3"]?.let { setH3(it.toLong()) } + configData["H4"]?.let { setH4(it.toLong()) } + } + } +} diff --git a/client/android/awg/src/main/kotlin/AwgConfig.kt b/client/android/awg/src/main/kotlin/AwgConfig.kt new file mode 100644 index 000000000..d70bbf9c2 --- /dev/null +++ b/client/android/awg/src/main/kotlin/AwgConfig.kt @@ -0,0 +1,115 @@ +package org.amnezia.vpn.protocol.awg + +import org.amnezia.vpn.protocol.BadConfigException +import org.amnezia.vpn.protocol.wireguard.WireguardConfig + +class AwgConfig private constructor( + wireguardConfigBuilder: WireguardConfig.Builder, + val jc: Int, + val jmin: Int, + val jmax: Int, + val s1: Int, + val s2: Int, + val h1: Long, + val h2: Long, + val h3: Long, + val h4: Long +) : WireguardConfig(wireguardConfigBuilder) { + + private constructor(builder: Builder) : this( + builder.wireguardConfigBuilder, + builder.jc, + builder.jmin, + builder.jmax, + builder.s1, + builder.s2, + builder.h1, + builder.h2, + builder.h3, + builder.h4 + ) + + override fun toWgUserspaceString(): String = with(StringBuilder()) { + append(super.toWgUserspaceString()) + appendLine("jc=$jc") + appendLine("jmin=$jmin") + appendLine("jmax=$jmax") + appendLine("s1=$s1") + appendLine("s2=$s2") + appendLine("h1=$h1") + appendLine("h2=$h2") + appendLine("h3=$h3") + appendLine("h4=$h4") + return this.toString() + } + + class Builder { + internal lateinit var wireguardConfigBuilder: WireguardConfig.Builder + private set + + private var _jc: Int? = null + internal var jc: Int + get() = _jc ?: throw BadConfigException("AWG: parameter jc is undefined") + private set(value) { _jc = value} + + private var _jmin: Int? = null + internal var jmin: Int + get() = _jmin ?: throw BadConfigException("AWG: parameter jmin is undefined") + private set(value) { _jmin = value} + + private var _jmax: Int? = null + internal var jmax: Int + get() = _jmax ?: throw BadConfigException("AWG: parameter jmax is undefined") + private set(value) { _jmax = value} + + private var _s1: Int? = null + internal var s1: Int + get() = _s1 ?: throw BadConfigException("AWG: parameter s1 is undefined") + private set(value) { _s1 = value} + + private var _s2: Int? = null + internal var s2: Int + get() = _s2 ?: throw BadConfigException("AWG: parameter s2 is undefined") + private set(value) { _s2 = value} + + private var _h1: Long? = null + internal var h1: Long + get() = _h1 ?: throw BadConfigException("AWG: parameter h1 is undefined") + private set(value) { _h1 = value} + + private var _h2: Long? = null + internal var h2: Long + get() = _h2 ?: throw BadConfigException("AWG: parameter h2 is undefined") + private set(value) { _h2 = value} + + private var _h3: Long? = null + internal var h3: Long + get() = _h3 ?: throw BadConfigException("AWG: parameter h3 is undefined") + private set(value) { _h3 = value} + + private var _h4: Long? = null + internal var h4: Long + get() = _h4 ?: throw BadConfigException("AWG: parameter h4 is undefined") + private set(value) { _h4 = value} + + fun configureWireguard(block: WireguardConfig.Builder.() -> Unit) = apply { + wireguardConfigBuilder = WireguardConfig.Builder().apply(block) + } + + fun setJc(jc: Int) = apply { this.jc = jc } + fun setJmin(jmin: Int) = apply { this.jmin = jmin } + fun setJmax(jmax: Int) = apply { this.jmax = jmax } + fun setS1(s1: Int) = apply { this.s1 = s1 } + fun setS2(s2: Int) = apply { this.s2 = s2 } + fun setH1(h1: Long) = apply { this.h1 = h1 } + fun setH2(h2: Long) = apply { this.h2 = h2 } + fun setH3(h3: Long) = apply { this.h3 = h3 } + fun setH4(h4: Long) = apply { this.h4 = h4 } + + fun build(): AwgConfig = AwgConfig(this) + } + + companion object { + inline fun build(block: Builder.() -> Unit): AwgConfig = Builder().apply(block).build() + } +} diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 39736074f..6dbf606f2 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -87,6 +87,7 @@ dependencies { implementation(project(":utils")) implementation(project(":protocolApi")) implementation(project(":wireguard")) + implementation(project(":awg")) implementation(libs.androidx.core) implementation(libs.androidx.activity) implementation(libs.androidx.security.crypto) diff --git a/client/android/protocolApi/build.gradle.kts b/client/android/protocolApi/build.gradle.kts index 9125f7f0d..6d47e065b 100644 --- a/client/android/protocolApi/build.gradle.kts +++ b/client/android/protocolApi/build.gradle.kts @@ -14,4 +14,4 @@ android { dependencies { compileOnly(project(":utils")) implementation(libs.androidx.annotation) -} \ No newline at end of file +} diff --git a/client/android/protocolApi/src/main/kotlin/Protocol.kt b/client/android/protocolApi/src/main/kotlin/Protocol.kt index c4d549f72..b3a902b58 100644 --- a/client/android/protocolApi/src/main/kotlin/Protocol.kt +++ b/client/android/protocolApi/src/main/kotlin/Protocol.kt @@ -18,17 +18,17 @@ private const val TAG = "Protocol" const val VPN_SESSION_NAME = "AmneziaVPN" -abstract class Protocol(protected val context: Context) { - - open lateinit var config: ProtocolConfig +abstract class Protocol { abstract val statistics: Statistics - abstract fun initialize() + abstract fun initialize(context: Context) + + abstract fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) - abstract fun parseConfig(config: JSONObject) + abstract fun stopVpn() - protected open fun buildVpnInterface(vpnBuilder: Builder) { + protected open fun buildVpnInterface(config: ProtocolConfig, vpnBuilder: Builder) { vpnBuilder.setSession(VPN_SESSION_NAME) vpnBuilder.allowFamily(OsConstants.AF_INET) vpnBuilder.allowFamily(OsConstants.AF_INET6) @@ -49,10 +49,6 @@ abstract class Protocol(protected val context: Context) { vpnBuilder.setMetered(false) } - abstract fun startVpn(vpnBuilder: Builder, protect: (Int) -> Boolean) - - abstract fun stopVpn() - companion object { private fun extractLibrary(context: Context, libraryName: String, destination: File): Boolean { Log.d(TAG, "Extracting library: $libraryName") diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt index f6e5df7d7..546a74781 100644 --- a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt +++ b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt @@ -5,7 +5,7 @@ import android.os.Build import androidx.annotation.RequiresApi import java.net.InetAddress -data class ProtocolConfig( +open class ProtocolConfig protected constructor( val addresses: Set, val dnsServers: Set, val routes: Set, @@ -15,7 +15,7 @@ data class ProtocolConfig( val mtu: Int ) { - private constructor(builder: Builder) : this( + protected constructor(builder: Builder) : this( builder.addresses, builder.dnsServers, builder.routes, @@ -49,6 +49,7 @@ data class ProtocolConfig( @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun excludeRoute(route: InetNetwork) = apply { this.excludedRoutes += route } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun excludeRoutes(routes: List) = apply { this.excludedRoutes += routes } diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 9b8d3c9db..7f22efa28 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -33,6 +33,7 @@ include(":qt") include(":utils") include(":protocolApi") include(":wireguard") +include(":awg") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 58f107198..d51850926 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -35,6 +35,7 @@ import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTING import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.Status import org.amnezia.vpn.protocol.VpnStartException +import org.amnezia.vpn.protocol.awg.Awg import org.amnezia.vpn.protocol.putStatistics import org.amnezia.vpn.protocol.putStatus import org.amnezia.vpn.protocol.wireguard.Wireguard @@ -54,6 +55,7 @@ class AmneziaVpnService : VpnService() { private lateinit var mainScope: CoroutineScope private var isServiceBound = false private var protocol: Protocol? = null + private val protocolCache = mutableMapOf() private var protocolState = MutableStateFlow(DISCONNECTED) private val isConnected @@ -272,11 +274,7 @@ class AmneziaVpnService : VpnService() { disconnectionJob = null protocol = getProtocol(config.getString("protocol")) - protocol?.let { protocol -> - protocol.initialize() - protocol.parseConfig(config) - protocol.startVpn(Builder(), ::protect) - } + protocol?.startVpn(config, Builder(), ::protect) protocolState.value = CONNECTED } } @@ -302,10 +300,12 @@ class AmneziaVpnService : VpnService() { } private fun getProtocol(protocolName: String): Protocol = - when (protocolName) { - "wireguard" -> Wireguard(applicationContext) - else -> throw IllegalArgumentException("Failed to load $protocolName protocol") - } + protocolCache[protocolName] + ?: when (protocolName) { + "wireguard" -> Wireguard() + "awg" -> Awg() + else -> throw IllegalArgumentException("Failed to load $protocolName protocol") + }.apply { initialize(applicationContext) } /** * Utils methods diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt index 0125198e0..c24facc04 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -9,17 +9,51 @@ import org.amnezia.vpn.protocol.InetEndpoint import org.amnezia.vpn.protocol.InetNetwork import org.amnezia.vpn.protocol.Protocol import org.amnezia.vpn.protocol.Statistics -import org.amnezia.vpn.protocol.VPN_SESSION_NAME import org.amnezia.vpn.protocol.VpnStartException import org.amnezia.vpn.protocol.parseInetAddress import org.json.JSONObject +/** + * Config example: + * { + * "protocol": "wireguard", + * "description": "Server 1", + * "dns1": "1.1.1.1", + * "dns2": "1.0.0.1", + * "hostName": "100.100.100.0", + * "splitTunnelSites": [ + * ], + * "splitTunnelType": 0, + * "wireguard_config_data": { + * "client_ip": "10.8.1.1", + * "hostName": "100.100.100.0", + * "port": 12345, + * "client_pub_key": "clientPublicKeyBase64", + * "client_priv_key": "privateKeyBase64", + * "psk_key": "presharedKeyBase64", + * "server_pub_key": "publicKeyBase64", + * "config": "[Interface] + * Address = 10.8.1.1/32 + * DNS = 1.1.1.1, 1.0.0.1 + * PrivateKey = privateKeyBase64 + * + * [Peer] + * PublicKey = publicKeyBase64 + * PresharedKey = presharedKeyBase64 + * AllowedIPs = 0.0.0.0/0, ::/0 + * Endpoint = 100.100.100.0:12345 + * PersistentKeepalive = 25 + * " + * } + * } + */ + private const val TAG = "Wireguard" -class Wireguard(context: Context) : Protocol(context) { +open class Wireguard : Protocol() { private var tunnelHandle: Int = -1 - private lateinit var wireguardConfig: WireguardConfig + protected open val ifName: String = "amn0" override val statistics: Statistics get() { @@ -40,14 +74,23 @@ class Wireguard(context: Context) : Protocol(context) { } } - override fun initialize() { + override fun initialize(context: Context) { loadSharedLibrary(context, "wg-go") } - override fun parseConfig(config: JSONObject) { + override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { + val wireguardConfig = parseConfig(config) + start(wireguardConfig, vpnBuilder, protect) + } + + protected open fun parseConfig(config: JSONObject): WireguardConfig { val configDataJson = config.getJSONObject("wireguard_config_data") val configData = parseConfigData(configDataJson.getString("config")) - wireguardConfig = WireguardConfig.build { + return WireguardConfig.build(wireguardConfigBuilder(configData)) + } + + protected fun wireguardConfigBuilder(configData: Map): WireguardConfig.Builder.() -> Unit = + { configureBaseProtocol(true) { configData["Address"]?.let { addAddress(InetNetwork.parse(it)) } configData["DNS"]?.split(",")?.map { dns -> @@ -64,10 +107,8 @@ class Wireguard(context: Context) : Protocol(context) { configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) } configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) } } - this.config = wireguardConfig.baseProtocolConfig - } - private fun parseConfigData(data: String): Map { + protected fun parseConfigData(data: String): Map { val parsedData = TreeMap(String.CASE_INSENSITIVE_ORDER) data.lineSequence() .filter { it.isNotEmpty() && !it.startsWith('[') } @@ -78,20 +119,20 @@ class Wireguard(context: Context) : Protocol(context) { return parsedData } - override fun startVpn(vpnBuilder: Builder, protect: (Int) -> Boolean) { + private fun start(config: WireguardConfig, vpnBuilder: Builder, protect: (Int) -> Boolean) { if (tunnelHandle != -1) { Log.w(TAG, "Tunnel already up") return } - buildVpnInterface(vpnBuilder) + buildVpnInterface(config, vpnBuilder) vpnBuilder.establish().use { tunFd -> if (tunFd == null) { throw VpnStartException("Create VPN interface: permission not granted or revoked") } Log.v(TAG, "Wg-go backend ${GoBackend.wgVersion()}") - tunnelHandle = GoBackend.wgTurnOn(VPN_SESSION_NAME, tunFd.detachFd(), wireguardConfig.toWgUserspaceString()) + tunnelHandle = GoBackend.wgTurnOn(ifName, tunFd.detachFd(), config.toWgUserspaceString()) } if (tunnelHandle < 0) { diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt index 740d1ab5e..bdb341b81 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt @@ -6,17 +6,17 @@ import org.amnezia.vpn.protocol.ProtocolConfig internal const val WIREGUARD_DEFAULT_MTU = 1280 -data class WireguardConfig( - val baseProtocolConfig: ProtocolConfig, +open class WireguardConfig protected constructor( + protocolConfigBuilder: ProtocolConfig.Builder, val endpoint: InetEndpoint, val persistentKeepalive: Int, val publicKeyHex: String, val preSharedKeyHex: String, val privateKeyHex: String -) { +) : ProtocolConfig(protocolConfigBuilder) { - private constructor(builder: Builder) : this( - builder.baseProtocolConfig, + protected constructor(builder: Builder) : this( + builder.protocolConfigBuilder, builder.endpoint, builder.persistentKeepalive, builder.publicKeyHex, @@ -24,11 +24,11 @@ data class WireguardConfig( builder.privateKeyHex ) - fun toWgUserspaceString(): String = with(StringBuilder()) { + open fun toWgUserspaceString(): String = with(StringBuilder()) { appendLine("private_key=$privateKeyHex") appendLine("replace_peers=true") appendLine("public_key=$publicKeyHex") - baseProtocolConfig.routes.forEach { route -> + routes.forEach { route -> appendLine("allowed_ip=$route") } appendLine("endpoint=$endpoint") @@ -39,7 +39,7 @@ data class WireguardConfig( } class Builder { - internal lateinit var baseProtocolConfig: ProtocolConfig + internal lateinit var protocolConfigBuilder: ProtocolConfig.Builder private set internal lateinit var endpoint: InetEndpoint @@ -58,7 +58,7 @@ data class WireguardConfig( private set fun configureBaseProtocol(blockingMode: Boolean, block: ProtocolConfig.Builder.() -> Unit) = apply { - baseProtocolConfig = ProtocolConfig.Builder(blockingMode).apply(block).build() + protocolConfigBuilder = ProtocolConfig.Builder(blockingMode).apply(block) } fun setEndpoint(endpoint: InetEndpoint) = apply { this.endpoint = endpoint } From 3084892ed8d3cceff093b08214778151ac8d2c36 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Nov 2023 21:15:58 +0700 Subject: [PATCH 066/144] added selection of default server and container on the sharing page --- client/configurators/openvpn_configurator.cpp | 2 ++ client/ui/qml/Pages2/PageShare.qml | 13 +++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index d863fdabe..972e460c3 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -113,6 +113,8 @@ QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentia QJsonObject jConfig; jConfig[config_key::config] = config; + clientId = connData.clientId; + return QJsonDocument(jConfig).toJson(); } diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index e3b28529e..0d7ece750 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -242,7 +242,7 @@ PageType { id: serverSelector signal severSelectorIndexChanged - property int currentIndex: 0 + property int currentIndex: -1 Layout.fillWidth: true Layout.topMargin: 16 @@ -269,8 +269,6 @@ PageType { ] } - currentIndex: 0 - clickedFunction: function() { handler() @@ -283,8 +281,9 @@ PageType { } Component.onCompleted: { - handler() - serverSelector.severSelectorIndexChanged() + serverSelectorListView.currentIndex = ServersModel.isDefaultServerHasWriteAccess() ? + proxyServersModel.mapFromSource(ServersModel.defaultIndex) : 0 + serverSelectorListView.triggerCurrentItem() } function handler() { @@ -329,6 +328,8 @@ PageType { currentIndex: 0 clickedFunction: function() { + protocolSelectorListView.currentItem.y + handler() protocolSelector.menuVisible = false @@ -338,7 +339,7 @@ PageType { target: serverSelector function onSeverSelectorIndexChanged() { - protocolSelectorListView.currentIndex = 0 + protocolSelectorListView.currentIndex = proxyContainersModel.mapFromSource(ContainersModel.getDefaultContainer()) protocolSelectorListView.triggerCurrentItem() } } From c164814abd92a35364837073e504f31909be8e3d Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 27 Nov 2023 10:59:48 +0700 Subject: [PATCH 067/144] fixed default server setting after importing --- client/ui/qml/Pages2/PageSetupWizardViewConfig.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml b/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml index ac35651f9..65a6f319b 100644 --- a/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml +++ b/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml @@ -24,7 +24,7 @@ PageType { } function onImportFinished() { - if (ConnectionController.isConnected) { + if (!ConnectionController.isConnected) { ServersModel.setDefaultServerIndex(ServersModel.getServersCount() - 1); } From 426ac49f6ff98b2562fa0b3ef154b106d2a27e60 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 27 Nov 2023 12:46:59 +0700 Subject: [PATCH 068/144] fixed "auto-connect" option --- client/amnezia_application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index e3adf67a8..240c6d359 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -354,7 +354,7 @@ void AmneziaApplication::initControllers() m_settingsController.reset(new SettingsController(m_serversModel, m_containersModel, m_languageModel, m_settings)); m_engine->rootContext()->setContextProperty("SettingsController", m_settingsController.get()); - if (m_settingsController->isAutoStartEnabled() && m_serversModel->getDefaultServerIndex() >= 0) { + if (m_settingsController->isAutoConnectEnabled() && m_serversModel->getDefaultServerIndex() >= 0) { QTimer::singleShot(1000, this, [this]() { m_connectionController->openConnection(); }); } From 2d22b52b5dec849e098fb0cb38ef4b069d44ae9b Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 27 Nov 2023 13:42:08 +0700 Subject: [PATCH 069/144] limited client name length --- client/ui/qml/Pages2/PageShare.qml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 0d7ece750..3e08bf87f 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -529,7 +529,7 @@ PageType { id: clientInfoDrawer width: root.width - height: root.height * 0.45 + height: root.height * 0.5 ColumnLayout { anchors.top: parent.top @@ -591,6 +591,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Client name") textFieldText: clientName + textField.maximumLength: 30 } BasicButtonType { @@ -641,9 +642,6 @@ PageType { questionDrawer.close() } questionDrawer.open() - - - } } } @@ -651,6 +649,7 @@ PageType { } } } + QuestionDrawer { id: questionDrawer } From a53e904f7b22c28914cafa3f1d20ead88c94c71b Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 27 Nov 2023 13:56:52 +0700 Subject: [PATCH 070/144] fixed appProcessIsRunning() for win11 --- deploy/installer/config/controlscript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/installer/config/controlscript.js b/deploy/installer/config/controlscript.js index 39404530b..63831e01b 100644 --- a/deploy/installer/config/controlscript.js +++ b/deploy/installer/config/controlscript.js @@ -76,7 +76,7 @@ function raiseInstallerWindow() function appProcessIsRunning() { if (runningOnWindows()) { - var cmdArgs = ["/FI", "WINDOWTITLE eq " + appName()]; + var cmdArgs = ["| findstr " + appExecutableFileName()]; var result = installer.execute("tasklist", cmdArgs); if ( Number(result[1]) === 0 ) { From 4fd0852bb33a6f93f66f06fffbb15c778598dc29 Mon Sep 17 00:00:00 2001 From: tiaga Date: Mon, 27 Nov 2023 21:47:54 +0700 Subject: [PATCH 071/144] Improve install_docker.sh - add delays before and after Docker activation - cancel installation if `sudo` wasn't found --- client/server_scripts/install_docker.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/server_scripts/install_docker.sh b/client/server_scripts/install_docker.sh index e6708ddf0..6f19e0900 100644 --- a/client/server_scripts/install_docker.sh +++ b/client/server_scripts/install_docker.sh @@ -7,13 +7,13 @@ if [ "$dist" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive; fi;\ if ! command -v sudo > /dev/null 2>&1; then $pm $check_pkgs; $pm $silent_inst sudo; fi;\ if ! command -v fuser > /dev/null 2>&1; then sudo $pm $check_pkgs; sudo $pm $silent_inst psmisc; fi;\ if ! command -v lsof > /dev/null 2>&1; then sudo $pm $check_pkgs; sudo $pm $silent_inst lsof; fi;\ -if ! command -v docker > /dev/null 2>&1; then sudo $pm $check_pkgs; sudo $pm $silent_inst $docker_pkg;\ - if [ "$dist" = "fedora" ] || [ "$dist" = "centos" ] || [ "$dist" = "debian" ]; then sudo systemctl enable docker && sudo systemctl start docker; fi;\ +if ! command -v docker > /dev/null 2>&1; then \ + sudo $pm $check_pkgs; sudo $pm $silent_inst $docker_pkg;\ + sleep 5; sudo systemctl enable --now docker; sleep 5;\ fi;\ -if [ "$dist" = "debian" ]; then \ - docker_service=$(systemctl list-units --full --all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ - if [ -z "$docker_service" ]; then sudo $pm $check_pkgs; sudo $pm $silent_inst curl $docker_pkg; fi;\ - sleep 3 && sudo systemctl start docker && sleep 3;\ +if [ "$(systemctl is-active docker)" != "active" ]; then \ + sudo $pm $check_pkgs; sudo $pm $silent_inst $docker_pkg;\ + sleep 5; sudo systemctl start docker; sleep 5;\ fi;\ -if ! command -v sudo > /dev/null 2>&1; then echo "Failed to install Docker"; exit 1; fi;\ +if ! command -v sudo > /dev/null 2>&1; then echo "Failed to install sudo, command not found"; exit 1; fi;\ docker --version From 8ec105bee0040e8434fc52444ba5651e293b2e10 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 28 Nov 2023 19:01:44 +0300 Subject: [PATCH 072/144] Move Log class to org.amnezia.vpn.util package --- client/android/protocolApi/src/main/kotlin/Protocol.kt | 2 +- client/android/src/org/amnezia/vpn/AmneziaActivity.kt | 1 + client/android/src/org/amnezia/vpn/AmneziaVpnService.kt | 1 + client/android/src/org/amnezia/vpn/CameraActivity.kt | 1 + client/android/src/org/amnezia/vpn/IpcMessenger.kt | 1 + client/android/src/org/amnezia/vpn/NetworkState.kt | 1 + client/android/src/org/amnezia/vpn/Prefs.kt | 1 + client/android/src/org/amnezia/vpn/VpnRequestActivity.kt | 1 + client/android/utils/build.gradle.kts | 2 +- client/android/utils/src/main/kotlin/Log.kt | 2 +- .../main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt | 2 +- 11 files changed, 11 insertions(+), 4 deletions(-) diff --git a/client/android/protocolApi/src/main/kotlin/Protocol.kt b/client/android/protocolApi/src/main/kotlin/Protocol.kt index b3a902b58..effaaa75b 100644 --- a/client/android/protocolApi/src/main/kotlin/Protocol.kt +++ b/client/android/protocolApi/src/main/kotlin/Protocol.kt @@ -11,7 +11,7 @@ import androidx.annotation.RequiresApi import java.io.File import java.io.FileOutputStream import java.util.zip.ZipFile -import org.amnezia.vpn.Log +import org.amnezia.vpn.util.Log import org.json.JSONObject private const val TAG = "Protocol" diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index 40b504530..048cb88bd 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.launch import org.amnezia.vpn.protocol.getStatistics import org.amnezia.vpn.protocol.getStatus import org.amnezia.vpn.qt.QtAndroidController +import org.amnezia.vpn.util.Log import org.qtproject.qt.android.bindings.QtActivity private const val TAG = "AmneziaActivity" diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index d51850926..a1a4d65f7 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -39,6 +39,7 @@ import org.amnezia.vpn.protocol.awg.Awg import org.amnezia.vpn.protocol.putStatistics import org.amnezia.vpn.protocol.putStatus import org.amnezia.vpn.protocol.wireguard.Wireguard +import org.amnezia.vpn.util.Log import org.json.JSONException import org.json.JSONObject diff --git a/client/android/src/org/amnezia/vpn/CameraActivity.kt b/client/android/src/org/amnezia/vpn/CameraActivity.kt index 16f847d37..5af560884 100644 --- a/client/android/src/org/amnezia/vpn/CameraActivity.kt +++ b/client/android/src/org/amnezia/vpn/CameraActivity.kt @@ -25,6 +25,7 @@ import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.common.InputImage import org.amnezia.vpn.databinding.CameraPreviewBinding import org.amnezia.vpn.qt.QtAndroidController +import org.amnezia.vpn.util.Log private const val TAG = "CameraActivity" diff --git a/client/android/src/org/amnezia/vpn/IpcMessenger.kt b/client/android/src/org/amnezia/vpn/IpcMessenger.kt index 7599834aa..218a165be 100644 --- a/client/android/src/org/amnezia/vpn/IpcMessenger.kt +++ b/client/android/src/org/amnezia/vpn/IpcMessenger.kt @@ -4,6 +4,7 @@ import android.os.DeadObjectException import android.os.Message import android.os.Messenger import android.os.RemoteException +import org.amnezia.vpn.util.Log private const val TAG = "IpcMessenger" diff --git a/client/android/src/org/amnezia/vpn/NetworkState.kt b/client/android/src/org/amnezia/vpn/NetworkState.kt index e1696fa92..7b896bc31 100644 --- a/client/android/src/org/amnezia/vpn/NetworkState.kt +++ b/client/android/src/org/amnezia/vpn/NetworkState.kt @@ -46,6 +46,7 @@ import androidx.core.content.ContextCompat import java.io.FileDescriptor import java.io.IOException import java.lang.Exception +import org.amnezia.vpn.util.Log class NetworkState(var service: AmneziaVpnService) { private var mService: AmneziaVpnService = service diff --git a/client/android/src/org/amnezia/vpn/Prefs.kt b/client/android/src/org/amnezia/vpn/Prefs.kt index 4b4262cb2..1d2920212 100644 --- a/client/android/src/org/amnezia/vpn/Prefs.kt +++ b/client/android/src/org/amnezia/vpn/Prefs.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey +import org.amnezia.vpn.util.Log private const val TAG = "Prefs" private const val PREFS_FILE = "org.amnezia.vpn.prefs" diff --git a/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt b/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt index 4fa878e10..9dce3d788 100644 --- a/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt +++ b/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt @@ -13,6 +13,7 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.core.content.ContextCompat import androidx.core.content.getSystemService +import org.amnezia.vpn.util.Log private const val TAG = "VpnRequestActivity" diff --git a/client/android/utils/build.gradle.kts b/client/android/utils/build.gradle.kts index 792d43d66..ac5d1efb5 100644 --- a/client/android/utils/build.gradle.kts +++ b/client/android/utils/build.gradle.kts @@ -8,7 +8,7 @@ kotlin { } android { - namespace = "org.amnezia.vpn" + namespace = "org.amnezia.vpn.util" buildFeatures { // add BuildConfig class diff --git a/client/android/utils/src/main/kotlin/Log.kt b/client/android/utils/src/main/kotlin/Log.kt index 5b2657ba4..82180c3d9 100644 --- a/client/android/utils/src/main/kotlin/Log.kt +++ b/client/android/utils/src/main/kotlin/Log.kt @@ -1,4 +1,4 @@ -package org.amnezia.vpn +package org.amnezia.vpn.util import android.util.Log as NativeLog diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt index c24facc04..1500fffd6 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -4,13 +4,13 @@ import android.content.Context import android.net.VpnService.Builder import java.util.TreeMap import com.wireguard.android.backend.GoBackend -import org.amnezia.vpn.Log import org.amnezia.vpn.protocol.InetEndpoint import org.amnezia.vpn.protocol.InetNetwork import org.amnezia.vpn.protocol.Protocol import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.VpnStartException import org.amnezia.vpn.protocol.parseInetAddress +import org.amnezia.vpn.util.Log import org.json.JSONObject /** From 9738ada946672f1bf165b74c4373b3bf76351123 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 28 Nov 2023 19:47:22 +0300 Subject: [PATCH 073/144] ProtocolApi refactoring, move network classes to NetworkUtils.kt --- client/android/AndroidManifest.xml | 1 - client/android/awg/src/main/kotlin/Awg.kt | 2 +- .../android/awg/src/main/kotlin/AwgConfig.kt | 30 +++---- client/android/protocolApi/build.gradle.kts | 1 + .../protocolApi/src/main/kotlin/Protocol.kt | 26 +++++- .../src/main/kotlin/ProtocolConfig.kt | 77 ++++++---------- .../src/main/kotlin/ProtocolState.kt | 3 +- .../src/org/amnezia/vpn/AmneziaVpnService.kt | 36 +++++--- .../utils/src/main/AndroidManifest.xml | 4 + .../utils/src/main/kotlin/NetworkUtils.kt | 87 +++++++++++++++++++ client/android/wireguard/build.gradle.kts | 1 + .../vpn/protocol/wireguard/Wireguard.kt | 50 ++++++----- .../vpn/protocol/wireguard/WireguardConfig.kt | 17 ++-- 13 files changed, 213 insertions(+), 122 deletions(-) create mode 100644 client/android/utils/src/main/AndroidManifest.xml create mode 100644 client/android/utils/src/main/kotlin/NetworkUtils.kt diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index ee6f1b866..b30c8da25 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -17,7 +17,6 @@ - diff --git a/client/android/awg/src/main/kotlin/Awg.kt b/client/android/awg/src/main/kotlin/Awg.kt index 2bc06af55..2d9a9b388 100644 --- a/client/android/awg/src/main/kotlin/Awg.kt +++ b/client/android/awg/src/main/kotlin/Awg.kt @@ -64,7 +64,7 @@ class Awg : Wireguard() { val configDataJson = config.getJSONObject("awg_config_data") val configData = parseConfigData(configDataJson.getString("config")) return AwgConfig.build { - configureWireguard(wireguardConfigBuilder(configData)) + configWireguard(configData) configData["Jc"]?.let { setJc(it.toInt()) } configData["Jmin"]?.let { setJmin(it.toInt()) } configData["Jmax"]?.let { setJmax(it.toInt()) } diff --git a/client/android/awg/src/main/kotlin/AwgConfig.kt b/client/android/awg/src/main/kotlin/AwgConfig.kt index d70bbf9c2..e3554e60a 100644 --- a/client/android/awg/src/main/kotlin/AwgConfig.kt +++ b/client/android/awg/src/main/kotlin/AwgConfig.kt @@ -17,7 +17,7 @@ class AwgConfig private constructor( ) : WireguardConfig(wireguardConfigBuilder) { private constructor(builder: Builder) : this( - builder.wireguardConfigBuilder, + builder, builder.jc, builder.jmin, builder.jmax, @@ -43,58 +43,52 @@ class AwgConfig private constructor( return this.toString() } - class Builder { - internal lateinit var wireguardConfigBuilder: WireguardConfig.Builder - private set + class Builder : WireguardConfig.Builder() { private var _jc: Int? = null internal var jc: Int get() = _jc ?: throw BadConfigException("AWG: parameter jc is undefined") - private set(value) { _jc = value} + private set(value) { _jc = value } private var _jmin: Int? = null internal var jmin: Int get() = _jmin ?: throw BadConfigException("AWG: parameter jmin is undefined") - private set(value) { _jmin = value} + private set(value) { _jmin = value } private var _jmax: Int? = null internal var jmax: Int get() = _jmax ?: throw BadConfigException("AWG: parameter jmax is undefined") - private set(value) { _jmax = value} + private set(value) { _jmax = value } private var _s1: Int? = null internal var s1: Int get() = _s1 ?: throw BadConfigException("AWG: parameter s1 is undefined") - private set(value) { _s1 = value} + private set(value) { _s1 = value } private var _s2: Int? = null internal var s2: Int get() = _s2 ?: throw BadConfigException("AWG: parameter s2 is undefined") - private set(value) { _s2 = value} + private set(value) { _s2 = value } private var _h1: Long? = null internal var h1: Long get() = _h1 ?: throw BadConfigException("AWG: parameter h1 is undefined") - private set(value) { _h1 = value} + private set(value) { _h1 = value } private var _h2: Long? = null internal var h2: Long get() = _h2 ?: throw BadConfigException("AWG: parameter h2 is undefined") - private set(value) { _h2 = value} + private set(value) { _h2 = value } private var _h3: Long? = null internal var h3: Long get() = _h3 ?: throw BadConfigException("AWG: parameter h3 is undefined") - private set(value) { _h3 = value} + private set(value) { _h3 = value } private var _h4: Long? = null internal var h4: Long get() = _h4 ?: throw BadConfigException("AWG: parameter h4 is undefined") - private set(value) { _h4 = value} - - fun configureWireguard(block: WireguardConfig.Builder.() -> Unit) = apply { - wireguardConfigBuilder = WireguardConfig.Builder().apply(block) - } + private set(value) { _h4 = value } fun setJc(jc: Int) = apply { this.jc = jc } fun setJmin(jmin: Int) = apply { this.jmin = jmin } @@ -106,7 +100,7 @@ class AwgConfig private constructor( fun setH3(h3: Long) = apply { this.h3 = h3 } fun setH4(h4: Long) = apply { this.h4 = h4 } - fun build(): AwgConfig = AwgConfig(this) + override fun build(): AwgConfig = AwgConfig(this) } companion object { diff --git a/client/android/protocolApi/build.gradle.kts b/client/android/protocolApi/build.gradle.kts index 6d47e065b..ec11ec226 100644 --- a/client/android/protocolApi/build.gradle.kts +++ b/client/android/protocolApi/build.gradle.kts @@ -14,4 +14,5 @@ android { dependencies { compileOnly(project(":utils")) implementation(libs.androidx.annotation) + implementation(libs.kotlinx.coroutines) } diff --git a/client/android/protocolApi/src/main/kotlin/Protocol.kt b/client/android/protocolApi/src/main/kotlin/Protocol.kt index effaaa75b..81c54d971 100644 --- a/client/android/protocolApi/src/main/kotlin/Protocol.kt +++ b/client/android/protocolApi/src/main/kotlin/Protocol.kt @@ -11,6 +11,8 @@ import androidx.annotation.RequiresApi import java.io.File import java.io.FileOutputStream import java.util.zip.ZipFile +import kotlinx.coroutines.flow.MutableStateFlow +import org.amnezia.vpn.util.InetNetwork import org.amnezia.vpn.util.Log import org.json.JSONObject @@ -21,8 +23,11 @@ const val VPN_SESSION_NAME = "AmneziaVPN" abstract class Protocol { abstract val statistics: Statistics + protected lateinit var state: MutableStateFlow - abstract fun initialize(context: Context) + open fun initialize(context: Context, state: MutableStateFlow) { + this.state = state + } abstract fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) @@ -30,11 +35,17 @@ abstract class Protocol { protected open fun buildVpnInterface(config: ProtocolConfig, vpnBuilder: Builder) { vpnBuilder.setSession(VPN_SESSION_NAME) - vpnBuilder.allowFamily(OsConstants.AF_INET) - vpnBuilder.allowFamily(OsConstants.AF_INET6) for (addr in config.addresses) vpnBuilder.addAddress(addr) + for (addr in config.dnsServers) vpnBuilder.addDnsServer(addr) + // fix for Samsung android ignoring DNS servers outside the VPN route range + if (Build.BRAND == "samsung") { + for (addr in config.dnsServers) vpnBuilder.addRoute(InetNetwork(addr)) + } + + config.searchDomain?.let { vpnBuilder.addSearchDomain(it) } + for (addr in config.routes) vpnBuilder.addRoute(addr) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) @@ -43,6 +54,15 @@ abstract class Protocol { for (app in config.excludedApplications) vpnBuilder.addDisallowedApplication(app) vpnBuilder.setMtu(config.mtu) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + config.httpProxy?.let { vpnBuilder.setHttpProxy(it) } + + if (config.allowAllAF) { + vpnBuilder.allowFamily(OsConstants.AF_INET) + vpnBuilder.allowFamily(OsConstants.AF_INET6) + } + vpnBuilder.setBlocking(config.blockingMode) vpnBuilder.setUnderlyingNetworks(null) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt index 546a74781..def77d812 100644 --- a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt +++ b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt @@ -1,16 +1,18 @@ package org.amnezia.vpn.protocol -import android.net.InetAddresses -import android.os.Build -import androidx.annotation.RequiresApi +import android.net.ProxyInfo import java.net.InetAddress +import org.amnezia.vpn.util.InetNetwork open class ProtocolConfig protected constructor( val addresses: Set, val dnsServers: Set, + val searchDomain: String?, val routes: Set, val excludedRoutes: Set, val excludedApplications: Set, + val httpProxy: ProxyInfo?, + val allowAllAF: Boolean, val blockingMode: Boolean, val mtu: Int ) { @@ -18,44 +20,59 @@ open class ProtocolConfig protected constructor( protected constructor(builder: Builder) : this( builder.addresses, builder.dnsServers, + builder.searchDomain, builder.routes, builder.excludedRoutes, builder.excludedApplications, + builder.httpProxy, + builder.allowAllAF, builder.blockingMode, builder.mtu ) - class Builder(blockingMode: Boolean) { + open class Builder(blockingMode: Boolean) { internal val addresses: MutableSet = hashSetOf() internal val dnsServers: MutableSet = hashSetOf() internal val routes: MutableSet = hashSetOf() internal val excludedRoutes: MutableSet = hashSetOf() internal val excludedApplications: MutableSet = hashSetOf() - internal var blockingMode: Boolean = blockingMode + internal var searchDomain: String? = null + private set + + internal var httpProxy: ProxyInfo? = null + private set + + internal var allowAllAF: Boolean = false private set - internal var mtu: Int = 0 + internal var blockingMode: Boolean = blockingMode private set + open var mtu: Int = 0 + protected set + fun addAddress(addr: InetNetwork) = apply { this.addresses += addr } fun addAddresses(addresses: List) = apply { this.addresses += addresses } fun addDnsServer(dnsServer: InetAddress) = apply { this.dnsServers += dnsServer } fun addDnsServers(dnsServers: List) = apply { this.dnsServers += dnsServers } + fun setSearchDomain(domain: String) = apply { this.searchDomain = domain } + fun addRoute(route: InetNetwork) = apply { this.routes += route } fun addRoutes(routes: List) = apply { this.routes += routes } - @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun excludeRoute(route: InetNetwork) = apply { this.excludedRoutes += route } - - @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun excludeRoutes(routes: List) = apply { this.excludedRoutes += routes } fun excludeApplication(application: String) = apply { this.excludedApplications += application } fun excludeApplications(applications: List) = apply { this.excludedApplications += applications } + fun setHttpProxy(httpProxy: ProxyInfo) = apply { this.httpProxy = httpProxy } + + fun setAllowAllAF(allowAllAF: Boolean) = apply { this.allowAllAF = allowAllAF } + fun setBlockingMode(blockingMode: Boolean) = apply { this.blockingMode = blockingMode } fun setMtu(mtu: Int) = apply { this.mtu = mtu } @@ -72,7 +89,7 @@ open class ProtocolConfig protected constructor( if (errorMessage.isNotEmpty()) throw BadConfigException(errorMessage.toString()) } - fun build(): ProtocolConfig = validate().run { ProtocolConfig(this@Builder) } + open fun build(): ProtocolConfig = validate().run { ProtocolConfig(this@Builder) } } companion object { @@ -80,43 +97,3 @@ open class ProtocolConfig protected constructor( Builder(blockingMode).apply(block).build() } } - -data class InetNetwork(val address: InetAddress, val mask: Int) { - - override fun toString(): String = "${address.hostAddress}/$mask" - - companion object { - fun parse(data: String): InetNetwork { - val split = data.split("/") - val address = parseInetAddress(split.first()) - val mask = split.last().toInt() - return InetNetwork(address, mask) - } - } -} - -data class InetEndpoint(val address: InetAddress, val port: Int) { - - override fun toString(): String = "${address.hostAddress}:$port" - - companion object { - fun parse(data: String): InetEndpoint { - val split = data.split(":") - val address = parseInetAddress(split.first()) - val port = split.last().toInt() - return InetEndpoint(address, port) - } - } -} - -fun parseInetAddress(address: String): InetAddress = parseNumericAddressCompat(address) - -private val parseNumericAddressCompat: (String) -> InetAddress = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - InetAddresses::parseNumericAddress - } else { - val m = InetAddress::class.java.getMethod("parseNumericAddress", String::class.java) - fun(address: String): InetAddress { - return m.invoke(null, address) as InetAddress - } - } diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolState.kt b/client/android/protocolApi/src/main/kotlin/ProtocolState.kt index e66ed2ae1..d79949fa3 100644 --- a/client/android/protocolApi/src/main/kotlin/ProtocolState.kt +++ b/client/android/protocolApi/src/main/kotlin/ProtocolState.kt @@ -4,5 +4,6 @@ enum class ProtocolState { CONNECTED, CONNECTING, DISCONNECTED, - DISCONNECTING + DISCONNECTING, + UNKNOWN } diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index a1a4d65f7..13e0cb29c 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -21,10 +21,13 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.cancel import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.LoadLibraryException import org.amnezia.vpn.protocol.Protocol @@ -32,10 +35,12 @@ import org.amnezia.vpn.protocol.ProtocolState.CONNECTED import org.amnezia.vpn.protocol.ProtocolState.CONNECTING import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTING +import org.amnezia.vpn.protocol.ProtocolState.UNKNOWN import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.Status import org.amnezia.vpn.protocol.VpnStartException import org.amnezia.vpn.protocol.awg.Awg +import org.amnezia.vpn.protocol.openvpn.OpenVpn import org.amnezia.vpn.protocol.putStatistics import org.amnezia.vpn.protocol.putStatus import org.amnezia.vpn.protocol.wireguard.Wireguard @@ -54,10 +59,11 @@ private const val NOTIFICATION_ID = 1337 class AmneziaVpnService : VpnService() { private lateinit var mainScope: CoroutineScope + private lateinit var connectionScope: CoroutineScope private var isServiceBound = false private var protocol: Protocol? = null private val protocolCache = mutableMapOf() - private var protocolState = MutableStateFlow(DISCONNECTED) + private var protocolState = MutableStateFlow(UNKNOWN) private val isConnected get() = protocolState.value == CONNECTED @@ -65,6 +71,9 @@ class AmneziaVpnService : VpnService() { private val isDisconnected get() = protocolState.value == DISCONNECTED + private val isUnknown + get() = protocolState.value == UNKNOWN + private var connectionJob: Job? = null private var disconnectionJob: Job? = null private lateinit var clientMessenger: IpcMessenger @@ -167,7 +176,8 @@ class AmneziaVpnService : VpnService() { override fun onCreate() { super.onCreate() Log.v(TAG, "Create Amnezia VPN service") - mainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate + connectionExceptionHandler) + mainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + connectionScope = CoroutineScope(SupervisorJob() + Dispatchers.IO + connectionExceptionHandler) clientMessenger = IpcMessenger(messengerName = "Client") launchProtocolStateHandler() } @@ -205,13 +215,14 @@ class AmneziaVpnService : VpnService() { if (intent?.action != "android.net.VpnService") { isServiceBound = false clientMessenger.reset() - if (isDisconnected) stopSelf() + if (isUnknown || isDisconnected) stopSelf() } return super.onUnbind(intent) } override fun onRevoke() { Log.v(TAG, "onRevoke") + // Calls to onRevoke() method may not happen on the main thread of the process mainScope.launch { disconnect() } @@ -219,10 +230,9 @@ class AmneziaVpnService : VpnService() { override fun onDestroy() { Log.v(TAG, "Destroy service") - if (!isDisconnected) { - protocol?.stopVpn() - protocolState.value = DISCONNECTED - } + // todo: add sync disconnect + disconnect() + connectionScope.cancel() mainScope.cancel() super.onDestroy() } @@ -244,7 +254,7 @@ class AmneziaVpnService : VpnService() { if (!isServiceBound) stopSelf() } - CONNECTING, DISCONNECTING -> {} + CONNECTING, DISCONNECTING, UNKNOWN -> {} } } } @@ -270,13 +280,12 @@ class AmneziaVpnService : VpnService() { return } - connectionJob = mainScope.launch { + connectionJob = connectionScope.launch { disconnectionJob?.join() disconnectionJob = null protocol = getProtocol(config.getString("protocol")) protocol?.startVpn(config, Builder(), ::protect) - protocolState.value = CONNECTED } } @@ -284,11 +293,11 @@ class AmneziaVpnService : VpnService() { private fun disconnect() { Log.v(TAG, "Stop VPN connection") - if (isDisconnected || protocolState.value == DISCONNECTING) return + if (isUnknown || isDisconnected || protocolState.value == DISCONNECTING) return protocolState.value = DISCONNECTING - disconnectionJob = mainScope.launch { + disconnectionJob = connectionScope.launch { connectionJob?.let { if (it.isActive) it.cancelAndJoin() } @@ -296,7 +305,6 @@ class AmneziaVpnService : VpnService() { protocol?.stopVpn() protocol = null - protocolState.value = DISCONNECTED } } @@ -306,7 +314,7 @@ class AmneziaVpnService : VpnService() { "wireguard" -> Wireguard() "awg" -> Awg() else -> throw IllegalArgumentException("Failed to load $protocolName protocol") - }.apply { initialize(applicationContext) } + }.apply { initialize(applicationContext, protocolState) } /** * Utils methods diff --git a/client/android/utils/src/main/AndroidManifest.xml b/client/android/utils/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a22786b1a --- /dev/null +++ b/client/android/utils/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/client/android/utils/src/main/kotlin/NetworkUtils.kt b/client/android/utils/src/main/kotlin/NetworkUtils.kt new file mode 100644 index 000000000..1efb9da51 --- /dev/null +++ b/client/android/utils/src/main/kotlin/NetworkUtils.kt @@ -0,0 +1,87 @@ +package org.amnezia.vpn.util + +import android.content.Context +import android.net.ConnectivityManager +import android.net.InetAddresses +import android.net.NetworkCapabilities +import android.os.Build +import java.net.Inet4Address +import java.net.Inet6Address +import java.net.InetAddress + +object NetworkUtils { + + fun getLocalNetworks(context: Context, ipv6: Boolean): List { + val connectivityManager = context.getSystemService(ConnectivityManager::class.java) + connectivityManager.activeNetwork?.let { network -> + val netCapabilities = connectivityManager.getNetworkCapabilities(network) + val linkProperties = connectivityManager.getLinkProperties(network) + if (linkProperties == null || + netCapabilities == null || + netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || + netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) + ) return emptyList() + + val addresses = mutableListOf() + + for (linkAddress in linkProperties.linkAddresses) { + val address = linkAddress.address + if ((!ipv6 && address is Inet4Address) || (ipv6 && address is Inet6Address)) { + addresses += InetNetwork(address, linkAddress.prefixLength) + } + } + return addresses + } + return emptyList() + } +} + +data class InetNetwork(val address: InetAddress, val mask: Int) { + + constructor(address: String, mask: Int) : this(parseInetAddress(address), mask) + + constructor(address: InetAddress) : this(address, address.maxPrefixLength) + + constructor(address: String) : this(parseInetAddress(address)) + + override fun toString(): String = "${address.hostAddress}/$mask" + + companion object { + fun parse(data: String): InetNetwork { + val split = data.split("/") + val address = parseInetAddress(split.first()) + val mask = split.last().toInt() + return InetNetwork(address, mask) + } + + } +} + +data class InetEndpoint(val address: InetAddress, val port: Int) { + + override fun toString(): String = "${address.hostAddress}:$port" + + companion object { + fun parse(data: String): InetEndpoint { + val split = data.split(":") + val address = parseInetAddress(split.first()) + val port = split.last().toInt() + return InetEndpoint(address, port) + } + } +} + +private val InetAddress.maxPrefixLength: Int + get() = if (this is Inet4Address) 32 else 128 + +fun parseInetAddress(address: String): InetAddress = parseNumericAddressCompat(address) + +private val parseNumericAddressCompat: (String) -> InetAddress = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + InetAddresses::parseNumericAddress + } else { + val m = InetAddress::class.java.getMethod("parseNumericAddress", String::class.java) + fun(address: String): InetAddress { + return m.invoke(null, address) as InetAddress + } + } diff --git a/client/android/wireguard/build.gradle.kts b/client/android/wireguard/build.gradle.kts index 047d838fa..4ed4e3186 100644 --- a/client/android/wireguard/build.gradle.kts +++ b/client/android/wireguard/build.gradle.kts @@ -14,4 +14,5 @@ android { dependencies { compileOnly(project(":utils")) compileOnly(project(":protocolApi")) + implementation(libs.kotlinx.coroutines) } diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt index 1500fffd6..8e1a58b04 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -4,13 +4,17 @@ import android.content.Context import android.net.VpnService.Builder import java.util.TreeMap import com.wireguard.android.backend.GoBackend -import org.amnezia.vpn.protocol.InetEndpoint -import org.amnezia.vpn.protocol.InetNetwork +import kotlinx.coroutines.flow.MutableStateFlow import org.amnezia.vpn.protocol.Protocol +import org.amnezia.vpn.protocol.ProtocolState +import org.amnezia.vpn.protocol.ProtocolState.CONNECTED +import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.VpnStartException -import org.amnezia.vpn.protocol.parseInetAddress +import org.amnezia.vpn.util.InetEndpoint +import org.amnezia.vpn.util.InetNetwork import org.amnezia.vpn.util.Log +import org.amnezia.vpn.util.parseInetAddress import org.json.JSONObject /** @@ -74,39 +78,38 @@ open class Wireguard : Protocol() { } } - override fun initialize(context: Context) { + override fun initialize(context: Context, state: MutableStateFlow) { + super.initialize(context, state) loadSharedLibrary(context, "wg-go") } override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { val wireguardConfig = parseConfig(config) start(wireguardConfig, vpnBuilder, protect) + state.value = CONNECTED } protected open fun parseConfig(config: JSONObject): WireguardConfig { val configDataJson = config.getJSONObject("wireguard_config_data") val configData = parseConfigData(configDataJson.getString("config")) - return WireguardConfig.build(wireguardConfigBuilder(configData)) + return WireguardConfig.build { configWireguard(configData) } } - protected fun wireguardConfigBuilder(configData: Map): WireguardConfig.Builder.() -> Unit = - { - configureBaseProtocol(true) { - configData["Address"]?.let { addAddress(InetNetwork.parse(it)) } - configData["DNS"]?.split(",")?.map { dns -> - parseInetAddress(dns.trim()) - }?.forEach(::addDnsServer) - configData["AllowedIPs"]?.split(",")?.map { route -> - InetNetwork.parse(route.trim()) - }?.forEach(::addRoute) - setMtu(configData["MTU"]?.toInt() ?: WIREGUARD_DEFAULT_MTU) - } - configData["Endpoint"]?.let { setEndpoint(InetEndpoint.parse(it)) } - configData["PersistentKeepalive"]?.let { setPersistentKeepalive(it.toInt()) } - configData["PrivateKey"]?.let { setPrivateKeyHex(it.base64ToHex()) } - configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) } - configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) } - } + protected fun WireguardConfig.Builder.configWireguard(configData: Map) { + configData["Address"]?.let { addAddress(InetNetwork.parse(it)) } + configData["DNS"]?.split(",")?.map { dns -> + parseInetAddress(dns.trim()) + }?.forEach(::addDnsServer) + configData["AllowedIPs"]?.split(",")?.map { route -> + InetNetwork.parse(route.trim()) + }?.forEach(::addRoute) + configData["MTU"]?.let { setMtu(it.toInt()) } + configData["Endpoint"]?.let { setEndpoint(InetEndpoint.parse(it)) } + configData["PersistentKeepalive"]?.let { setPersistentKeepalive(it.toInt()) } + configData["PrivateKey"]?.let { setPrivateKeyHex(it.base64ToHex()) } + configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) } + configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) } + } protected fun parseConfigData(data: String): Map { val parsedData = TreeMap(String.CASE_INSENSITIVE_ORDER) @@ -155,5 +158,6 @@ open class Wireguard : Protocol() { val handleToClose = tunnelHandle tunnelHandle = -1 GoBackend.wgTurnOff(handleToClose) + state.value = DISCONNECTED } } diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt index bdb341b81..86d6bf8a7 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt @@ -1,10 +1,10 @@ package org.amnezia.vpn.protocol.wireguard import android.util.Base64 -import org.amnezia.vpn.protocol.InetEndpoint import org.amnezia.vpn.protocol.ProtocolConfig +import org.amnezia.vpn.util.InetEndpoint -internal const val WIREGUARD_DEFAULT_MTU = 1280 +private const val WIREGUARD_DEFAULT_MTU = 1280 open class WireguardConfig protected constructor( protocolConfigBuilder: ProtocolConfig.Builder, @@ -16,7 +16,7 @@ open class WireguardConfig protected constructor( ) : ProtocolConfig(protocolConfigBuilder) { protected constructor(builder: Builder) : this( - builder.protocolConfigBuilder, + builder, builder.endpoint, builder.persistentKeepalive, builder.publicKeyHex, @@ -38,10 +38,7 @@ open class WireguardConfig protected constructor( return this.toString() } - class Builder { - internal lateinit var protocolConfigBuilder: ProtocolConfig.Builder - private set - + open class Builder : ProtocolConfig.Builder(true) { internal lateinit var endpoint: InetEndpoint private set @@ -57,9 +54,7 @@ open class WireguardConfig protected constructor( internal lateinit var privateKeyHex: String private set - fun configureBaseProtocol(blockingMode: Boolean, block: ProtocolConfig.Builder.() -> Unit) = apply { - protocolConfigBuilder = ProtocolConfig.Builder(blockingMode).apply(block) - } + override var mtu: Int = WIREGUARD_DEFAULT_MTU fun setEndpoint(endpoint: InetEndpoint) = apply { this.endpoint = endpoint } @@ -71,7 +66,7 @@ open class WireguardConfig protected constructor( fun setPrivateKeyHex(privateKeyHex: String) = apply { this.privateKeyHex = privateKeyHex } - fun build(): WireguardConfig = WireguardConfig(this) + override fun build(): WireguardConfig = WireguardConfig(this) } companion object { From 51d4aea9e2453d7280281b95f188bf132fffc46d Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 28 Nov 2023 20:07:39 +0300 Subject: [PATCH 074/144] Add OpenVpn module --- client/android/build.gradle.kts | 1 + client/android/openvpn/build.gradle.kts | 18 + .../net/openvpn/ovpn3/ClientAPI_Config.java | 18 +- .../ovpn3/ClientAPI_ConnectionInfo.java | 18 +- .../ovpn3/ClientAPI_DynamicChallenge.java | 18 +- .../openvpn/ovpn3/ClientAPI_EvalConfig.java | 18 +- .../net/openvpn/ovpn3/ClientAPI_Event.java | 18 +- .../ovpn3/ClientAPI_ExternalPKIBase.java | 18 +- .../ClientAPI_ExternalPKICertRequest.java | 18 +- .../ClientAPI_ExternalPKIRequestBase.java | 18 +- .../ClientAPI_ExternalPKISignRequest.java | 18 +- .../ovpn3/ClientAPI_InterfaceStats.java | 18 +- .../net/openvpn/ovpn3/ClientAPI_KeyValue.java | 18 +- .../net/openvpn/ovpn3/ClientAPI_LLVector.java | 18 +- .../net/openvpn/ovpn3/ClientAPI_LogInfo.java | 18 +- .../openvpn/ovpn3/ClientAPI_MergeConfig.java | 18 +- .../ovpn3/ClientAPI_OpenVPNClient.java | 18 +- .../ovpn3/ClientAPI_OpenVPNClientHelper.java | 18 +- .../openvpn/ovpn3/ClientAPI_ProvideCreds.java | 18 +- .../ovpn3/ClientAPI_RemoteOverride.java | 18 +- .../openvpn/ovpn3/ClientAPI_ServerEntry.java | 18 +- .../ovpn3/ClientAPI_ServerEntryVector.java | 18 +- .../openvpn/ovpn3/ClientAPI_SessionToken.java | 18 +- .../net/openvpn/ovpn3/ClientAPI_Status.java | 18 +- .../openvpn/ovpn3/ClientAPI_StringVec.java | 18 +- .../ovpn3/ClientAPI_TransportStats.java | 18 +- .../ovpn3/ClientAPI_TunBuilderBase.java | 18 +- .../openvpn/ovpn3/SWIGTYPE_p_std__string.java | 10 +- ...ectorT_openvpn__ClientAPI__KeyValue_t.java | 10 +- .../main/java}/net/openvpn/ovpn3/ovpncli.java | 6 +- .../java}/net/openvpn/ovpn3/ovpncliJNI.java | 6 +- .../amnezia/vpn/protocol/openvpn/OpenVpn.kt | 106 +++++ .../vpn/protocol/openvpn/OpenVpnClient.kt | 418 ++++++++++++++++++ .../vpn/protocol/openvpn/OpenVpnConfig.kt | 20 + client/android/settings.gradle.kts | 1 + .../src/org/amnezia/vpn/AmneziaVpnService.kt | 1 + .../src/org/amnezia/vpn/OpenVPNThreadv3.kt | 259 ----------- 37 files changed, 960 insertions(+), 346 deletions(-) create mode 100644 client/android/openvpn/build.gradle.kts rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_Config.java (96%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java (89%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java (82%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_EvalConfig.java (92%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_Event.java (81%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java (72%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java (79%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java (82%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java (81%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java (85%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_KeyValue.java (78%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_LLVector.java (89%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_LogInfo.java (75%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_MergeConfig.java (84%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java (93%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java (84%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java (87%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java (83%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ServerEntry.java (77%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java (90%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_SessionToken.java (77%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_Status.java (79%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_StringVec.java (89%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_TransportStats.java (83%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java (92%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java (75%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java (75%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ovpncli.java (75%) rename client/android/{src => openvpn/src/main/java}/net/openvpn/ovpn3/ovpncliJNI.java (99%) create mode 100644 client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt create mode 100644 client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt create mode 100644 client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnConfig.kt delete mode 100644 client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 6dbf606f2..58f241afd 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -88,6 +88,7 @@ dependencies { implementation(project(":protocolApi")) implementation(project(":wireguard")) implementation(project(":awg")) + implementation(project(":openvpn")) implementation(libs.androidx.core) implementation(libs.androidx.activity) implementation(libs.androidx.security.crypto) diff --git a/client/android/openvpn/build.gradle.kts b/client/android/openvpn/build.gradle.kts new file mode 100644 index 000000000..5949faf21 --- /dev/null +++ b/client/android/openvpn/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.protocol.openvpn" +} + +dependencies { + compileOnly(project(":utils")) + compileOnly(project(":protocolApi")) + implementation(libs.kotlinx.coroutines) +} diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_Config.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Config.java similarity index 96% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_Config.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Config.java index c4abf8b86..4c69c51e1 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_Config.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Config.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_Config obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_Config obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java similarity index 89% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java index 267422312..17d548615 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ConnectionInfo.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_ConnectionInfo obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ConnectionInfo obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java similarity index 82% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java index 99d6d5693..0bebb47f2 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_DynamicChallenge.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_DynamicChallenge obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_DynamicChallenge obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_EvalConfig.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_EvalConfig.java similarity index 92% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_EvalConfig.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_EvalConfig.java index 790e85e35..be3928480 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_EvalConfig.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_EvalConfig.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_EvalConfig obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_EvalConfig obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_Event.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Event.java similarity index 81% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_Event.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Event.java index 80cfe99e2..cf7f578d7 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_Event.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Event.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_Event obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_Event obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java similarity index 72% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java index aa80ac77c..ee44c1d51 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKIBase.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_ExternalPKIBase obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ExternalPKIBase obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java similarity index 79% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java index decd5baf7..fe681ad85 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKICertRequest.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -20,6 +20,18 @@ protected static long getCPtr(ClientAPI_ExternalPKICertRequest obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ExternalPKICertRequest obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java similarity index 82% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java index 75a6072ee..65551a2cb 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKIRequestBase.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_ExternalPKIRequestBase obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ExternalPKIRequestBase obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java similarity index 81% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java index bd91e4f1b..a08ae14f7 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ExternalPKISignRequest.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -20,6 +20,18 @@ protected static long getCPtr(ClientAPI_ExternalPKISignRequest obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ExternalPKISignRequest obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java similarity index 85% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java index f486589fe..325fddcab 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_InterfaceStats.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_InterfaceStats obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_InterfaceStats obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_KeyValue.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_KeyValue.java similarity index 78% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_KeyValue.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_KeyValue.java index 055677be5..b0c67c713 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_KeyValue.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_KeyValue.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_KeyValue obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_KeyValue obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_LLVector.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_LLVector.java similarity index 89% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_LLVector.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_LLVector.java index c14433862..98be4f93b 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_LLVector.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_LLVector.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_LLVector obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_LLVector obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_LogInfo.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_LogInfo.java similarity index 75% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_LogInfo.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_LogInfo.java index 008aeb22e..ac18d1632 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_LogInfo.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_LogInfo.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_LogInfo obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_LogInfo obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_MergeConfig.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_MergeConfig.java similarity index 84% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_MergeConfig.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_MergeConfig.java index 74d37c772..f8994bfbb 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_MergeConfig.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_MergeConfig.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_MergeConfig obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_MergeConfig obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java similarity index 93% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java index 19701ab35..c37da49a1 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_OpenVPNClient.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -20,6 +20,18 @@ protected static long getCPtr(ClientAPI_OpenVPNClient obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_OpenVPNClient obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java similarity index 84% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java index 474888237..42345492b 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_OpenVPNClientHelper.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_OpenVPNClientHelper obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_OpenVPNClientHelper obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java similarity index 87% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java index f82a9c356..073f3034c 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ProvideCreds.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_ProvideCreds obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ProvideCreds obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java similarity index 83% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java index 80bdde672..754f3771f 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_RemoteOverride.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_RemoteOverride obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_RemoteOverride obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ServerEntry.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ServerEntry.java similarity index 77% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ServerEntry.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ServerEntry.java index f5f48f562..920b3bccd 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ServerEntry.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ServerEntry.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_ServerEntry obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ServerEntry obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java similarity index 90% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java index 3a899ca58..a4ded35f7 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_ServerEntryVector.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_ServerEntryVector obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_ServerEntryVector obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_SessionToken.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_SessionToken.java similarity index 77% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_SessionToken.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_SessionToken.java index ce2050c08..267f02420 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_SessionToken.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_SessionToken.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_SessionToken obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_SessionToken obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_Status.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Status.java similarity index 79% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_Status.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Status.java index 4c1389019..43070bb09 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_Status.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_Status.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_Status obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_Status obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_StringVec.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_StringVec.java similarity index 89% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_StringVec.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_StringVec.java index ad4bfe627..d2417430e 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_StringVec.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_StringVec.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_StringVec obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_StringVec obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_TransportStats.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_TransportStats.java similarity index 83% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_TransportStats.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_TransportStats.java index 6a2f37260..8441ad9c3 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_TransportStats.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_TransportStats.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_TransportStats obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_TransportStats obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java similarity index 92% rename from client/android/src/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java index 3c8358d6e..69fa2ba46 100644 --- a/client/android/src/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ClientAPI_TunBuilderBase.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -21,6 +21,18 @@ protected static long getCPtr(ClientAPI_TunBuilderBase obj) { return (obj == null) ? 0 : obj.swigCPtr; } + protected static long swigRelease(ClientAPI_TunBuilderBase obj) { + long ptr = 0; + if (obj != null) { + if (!obj.swigCMemOwn) + throw new RuntimeException("Cannot release ownership as memory is not owned"); + ptr = obj.swigCPtr; + obj.swigCMemOwn = false; + obj.delete(); + } + return ptr; + } + @SuppressWarnings("deprecation") protected void finalize() { delete(); diff --git a/client/android/src/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java similarity index 75% rename from client/android/src/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java index e49f58748..c5728d5ff 100644 --- a/client/android/src/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/SWIGTYPE_p_std__string.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -22,5 +22,9 @@ protected SWIGTYPE_p_std__string() { protected static long getCPtr(SWIGTYPE_p_std__string obj) { return (obj == null) ? 0 : obj.swigCPtr; } + + protected static long swigRelease(SWIGTYPE_p_std__string obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } } diff --git a/client/android/src/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java similarity index 75% rename from client/android/src/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java index 15ff7a0fc..0486219e6 100644 --- a/client/android/src/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ @@ -22,5 +22,9 @@ protected SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t() { protected static long getCPtr(SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t obj) { return (obj == null) ? 0 : obj.swigCPtr; } + + protected static long swigRelease(SWIGTYPE_p_std__vectorT_openvpn__ClientAPI__KeyValue_t obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } } diff --git a/client/android/src/net/openvpn/ovpn3/ovpncli.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ovpncli.java similarity index 75% rename from client/android/src/net/openvpn/ovpn3/ovpncli.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ovpncli.java index 944d22edd..f8ce59cf6 100644 --- a/client/android/src/net/openvpn/ovpn3/ovpncli.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ovpncli.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ diff --git a/client/android/src/net/openvpn/ovpn3/ovpncliJNI.java b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ovpncliJNI.java similarity index 99% rename from client/android/src/net/openvpn/ovpn3/ovpncliJNI.java rename to client/android/openvpn/src/main/java/net/openvpn/ovpn3/ovpncliJNI.java index 875629ea5..4630b60dc 100644 --- a/client/android/src/net/openvpn/ovpn3/ovpncliJNI.java +++ b/client/android/openvpn/src/main/java/net/openvpn/ovpn3/ovpncliJNI.java @@ -1,8 +1,8 @@ /* ---------------------------------------------------------------------------- - * This file was automatically generated by SWIG (http://www.swig.org). - * Version 4.0.1 + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 * - * Do not make changes to this file unless you know what you are doing--modify + * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt new file mode 100644 index 000000000..8cbb7922e --- /dev/null +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt @@ -0,0 +1,106 @@ +package org.amnezia.vpn.protocol.openvpn + +import android.content.Context +import android.net.VpnService.Builder +import kotlinx.coroutines.flow.MutableStateFlow +import net.openvpn.ovpn3.ClientAPI_Config +import org.amnezia.vpn.protocol.BadConfigException +import org.amnezia.vpn.protocol.Protocol +import org.amnezia.vpn.protocol.ProtocolState +import org.amnezia.vpn.protocol.Statistics +import org.amnezia.vpn.protocol.VpnStartException +import org.amnezia.vpn.util.NetworkUtils +import org.json.JSONObject + +/** + * Config Example: + * { + * "protocol": "openvpn", + * "description": "Server 1", + * "dns1": "1.1.1.1", + * "dns2": "1.0.0.1", + * "hostName": "100.100.100.0", + * "splitTunnelSites": [ + * ], + * "splitTunnelType": 0, + * "openvpn_config_data": { + * "config": "openVpnConfig" + * } + * } + */ + +class OpenVpn : Protocol() { + + private lateinit var context: Context + private var openVpnClient: OpenVpnClient? = null + + override val statistics: Statistics + get() { + openVpnClient?.let { client -> + val stats = client.transport_stats() + return Statistics.build { + setRxBytes(stats.bytesIn) + setTxBytes(stats.bytesOut) + } + } + return Statistics.EMPTY_STATISTICS + } + + override fun initialize(context: Context, state: MutableStateFlow) { + super.initialize(context, state) + loadSharedLibrary(context, "ovpn3") + this.context = context + } + + override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { + val configBuilder = OpenVpnConfig.Builder() + openVpnClient = OpenVpnClient( + configBuilder, + state, + { ipv6 -> NetworkUtils.getLocalNetworks(context, ipv6) }, + makeEstablish(configBuilder, vpnBuilder), + protect + ) + try { + parseConfig(config) + openVpnClient?.let { client -> + val status = client.connect() + if (status.error) { + throw VpnStartException("OpenVpn connect() error: ${status.status}: ${status.message}") + } + } + } catch (e: Exception) { + openVpnClient = null + throw e + } + } + + override fun stopVpn() { + openVpnClient?.stop() + openVpnClient = null + } + + private fun parseConfig(config: JSONObject) { + val openVpnConfig = ClientAPI_Config() + openVpnConfig.content = config.getJSONObject("openvpn_config_data").getString("config") + openVpnClient?.let { client -> + val evalConfig = client.eval_config(openVpnConfig) + if (evalConfig.error) { + throw BadConfigException("OpenVPN config parse error: ${evalConfig.message}") + } + } + } + + private fun makeEstablish(configBuilder: OpenVpnConfig.Builder, vpnBuilder: Builder): () -> Int = + { + val openVpnConfig = configBuilder.build() + buildVpnInterface(openVpnConfig, vpnBuilder) + + vpnBuilder.establish().use { tunFd -> + if (tunFd == null) { + throw VpnStartException("Create VPN interface: permission not granted or revoked") + } + return@use tunFd.detachFd() + } + } +} diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt new file mode 100644 index 000000000..a504adaaf --- /dev/null +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt @@ -0,0 +1,418 @@ +package org.amnezia.vpn.protocol.openvpn + +import android.net.ProxyInfo +import kotlinx.coroutines.flow.MutableStateFlow +import net.openvpn.ovpn3.ClientAPI_Config +import net.openvpn.ovpn3.ClientAPI_EvalConfig +import net.openvpn.ovpn3.ClientAPI_Event +import net.openvpn.ovpn3.ClientAPI_LogInfo +import net.openvpn.ovpn3.ClientAPI_OpenVPNClient +import net.openvpn.ovpn3.ClientAPI_Status +import net.openvpn.ovpn3.ClientAPI_StringVec +import net.openvpn.ovpn3.ClientAPI_TransportStats +import org.amnezia.vpn.protocol.ProtocolState +import org.amnezia.vpn.protocol.ProtocolState.CONNECTED +import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED +import org.amnezia.vpn.protocol.VpnStartException +import org.amnezia.vpn.util.InetNetwork +import org.amnezia.vpn.util.Log +import org.amnezia.vpn.util.parseInetAddress + +private const val TAG = "OpenVpnClient" +private const val EMULATED_EXCLUDE_ROUTES = (1 shl 16) + +class OpenVpnClient( + private val configBuilder: OpenVpnConfig.Builder, + private val state: MutableStateFlow, + private val getLocalNetworks: (Boolean) -> List, + private val establish: () -> Int, + private val protect: (Int) -> Boolean +) : ClientAPI_OpenVPNClient() { + + /************************************************************************** + * Tun builder callbacks + **************************************************************************/ + + // Tun builder methods, loosely based on the Android VpnService.Builder + // abstraction. These methods comprise an abstraction layer that + // allows the OpenVPN C++ core to call out to external methods for + // establishing the tunnel, adding routes, etc. + + // All methods returning bool use the return + // value to indicate success (true) or fail (false). + // tun_builder_new() should be called first, then arbitrary setter methods, + // and finally tun_builder_establish to return the socket descriptor + // for the session. IP addresses are pre-validated before being passed to + // these methods. + // This interface is based on Android's VpnService.Builder. + + // Callback to construct a new tun builder + // Should be called first. + override fun tun_builder_new(): Boolean { + Log.v(TAG, "tun_builder_new") + return true + } + + // Callback to set MTU of the VPN interface + // Never called more than once per tun_builder session. + override fun tun_builder_set_mtu(mtu: Int): Boolean { + Log.v(TAG, "tun_builder_set_mtu: $mtu") + configBuilder.setMtu(mtu) + return true + } + + // Callback to add network address to VPN interface + // May be called more than once per tun_builder session + override fun tun_builder_add_address( + address: String, prefix_length: Int, + gateway: String, ipv6: Boolean, net30: Boolean + ): Boolean { + Log.v(TAG, "tun_builder_add_address: $address, $prefix_length, $gateway, $ipv6, $net30") + configBuilder.addAddress(InetNetwork(address, prefix_length)) + return true + } + + // Callback to add route to VPN interface + // May be called more than once per tun_builder session + // metric is optional and should be ignored if < 0 + override fun tun_builder_add_route(address: String, prefix_length: Int, metric: Int, ipv6: Boolean): Boolean { + Log.v(TAG, "tun_builder_add_route: $address, $prefix_length, $metric, $ipv6") + if (address == "remote_host") return false + configBuilder.addRoute(InetNetwork(address, prefix_length)) + return true + } + + // Callback to exclude route from VPN interface + // May be called more than once per tun_builder session + // metric is optional and should be ignored if < 0 + override fun tun_builder_exclude_route(address: String, prefix_length: Int, metric: Int, ipv6: Boolean): Boolean { + Log.v(TAG, "tun_builder_exclude_route: $address, $prefix_length, $metric, $ipv6") + configBuilder.excludeRoute(InetNetwork(address, prefix_length)) + return true + } + + // Callback to add DNS server to VPN interface + // May be called more than once per tun_builder session + // If reroute_dns is true, all DNS traffic should be routed over the + // tunnel, while if false, only DNS traffic that matches an added search + // domain should be routed. + // Guaranteed to be called after tun_builder_reroute_gw. + override fun tun_builder_add_dns_server(address: String, ipv6: Boolean): Boolean { + Log.v(TAG, "tun_builder_add_dns_server: $address, $ipv6") + configBuilder.addDnsServer(parseInetAddress(address)) + return true + } + + // Optional callback that indicates whether traffic of a certain + // address family (AF_INET or AF_INET6) should be + // blocked or allowed, to prevent unencrypted packet leakage when + // the tunnel is IPv4-only/IPv6-only, but the local machine + // has connectivity with the other protocol to the internet. + // Controlled by "block-ipv6" and block-ipv6 config var. + // If addresses are added for a family this setting should be + // ignored for that family + // See also Android's VPNService.Builder.allowFamily method + /* override fun tun_builder_set_allow_family(af: Int, allow: Boolean): Boolean { + Log.v(TAG, "tun_builder_set_allow_family: $af, $allow") + return true + } */ + + // Callback to set address of remote server + // Never called more than once per tun_builder session. + override fun tun_builder_set_remote_address(address: String, ipv6: Boolean): Boolean { + Log.v(TAG, "tun_builder_set_remote_address: $address, $ipv6") + return true + } + + // Optional callback that indicates OSI layer, should be 2 or 3. + // Defaults to 3. + override fun tun_builder_set_layer(layer: Int): Boolean { + Log.v(TAG, "tun_builder_set_layer: $layer") + return layer == 3 + } + + // Callback to set the session name + // Never called more than once per tun_builder session. + override fun tun_builder_set_session_name(name: String): Boolean { + Log.v(TAG, "tun_builder_set_session_name: $name") + return true + } + + // Callback to establish the VPN tunnel, returning a file descriptor + // to the tunnel, which the caller will henceforth own. Returns -1 + // if the tunnel could not be established. + // Always called last after tun_builder session has been configured. + override fun tun_builder_establish(): Int { + Log.v(TAG, "tun_builder_establish") + return establish() + } + + // Callback to reroute default gateway to VPN interface. + // ipv4 is true if the default route to be added should be IPv4. + // ipv6 is true if the default route to be added should be IPv6. + // flags are defined in RGWFlags (rgwflags.hpp). + // Never called more than once per tun_builder session. + override fun tun_builder_reroute_gw(ipv4: Boolean, ipv6: Boolean, flags: Long): Boolean { + Log.v(TAG, "tun_builder_reroute_gw: $ipv4, $ipv6, $flags") + if ((flags and EMULATED_EXCLUDE_ROUTES.toLong()) != 0L) return true + if (ipv4) { + configBuilder.addRoute(InetNetwork("0.0.0.0", 0)) + } + if (ipv6) { + configBuilder.addRoute(InetNetwork("::", 0)) + } + return true + } + + // Callback to add search domain to DNS resolver + // May be called more than once per tun_builder session + // See tun_builder_add_dns_server above for description of + // reroute_dns parameter. + // Guaranteed to be called after tun_builder_reroute_gw. + override fun tun_builder_add_search_domain(domain: String): Boolean { + Log.v(TAG, "tun_builder_add_search_domain: $domain") + configBuilder.setSearchDomain(domain) + return true + } + + // Callback to set the HTTP proxy + // Never called more than once per tun_builder session. + override fun tun_builder_set_proxy_http(host: String, port: Int): Boolean { + Log.v(TAG, "tun_builder_set_proxy_http: $host, $port") + try { + configBuilder.setHttpProxy(ProxyInfo.buildDirectProxy(host, port)) + } catch (e: Exception) { + Log.e(TAG, "Could not set proxy: ${e.message}") + return false + } + return true + } + + // Callback to set the HTTPS proxy + // Never called more than once per tun_builder session. + override fun tun_builder_set_proxy_https(host: String, port: Int): Boolean { + Log.v(TAG, "tun_builder_set_proxy_https: $host, $port") + return false + } + + // When the exclude local network option is enabled this + // function is called to get a list of local networks so routes + // to exclude them from the VPN network are generated + // This should be a list of CIDR networks (e.g. 192.168.0.0/24) + override fun tun_builder_get_local_networks(ipv6: Boolean): ClientAPI_StringVec { + Log.v(TAG, "tun_builder_get_local_networks: $ipv6") + val networks = ClientAPI_StringVec() + for (address in getLocalNetworks(ipv6)) { + networks.add(address.toString()) + } + return networks + } + + // Optional callback to set default value for route metric. + // Guaranteed to be called before other methods that deal + // with routes such as tun_builder_add_route and + // tun_builder_reroute_gw. Route metric is ignored + // if < 0. + /* override fun tun_builder_set_route_metric_default(metric: Int): Boolean { + Log.v(TAG, "tun_builder_set_route_metric_default: $metric") + return super.tun_builder_set_route_metric_default(metric) + } */ + + // Callback to add a host which should bypass the proxy + // May be called more than once per tun_builder session + /* override fun tun_builder_add_proxy_bypass(bypass_host: String): Boolean { + Log.v(TAG, "tun_builder_add_proxy_bypass: $bypass_host") + return super.tun_builder_add_proxy_bypass(bypass_host) + } */ + + // Callback to set the proxy "Auto Config URL" + // Never called more than once per tun_builder session. + /* override fun tun_builder_set_proxy_auto_config_url(url: String): Boolean { + Log.v(TAG, "tun_builder_set_proxy_auto_config_url: $url") + return super.tun_builder_set_proxy_auto_config_url(url) + } */ + + // Callback to add Windows WINS server to VPN interface. + // WINS server addresses are always IPv4. + // May be called more than once per tun_builder session. + // Guaranteed to be called after tun_builder_reroute_gw. + /* override fun tun_builder_add_wins_server(address: String): Boolean { + Log.v(TAG, "tun_builder_add_wins_server: $address") + return super.tun_builder_add_wins_server(address) + } */ + + // Optional callback to set a DNS suffix on tun/tap adapter. + // Currently only implemented on Windows, where it will + // set the "Connection-specific DNS Suffix" property on + // the TAP driver. + /* override fun tun_builder_set_adapter_domain_suffix(name: String): Boolean { + Log.v(TAG, "tun_builder_set_adapter_domain_suffix: $name") + return super.tun_builder_set_adapter_domain_suffix(name) + } */ + + // Return true if tun interface may be persisted, i.e. rolled + // into a new session with properties untouched. This method + // is only called after all other tests of persistence + // allowability succeed, therefore it can veto persistence. + // If persistence is ultimately enabled, + // tun_builder_establish_lite() will be called. Otherwise, + // tun_builder_establish() will be called. + /* override fun tun_builder_persist(): Boolean { + Log.v(TAG, "tun_builder_persist") + return super.tun_builder_persist() + } */ + + // Indicates a reconnection with persisted tun state. + /* override fun tun_builder_establish_lite() { + Log.v(TAG, "tun_builder_establish_lite") + super.tun_builder_establish_lite() + } */ + + // Indicates that tunnel is being torn down. + // If disconnect == true, then the teardown is occurring + // prior to final disconnect. + /* override fun tun_builder_teardown(disconnect: Boolean) { + Log.v(TAG, "tun_builder_teardown: $disconnect") + super.tun_builder_teardown(disconnect) + } */ + + /************************************************************************** + * Connection control methods + **************************************************************************/ + + // Parse OpenVPN configuration file. + override fun eval_config(arg0: ClientAPI_Config): ClientAPI_EvalConfig { + Log.v(TAG, "eval_config") + return super.eval_config(arg0) + } + + // Primary VPN client connect method, doesn't return until disconnect. + // Should be called by a worker thread. This method will make callbacks + // to event() and log() functions. Make sure to call eval_config() + // and possibly provide_creds() as well before this function. + override fun connect(): ClientAPI_Status { + Log.v(TAG, "connect") + return super.connect() + } + + // Callback to "protect" a socket from being routed through the tunnel. + // Will be called from the thread executing connect(). + // The remote and ipv6 are the remote host this socket will connect to + override fun socket_protect(socket: Int, remote: String, ipv6: Boolean): Boolean { + Log.v(TAG, "socket_protect: $socket, $remote, $ipv6") + return protect(socket) + } + + // Stop the client. Only meaningful when connect() is running. + // May be called asynchronously from a different thread + // when connect() is running. + override fun stop() { + Log.v(TAG, "stop") + super.stop() + } + + // Pause the client -- useful to avoid continuous reconnection attempts + // when network is down. May be called from a different thread + // when connect() is running. + override fun pause(reason: String) { + Log.v(TAG, "pause: $reason") + super.pause(reason) + } + + // Resume the client after it has been paused. May be called from a + // different thread when connect() is running. + override fun resume() { + Log.v(TAG, "resume") + super.resume() + } + + // Do a disconnect/reconnect cycle n seconds from now. May be called + // from a different thread when connect() is running. + override fun reconnect(seconds: Int) { + Log.v(TAG, "reconnect") + super.reconnect(seconds) + } + + // When a connection is close to timeout, the core will call this + // method. If it returns false, the core will disconnect with a + // CONNECTION_TIMEOUT event. If true, the core will enter a PAUSE + // state. + override fun pause_on_connection_timeout(): Boolean { + Log.v(TAG, "pause_on_connection_timeout") + return false + } + + // Return information about the most recent connection. Should be called + // after an event of type "CONNECTED". + /* override fun connection_info(): ClientAPI_ConnectionInfo { + Log.v(TAG, "connection_info") + return super.connection_info() + } */ + + /************************************************************************** + * Status callbacks + **************************************************************************/ + + // Callback for delivering events during connect() call. + // Will be called from the thread executing connect(). + override fun event(event: ClientAPI_Event) { + val name = event.name + val info = event.info + Log.v(TAG, "OpenVpn event: $name: $info") + when (name) { + "COMPRESSION_ENABLED", "WARN" -> Log.w(TAG, "$name: $info") + "CONNECTED" -> state.value = CONNECTED + "DISCONNECTED" -> state.value = DISCONNECTED + "CONNECTION_TIMEOUT" -> { + Log.w(TAG, "$name: $info") + state.value = DISCONNECTED + // todo: test it + throw VpnStartException("Connection timeout") + } + } + if (event.error) Log.e(TAG, "OpenVpn ERROR: $name: $info") + if (event.fatal) Log.e(TAG, "OpenVpn FATAL: $name: $info") + } + + // Callback for logging. + // Will be called from the thread executing connect(). + override fun log(arg0: ClientAPI_LogInfo) { + arg0.text.dropLastWhile { it == '\n' }.let { + Log.d(TAG, "OpenVpnLog: $it") + } + } + + /************************************************************************** + * Stats methods + **************************************************************************/ + + // return transport stats only + override fun transport_stats(): ClientAPI_TransportStats { + Log.v(TAG, "transport_stats") + return super.transport_stats() + } + + // return a stats value, index should be >= 0 and < stats_n() + /* override fun stats_value(index: Int): Long { + Log.v(TAG, "stats_value: $index") + return super.stats_value(index) + } */ + + // return all stats in a bundle + /* override fun stats_bundle(): ClientAPI_LLVector { + Log.v(TAG, "stats_bundle") + return super.stats_bundle() + } */ + + // return tun stats only + /* override fun tun_stats(): ClientAPI_InterfaceStats { + Log.v(TAG, "tun_stats") + return super.tun_stats() + } */ + + // post control channel message + /* override fun post_cc_msg(msg: String) { + Log.v(TAG, "post_cc_msg: $msg") + super.post_cc_msg(msg) + } */ +} diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnConfig.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnConfig.kt new file mode 100644 index 000000000..36d8d93b1 --- /dev/null +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnConfig.kt @@ -0,0 +1,20 @@ +package org.amnezia.vpn.protocol.openvpn + +import org.amnezia.vpn.protocol.ProtocolConfig + +private const val OPENVPN_DEFAULT_MTU = 1500 + +class OpenVpnConfig private constructor( + protocolConfigBuilder: ProtocolConfig.Builder +) : ProtocolConfig(protocolConfigBuilder) { + + class Builder : ProtocolConfig.Builder(false) { + override var mtu: Int = OPENVPN_DEFAULT_MTU + + override fun build(): OpenVpnConfig = OpenVpnConfig(this) + } + + companion object { + inline fun build(block: Builder.() -> Unit): OpenVpnConfig = Builder().apply(block).build() + } +} diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 7f22efa28..8bfe25dae 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -34,6 +34,7 @@ include(":utils") include(":protocolApi") include(":wireguard") include(":awg") +include(":openvpn") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 13e0cb29c..b739ed490 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -313,6 +313,7 @@ class AmneziaVpnService : VpnService() { ?: when (protocolName) { "wireguard" -> Wireguard() "awg" -> Awg() + "openvpn" -> OpenVpn() else -> throw IllegalArgumentException("Failed to load $protocolName protocol") }.apply { initialize(applicationContext, protocolState) } diff --git a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt b/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt deleted file mode 100644 index f2496db17..000000000 --- a/client/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt +++ /dev/null @@ -1,259 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public -* License, v. 2.0. If a copy of the MPL was not distributed with this -* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.amnezia.vpn - -import android.content.Context -import android.content.Intent -import android.os.Build -import android.os.IBinder -import android.system.OsConstants -import java.io.File -// import com.wireguard.android.util.SharedLibraryLoader -// import com.wireguard.config.* -// import com.wireguard.crypto.Key -import org.json.JSONObject -import java.util.Base64 - -// import com.wireguard.config.* - -import net.openvpn.ovpn3.ClientAPI_Config -import net.openvpn.ovpn3.ClientAPI_EvalConfig -import net.openvpn.ovpn3.ClientAPI_Event -import net.openvpn.ovpn3.ClientAPI_ExternalPKICertRequest -import net.openvpn.ovpn3.ClientAPI_ExternalPKISignRequest -import net.openvpn.ovpn3.ClientAPI_LogInfo -import net.openvpn.ovpn3.ClientAPI_OpenVPNClient -import net.openvpn.ovpn3.ClientAPI_ProvideCreds -import net.openvpn.ovpn3.ClientAPI_Status -import net.openvpn.ovpn3.ClientAPI_TransportStats - - -import java.lang.StringBuilder - -class OpenVPNThreadv3(var service: AmneziaVpnService): ClientAPI_OpenVPNClient()/* , Runnable */ { - /* private val tag = "OpenVPNThreadv3" - private var mAlreadyInitialised = false - private var mService: AmneziaVpnService = service - - private var bytesInIndex = -1 - private var bytesOutIndex = -1 - - init { - findConfigIndices() - } - - private fun findConfigIndices() { - val n: Int = stats_n() - - for (i in 0 until n) { - val name: String = stats_name(i) - if (name == "BYTES_IN") bytesInIndex = i - if (name == "BYTES_OUT") bytesOutIndex = i - } - } - - fun getTotalRxBytes(): Long { - return stats_value(bytesInIndex) - } - - fun getTotalTxBytes(): Long { - return stats_value(bytesOutIndex) - } - - override fun reconnect(seconds :Int) { - Log.v(tag, "reconnect") - super.reconnect(seconds) - } - - - override fun run() { - - val config: ClientAPI_Config = ClientAPI_Config() - - val jsonVpnConfig = mService.getVpnConfig() - val ovpnConfig = jsonVpnConfig.getJSONObject("openvpn_config_data").getString("config") - val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType") - val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites") - - val resultingConfig = StringBuilder() - resultingConfig.append(ovpnConfig) - - if (jsonVpnConfig.getString("protocol") == "cloak") { - val cloakConfigJson: JSONObject = jsonVpnConfig.getJSONObject("cloak_config_data") - - if (cloakConfigJson.has("NumConn")) { - cloakConfigJson.put("NumConn", 1) - } - - if (cloakConfigJson.has("ProxyMethod")) { - cloakConfigJson.put("ProxyMethod", "openvpn") - } - - if (cloakConfigJson.has("port")) { - val portValue = cloakConfigJson.get("port") - cloakConfigJson.remove("port") - cloakConfigJson.put("RemotePort", portValue) - } - - if (cloakConfigJson.has("remote")) { - val hostValue = cloakConfigJson.get("remote") - cloakConfigJson.remove("remote") - cloakConfigJson.put("RemoteHost", hostValue) - } - - val cloakConfigData = jsonVpnConfig.getJSONObject("cloak_config_data").toString().toByteArray() - val cloakConfig = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - Base64.getEncoder().encodeToString(cloakConfigData) - } else { - android.util.Base64.encodeToString(cloakConfigData, android.util.Base64.DEFAULT) - } - - resultingConfig.append("\n\n") - resultingConfig.append(cloakConfig) - resultingConfig.append("\n\n") - - config.setUsePluggableTransports(true) - } - - config.content = resultingConfig.toString() - - eval_config(config) - - val status = connect() - - if (status.getError()) { - Log.i(tag, "connect() error: " + status.getError() + ": " + status.getMessage()) - } - } - - override fun log(arg0: ClientAPI_LogInfo){ - Log.i(tag, arg0.getText()) - } - - override fun event(event: ClientAPI_Event ) { - val eventName = event.getName() - when (eventName) { - "CONNECTED" -> mService.isUp = true - "DISCONNECTED" -> mService.isUp = false - } - Log.i(tag, eventName) - } - - override fun tun_builder_new(): Boolean { - return true - } - - override fun tun_builder_establish(): Int { - Log.v(tag, "tun_builder_establish") - val jsonVpnConfig = mService.getVpnConfig() - - val splitTunnelType = jsonVpnConfig.getInt("splitTunnelType") - val splitTunnelSites = jsonVpnConfig.getJSONArray("splitTunnelSites") - if (splitTunnelType == 1) { - for (i in 0 until splitTunnelSites.length()) { - val site = splitTunnelSites.getString(i) - val ipRange = IPRange(site) - mService.addRoute(ipRange.getFrom().getHostAddress(), ipRange.getPrefix()) - } - } - if (splitTunnelType == 2) { - val ipRangeSet = IPRangeSet.fromString("0.0.0.0/0") - ipRangeSet.remove(IPRange("127.0.0.0/8")) - for (i in 0 until splitTunnelSites.length()) { - val site = splitTunnelSites.getString(i) - ipRangeSet.remove(IPRange(site)) - } - ipRangeSet.subnets().forEach { - mService.addRoute(it.getFrom().getHostAddress(), it.getPrefix()) - Thread.sleep(10) - } - mService.addRoute("2000::", 3) - } - - return mService.establish()!!.detachFd() - } - - override fun tun_builder_add_address(address: String , prefix_length: Int , gateway: String , ipv6:Boolean , net30: Boolean ): Boolean { - Log.v(tag, "tun_builder_add_address") - mService.addAddress(address, prefix_length) - return true - } - - override fun tun_builder_add_route(address: String, prefix_length: Int, metric: Int, ipv6: Boolean): Boolean { - Log.v(tag, "tun_builder_add_route") - if (address.equals("remote_host")) - return false - - mService.addRoute(address, prefix_length); - return true - } - - override fun tun_builder_reroute_gw(ipv4: Boolean, ipv6: Boolean , flags: Long): Boolean { - Log.v(tag, "tun_builder_reroute_gw") - mService.addRoute("0.0.0.0", 0) - return true - } - - override fun tun_builder_exclude_route(address: String, prefix_length: Int, metric: Int, ipv6: Boolean): Boolean { - Log.v(tag, "tun_builder_exclude_route") - mService.addRoute(address, prefix_length); - return true - } - - override fun tun_builder_set_remote_address(address: String , ipv6: Boolean): Boolean { - mService.setMtu(1500) - return true - } - - override fun tun_builder_set_mtu(mtu: Int): Boolean { - Log.v(tag, "tun_builder_set_mtu") - mService.setMtu(mtu) - return true - } - - override fun tun_builder_add_dns_server(address: String , ipv6: Boolean): Boolean { - mService.addDNS(address) - return true - } - - override fun tun_builder_set_session_name(name: String ): Boolean { - Log.v(tag, "We should call this session: " + name) - mService.setSessionName(name) - return true - } - - override fun tun_builder_set_proxy_http(host: String, port: Int): Boolean { - return mService.addHttpProxy(host, port); - } - - override fun tun_builder_set_proxy_https(host: String , port: Int): Boolean { - Log.v(tag, "tun_builder_set_proxy_https") - return false - } - - override fun pause_on_connection_timeout(): Boolean { - Log.v(tag, "pause_on_connection_timeout") - return true - } - - override fun tun_builder_add_search_domain(domain: String ): Boolean { - mService.setDomain(domain); - return true - } - - override fun tun_builder_set_layer(layer: Int): Boolean { - return layer == 3 - } - - override fun socket_protect(socket: Int, remote: String, ipv6: Boolean): Boolean { - Log.v(tag, "socket_protect") - return mService.protect(socket); - - } - - override fun stop() { - super.stop() - } */ -} From eaa209bc3ab6060758bbba18a210691268784766 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 28 Nov 2023 22:27:00 +0300 Subject: [PATCH 075/144] Add OpenVpn over Cloak module --- client/android/build.gradle.kts | 1 + client/android/cloak/build.gradle.kts | 18 +++++ client/android/cloak/src/main/kotlin/Cloak.kt | 70 +++++++++++++++++++ .../amnezia/vpn/protocol/openvpn/OpenVpn.kt | 25 ++++--- .../protocolApi/src/main/kotlin/Exceptions.kt | 2 +- client/android/settings.gradle.kts | 1 + .../src/org/amnezia/vpn/AmneziaVpnService.kt | 9 +-- 7 files changed, 110 insertions(+), 16 deletions(-) create mode 100644 client/android/cloak/build.gradle.kts create mode 100644 client/android/cloak/src/main/kotlin/Cloak.kt diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 58f241afd..ee6e8e27c 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -89,6 +89,7 @@ dependencies { implementation(project(":wireguard")) implementation(project(":awg")) implementation(project(":openvpn")) + implementation(project(":cloak")) implementation(libs.androidx.core) implementation(libs.androidx.activity) implementation(libs.androidx.security.crypto) diff --git a/client/android/cloak/build.gradle.kts b/client/android/cloak/build.gradle.kts new file mode 100644 index 000000000..99f1264aa --- /dev/null +++ b/client/android/cloak/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.protocol.cloak" +} + +dependencies { + compileOnly(project(":utils")) + compileOnly(project(":protocolApi")) + implementation(project(":openvpn")) +} diff --git a/client/android/cloak/src/main/kotlin/Cloak.kt b/client/android/cloak/src/main/kotlin/Cloak.kt new file mode 100644 index 000000000..cb41f992a --- /dev/null +++ b/client/android/cloak/src/main/kotlin/Cloak.kt @@ -0,0 +1,70 @@ +package org.amnezia.vpn.protocol.cloak + +import android.util.Base64 +import net.openvpn.ovpn3.ClientAPI_Config +import org.amnezia.vpn.protocol.openvpn.OpenVpn +import org.json.JSONObject + +/** + * Config Example: + * { + * "protocol": "cloak", + * "description": "Server 1", + * "dns1": "1.1.1.1", + * "dns2": "1.0.0.1", + * "hostName": "100.100.100.0", + * "splitTunnelSites": [ + * ], + * "splitTunnelType": 0, + * "openvpn_config_data": { + * "config": "openVpnConfig" + * } + * "cloak_config_data": { + * "BrowserSig": "chrome", + * "EncryptionMethod": "aes-gcm", + * "NumConn": 1, + * "ProxyMethod": "openvpn", + * "PublicKey": "PublicKey=", + * "RemoteHost": "100.100.100.0", + * "RemotePort": "443", + * "ServerName": "servername", + * "StreamTimeout": 300, + * "Transport": "direct", + * "UID": "UID=" + * } + * } + */ + +class Cloak : OpenVpn() { + + override fun parseConfig(config: JSONObject): ClientAPI_Config { + val openVpnConfig = ClientAPI_Config() + + val openVpnConfigStr = config.getJSONObject("openvpn_config_data").getString("config") + val cloakConfigJson = checkCloakJson(config.getJSONObject("cloak_config_data")) + val cloakConfigStr = Base64.encodeToString(cloakConfigJson.toString().toByteArray(), Base64.DEFAULT) + + val configStr = "$openVpnConfigStr\n\n$cloakConfigStr\n\n" + + openVpnConfig.usePluggableTransports = true + openVpnConfig.content = configStr + return openVpnConfig + } + + private fun checkCloakJson(cloakConfigJson: JSONObject): JSONObject { + // todo: strange method + if (!cloakConfigJson.has("NumConn")) cloakConfigJson.put("NumConn", 1) + if (!cloakConfigJson.has("ProxyMethod")) cloakConfigJson.put("ProxyMethod", "openvpn") + if (cloakConfigJson.has("port")) { + val port = cloakConfigJson["port"] + cloakConfigJson.remove("port") + cloakConfigJson.put("RemotePort", port) + } + if (cloakConfigJson.has("remote")) { + val remote = cloakConfigJson["remote"] + cloakConfigJson.remove("remote") + cloakConfigJson.put("RemoteHost", remote) + } + return cloakConfigJson + } +} diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt index 8cbb7922e..d22625b58 100644 --- a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt @@ -8,6 +8,7 @@ import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.Protocol import org.amnezia.vpn.protocol.ProtocolState import org.amnezia.vpn.protocol.Statistics +import org.amnezia.vpn.protocol.VpnException import org.amnezia.vpn.protocol.VpnStartException import org.amnezia.vpn.util.NetworkUtils import org.json.JSONObject @@ -29,10 +30,10 @@ import org.json.JSONObject * } */ -class OpenVpn : Protocol() { +open class OpenVpn : Protocol() { private lateinit var context: Context - private var openVpnClient: OpenVpnClient? = null + protected var openVpnClient: OpenVpnClient? = null override val statistics: Statistics get() { @@ -54,6 +55,7 @@ class OpenVpn : Protocol() { override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { val configBuilder = OpenVpnConfig.Builder() + openVpnClient = OpenVpnClient( configBuilder, state, @@ -61,12 +63,18 @@ class OpenVpn : Protocol() { makeEstablish(configBuilder, vpnBuilder), protect ) + try { - parseConfig(config) openVpnClient?.let { client -> + val openVpnConfig = parseConfig(config) + val evalConfig = client.eval_config(openVpnConfig) + if (evalConfig.error) { + throw BadConfigException("OpenVPN config parse error: ${evalConfig.message}") + } + val status = client.connect() if (status.error) { - throw VpnStartException("OpenVpn connect() error: ${status.status}: ${status.message}") + throw VpnException("OpenVpn connect() error: ${status.status}: ${status.message}") } } } catch (e: Exception) { @@ -80,15 +88,10 @@ class OpenVpn : Protocol() { openVpnClient = null } - private fun parseConfig(config: JSONObject) { + protected open fun parseConfig(config: JSONObject): ClientAPI_Config { val openVpnConfig = ClientAPI_Config() openVpnConfig.content = config.getJSONObject("openvpn_config_data").getString("config") - openVpnClient?.let { client -> - val evalConfig = client.eval_config(openVpnConfig) - if (evalConfig.error) { - throw BadConfigException("OpenVPN config parse error: ${evalConfig.message}") - } - } + return openVpnConfig } private fun makeEstablish(configBuilder: OpenVpnConfig.Builder, vpnBuilder: Builder): () -> Int = diff --git a/client/android/protocolApi/src/main/kotlin/Exceptions.kt b/client/android/protocolApi/src/main/kotlin/Exceptions.kt index 40fa965a9..739a327c2 100644 --- a/client/android/protocolApi/src/main/kotlin/Exceptions.kt +++ b/client/android/protocolApi/src/main/kotlin/Exceptions.kt @@ -3,7 +3,7 @@ package org.amnezia.vpn.protocol sealed class ProtocolException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) class LoadLibraryException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) -class VpnNotAuthorizedException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) class BadConfigException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) class VpnStartException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) +class VpnException(message: String? = null, cause: Throwable? = null) : ProtocolException(message, cause) diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 8bfe25dae..b947168ee 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -35,6 +35,7 @@ include(":protocolApi") include(":wireguard") include(":awg") include(":openvpn") +include(":cloak") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index b739ed490..2ae307f56 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -21,13 +21,10 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.cancel import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withTimeout import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.LoadLibraryException import org.amnezia.vpn.protocol.Protocol @@ -38,8 +35,10 @@ import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTING import org.amnezia.vpn.protocol.ProtocolState.UNKNOWN import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.Status +import org.amnezia.vpn.protocol.VpnException import org.amnezia.vpn.protocol.VpnStartException import org.amnezia.vpn.protocol.awg.Awg +import org.amnezia.vpn.protocol.cloak.Cloak import org.amnezia.vpn.protocol.openvpn.OpenVpn import org.amnezia.vpn.protocol.putStatistics import org.amnezia.vpn.protocol.putStatus @@ -83,7 +82,8 @@ class AmneziaVpnService : VpnService() { protocol = null when (e) { is IllegalArgumentException, - is VpnStartException -> onError(e.message ?: e.toString()) + is VpnStartException, + is VpnException -> onError(e.message ?: e.toString()) is JSONException, is BadConfigException -> onError("VPN config format error: ${e.message}") @@ -314,6 +314,7 @@ class AmneziaVpnService : VpnService() { "wireguard" -> Wireguard() "awg" -> Awg() "openvpn" -> OpenVpn() + "cloak" -> Cloak() else -> throw IllegalArgumentException("Failed to load $protocolName protocol") }.apply { initialize(applicationContext, protocolState) } From db602ac65bb6cb3b1bf028dbdfe54bb188165dd3 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 29 Nov 2023 10:57:47 +0700 Subject: [PATCH 076/144] fixed ss string generation --- client/ui/controllers/exportController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 048eadb02..4c084332a 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -230,7 +230,7 @@ void ExportController::generateShadowSocksConfig() .arg(configJson.value("method").toString(), configJson.value("password").toString(), configJson.value("server").toString(), configJson.value("server_port").toString()); - m_nativeConfigString = "ss://" + m_config.toUtf8().toBase64(); + m_nativeConfigString = "ss://" + m_nativeConfigString.toUtf8().toBase64(); qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_nativeConfigString.toUtf8(), qrcodegen::QrCode::Ecc::LOW); m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1))); From d7ec611ff4dcada4b40d4ef526f2841b33512d7b Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 29 Nov 2023 16:55:17 +0300 Subject: [PATCH 077/144] Fix bugs in awg and wireguard protocols --- client/android/awg/src/main/kotlin/AwgConfig.kt | 5 ++--- .../amnezia/vpn/protocol/wireguard/Wireguard.kt | 2 +- .../vpn/protocol/wireguard/WireguardConfig.kt | 14 +++++++++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/client/android/awg/src/main/kotlin/AwgConfig.kt b/client/android/awg/src/main/kotlin/AwgConfig.kt index e3554e60a..372747f2c 100644 --- a/client/android/awg/src/main/kotlin/AwgConfig.kt +++ b/client/android/awg/src/main/kotlin/AwgConfig.kt @@ -29,8 +29,8 @@ class AwgConfig private constructor( builder.h4 ) - override fun toWgUserspaceString(): String = with(StringBuilder()) { - append(super.toWgUserspaceString()) + override fun appendDeviceLine(sb: StringBuilder) = with(sb) { + super.appendDeviceLine(this) appendLine("jc=$jc") appendLine("jmin=$jmin") appendLine("jmax=$jmax") @@ -40,7 +40,6 @@ class AwgConfig private constructor( appendLine("h2=$h2") appendLine("h3=$h3") appendLine("h4=$h4") - return this.toString() } class Builder : WireguardConfig.Builder() { diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt index 8e1a58b04..25fcb2104 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -65,7 +65,7 @@ open class Wireguard : Protocol() { val config = GoBackend.wgGetConfig(tunnelHandle) ?: return Statistics.EMPTY_STATISTICS return Statistics.build { var optsCount = 0 - config.splitToSequence("\\n").forEach { line -> + config.splitToSequence("\n").forEach { line -> with(line) { when { startsWith("rx_bytes=") -> setRxBytes(substring(9).toLong()).also { ++optsCount } diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt index 86d6bf8a7..05dc45913 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt @@ -24,9 +24,18 @@ open class WireguardConfig protected constructor( builder.privateKeyHex ) - open fun toWgUserspaceString(): String = with(StringBuilder()) { - appendLine("private_key=$privateKeyHex") + fun toWgUserspaceString(): String = with(StringBuilder()) { + appendDeviceLine(this) appendLine("replace_peers=true") + appendPeerLine(this) + return this.toString() + } + + open fun appendDeviceLine(sb: StringBuilder) = with(sb) { + appendLine("private_key=$privateKeyHex") + } + + open fun appendPeerLine(sb: StringBuilder) = with(sb) { appendLine("public_key=$publicKeyHex") routes.forEach { route -> appendLine("allowed_ip=$route") @@ -35,7 +44,6 @@ open class WireguardConfig protected constructor( if (persistentKeepalive != 0) appendLine("persistent_keepalive_interval=$persistentKeepalive") appendLine("preshared_key=$preSharedKeyHex") - return this.toString() } open class Builder : ProtocolConfig.Builder(true) { From ef530780bdf03a47c88ef439c235383afd2fe1dd Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 29 Nov 2023 17:01:21 +0300 Subject: [PATCH 078/144] Fixes in AmneziaVpnService --- client/android/src/org/amnezia/vpn/AmneziaVpnService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 2ae307f56..cbf20123e 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -308,6 +308,7 @@ class AmneziaVpnService : VpnService() { } } + @MainThread private fun getProtocol(protocolName: String): Protocol = protocolCache[protocolName] ?: when (protocolName) { @@ -315,7 +316,7 @@ class AmneziaVpnService : VpnService() { "awg" -> Awg() "openvpn" -> OpenVpn() "cloak" -> Cloak() - else -> throw IllegalArgumentException("Failed to load $protocolName protocol") + else -> throw IllegalArgumentException("Protocol '$protocolName' not found") }.apply { initialize(applicationContext, protocolState) } /** From 20f3c0388a57a4fa1032c24c14d55929da3ce858 Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 29 Nov 2023 17:08:53 +0300 Subject: [PATCH 079/144] Add sending statistics --- .../src/org/amnezia/vpn/AmneziaVpnService.kt | 42 +++++++++++++++---- .../android/src/org/amnezia/vpn/IpcMessage.kt | 3 +- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index cbf20123e..23ed8204a 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -23,6 +23,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import org.amnezia.vpn.protocol.BadConfigException @@ -54,6 +55,7 @@ const val ERROR_MSG = "ERROR_MSG" const val AFTER_PERMISSION_CHECK = "AFTER_PERMISSION_CHECK" private const val PREFS_CONFIG_KEY = "LAST_CONF" private const val NOTIFICATION_ID = 1337 +private const val STATISTICS_SENDING_TIMEOUT = 1000L class AmneziaVpnService : VpnService() { @@ -75,6 +77,7 @@ class AmneziaVpnService : VpnService() { private var connectionJob: Job? = null private var disconnectionJob: Job? = null + private var statisticsSendingJob: Job? = null private lateinit var clientMessenger: IpcMessenger private val connectionExceptionHandler = CoroutineExceptionHandler { _, e -> @@ -123,14 +126,6 @@ class AmneziaVpnService : VpnService() { } } } - - Action.REQUEST_STATISTICS -> { - clientMessenger.send { - ServiceEvent.STATISTICS_UPDATE.packToMessage { - putStatistics(protocol?.statistics ?: Statistics.EMPTY_STATISTICS) - } - } - } } } } @@ -207,6 +202,7 @@ class AmneziaVpnService : VpnService() { Log.d(TAG, "onBind by $intent") if (intent?.action == "android.net.VpnService") return super.onBind(intent) isServiceBound = true + if (isConnected) launchSendingStatistics() return vpnServiceMessenger.binder } @@ -214,6 +210,7 @@ class AmneziaVpnService : VpnService() { Log.d(TAG, "onUnbind by $intent") if (intent?.action != "android.net.VpnService") { isServiceBound = false + stopSendingStatistics() clientMessenger.reset() if (isUnknown || isDisconnected) stopSelf() } @@ -247,19 +244,46 @@ class AmneziaVpnService : VpnService() { when (protocolState) { CONNECTED -> { clientMessenger.send(ServiceEvent.CONNECTED) + if (isServiceBound) launchSendingStatistics() } DISCONNECTED -> { clientMessenger.send(ServiceEvent.DISCONNECTED) + stopSendingStatistics() if (!isServiceBound) stopSelf() } - CONNECTING, DISCONNECTING, UNKNOWN -> {} + DISCONNECTING -> { + stopSendingStatistics() + } + + CONNECTING, UNKNOWN -> {} + } + } + } + } + + @MainThread + private fun launchSendingStatistics() { + if (isServiceBound && isConnected) { + statisticsSendingJob = mainScope.launch { + while (true) { + clientMessenger.send { + ServiceEvent.STATISTICS_UPDATE.packToMessage { + putStatistics(protocol?.statistics ?: Statistics.EMPTY_STATISTICS) + } + } + delay(STATISTICS_SENDING_TIMEOUT) } } } } + @MainThread + private fun stopSendingStatistics() { + statisticsSendingJob?.cancel() + } + @MainThread private fun connect(vpnConfig: String?) { Log.v(TAG, "Start VPN connection") diff --git a/client/android/src/org/amnezia/vpn/IpcMessage.kt b/client/android/src/org/amnezia/vpn/IpcMessage.kt index 206b47adb..c0183b45f 100644 --- a/client/android/src/org/amnezia/vpn/IpcMessage.kt +++ b/client/android/src/org/amnezia/vpn/IpcMessage.kt @@ -31,8 +31,7 @@ enum class Action : IpcMessage { REGISTER_CLIENT, CONNECT, DISCONNECT, - REQUEST_STATUS, - REQUEST_STATISTICS + REQUEST_STATUS } fun T.packToMessage(): Message From a672434909773f94efab736f92f182546f20beb1 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 30 Nov 2023 07:13:43 +0300 Subject: [PATCH 080/144] =?UTF-8?q?changed=20tasklist=20|=20findstr=20?= =?UTF-8?q?=D0=BD=D0=B0=20tasklist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/installer/config/controlscript.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/deploy/installer/config/controlscript.js b/deploy/installer/config/controlscript.js index 63831e01b..d0c826361 100644 --- a/deploy/installer/config/controlscript.js +++ b/deploy/installer/config/controlscript.js @@ -76,9 +76,7 @@ function raiseInstallerWindow() function appProcessIsRunning() { if (runningOnWindows()) { - var cmdArgs = ["| findstr " + appExecutableFileName()]; - var result = installer.execute("tasklist", cmdArgs); - + var result = installer.execute("tasklist"); if ( Number(result[1]) === 0 ) { if (result[0].indexOf(appExecutableFileName()) !== -1) { return true; From 3defb09da96dc15d3632c6a8269c85e47cab854a Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 30 Nov 2023 19:21:57 +0700 Subject: [PATCH 081/144] added a button to cancel installation if the package manager on the server is busy --- client/core/servercontroller.cpp | 6 +++--- client/core/servercontroller.h | 2 +- client/ui/controllers/installController.cpp | 3 +++ client/ui/controllers/installController.h | 1 + .../qml/Pages2/PageSetupWizardInstalling.qml | 19 +++++++++++++++++++ client/ui/qml/Pages2/PageSetupWizardStart.qml | 1 + client/ui/qml/Pages2/PageStart.qml | 1 + 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 398b46b34..5bc5e5198 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -634,9 +634,9 @@ QString ServerController::checkSshConnection(const ServerCredentials &credential return stdOut; } -void ServerController::setCancelInstallation(const bool cancel) +void ServerController::cancelInstallation() { - m_cancelInstallation = cancel; + m_cancelInstallation = true; } ErrorCode ServerController::setupServerFirewall(const ServerCredentials &credentials) @@ -737,6 +737,7 @@ ErrorCode ServerController::isUserInSudo(const ServerCredentials &credentials, D ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container) { + m_cancelInstallation = false; QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { stdOut += data + "\n"; @@ -784,7 +785,6 @@ ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credential watcher.setFuture(future); wait.exec(); - m_cancelInstallation = false; emit serverIsBusy(false); return future.result(); diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 3191386ca..6883274e8 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -56,7 +56,7 @@ class ServerController : public QObject QString checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode = nullptr); - void setCancelInstallation(const bool cancel); + void cancelInstallation(); ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey, const std::function &callback); diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 80e74764a..6e898a35b 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -130,6 +130,7 @@ void InstallController::installServer(DockerContainer container, QJsonObject &co { ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); QMap installedContainers; ErrorCode errorCode = @@ -181,6 +182,7 @@ void InstallController::installContainer(DockerContainer container, QJsonObject ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); QMap installedContainers; ErrorCode errorCode = serverController.getAlreadyInstalledContainers(serverCredentials, installedContainers); @@ -282,6 +284,7 @@ void InstallController::updateContainer(QJsonObject config) ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); auto errorCode = serverController.updateContainer(serverCredentials, container, oldContainerConfig, config); if (errorCode == ErrorCode::NoError) { diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index a5fd28753..cd0e6b22c 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -65,6 +65,7 @@ public slots: void passphraseRequestFinished(); void serverIsBusy(const bool isBusy); + void cancelInstallation(); void currentContainerUpdated(); diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index c82ce855e..391d408ff 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -19,6 +19,7 @@ PageType { property bool isTimerRunning: true property string progressBarText: qsTr("Usually it takes no more than 5 minutes") + property bool isCancelButtonVisible: false Connections { target: InstallController @@ -61,11 +62,13 @@ PageType { function onServerIsBusy(isBusy) { if (isBusy) { + root.isCancelButtonVisible = true root.progressBarText = qsTr("Amnezia has detected that your server is currently ") + qsTr("busy installing other software. Amnezia installation ") + qsTr("will pause until the server finishes installing other software") root.isTimerRunning = false } else { + root.isCancelButtonVisible = false root.progressBarText = qsTr("Usually it takes no more than 5 minutes") root.isTimerRunning = true } @@ -150,6 +153,22 @@ PageType { text: root.progressBarText } + + BasicButtonType { + id: cancelIntallationButton + + Layout.fillWidth: true + Layout.topMargin: 24 + + visible: root.isCancelButtonVisible + + text: qsTr("Cancel installation") + + onClicked: { + InstallController.cancelInstallation() + PageController.showBusyIndicator(true) + } + } } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardStart.qml b/client/ui/qml/Pages2/PageSetupWizardStart.qml index 994ec200b..2f89bc575 100644 --- a/client/ui/qml/Pages2/PageSetupWizardStart.qml +++ b/client/ui/qml/Pages2/PageSetupWizardStart.qml @@ -60,6 +60,7 @@ PageType { target: InstallController function onInstallationErrorOccurred(errorMessage) { + PageController.showBusyIndicator(false) PageController.showErrorMessage(errorMessage) var currentPageName = stackView.currentItem.objectName diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index ab02ace4e..c92bdb8f6 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -82,6 +82,7 @@ PageType { target: InstallController function onInstallationErrorOccurred(errorMessage) { + PageController.showBusyIndicator(false) PageController.showErrorMessage(errorMessage) var needCloseCurrentPage = false From e7658f9859e848ece54841e42878009b08d4c667 Mon Sep 17 00:00:00 2001 From: albexk Date: Fri, 1 Dec 2023 00:12:50 +0300 Subject: [PATCH 082/144] Add split tunneling --- client/android/awg/src/main/kotlin/Awg.kt | 1 + .../amnezia/vpn/protocol/openvpn/OpenVpn.kt | 16 ++- .../vpn/protocol/openvpn/OpenVpnClient.kt | 21 ++-- .../protocolApi/src/main/kotlin/Protocol.kt | 49 +++++++- .../src/main/kotlin/ProtocolConfig.kt | 10 +- .../utils/src/main/kotlin/NetworkUtils.kt | 87 ------------- .../utils/src/main/kotlin/net/InetEndpoint.kt | 17 +++ .../utils/src/main/kotlin/net/InetNetwork.kt | 26 ++++ .../utils/src/main/kotlin/net/IpAddress.kt | 85 +++++++++++++ .../utils/src/main/kotlin/net/IpRange.kt | 119 ++++++++++++++++++ .../utils/src/main/kotlin/net/IpRangeSet.kt | 26 ++++ .../utils/src/main/kotlin/net/NetworkUtils.kt | 46 +++++++ .../vpn/protocol/wireguard/Wireguard.kt | 21 +++- .../vpn/protocol/wireguard/WireguardConfig.kt | 2 +- 14 files changed, 422 insertions(+), 104 deletions(-) delete mode 100644 client/android/utils/src/main/kotlin/NetworkUtils.kt create mode 100644 client/android/utils/src/main/kotlin/net/InetEndpoint.kt create mode 100644 client/android/utils/src/main/kotlin/net/InetNetwork.kt create mode 100644 client/android/utils/src/main/kotlin/net/IpAddress.kt create mode 100644 client/android/utils/src/main/kotlin/net/IpRange.kt create mode 100644 client/android/utils/src/main/kotlin/net/IpRangeSet.kt create mode 100644 client/android/utils/src/main/kotlin/net/NetworkUtils.kt diff --git a/client/android/awg/src/main/kotlin/Awg.kt b/client/android/awg/src/main/kotlin/Awg.kt index 2d9a9b388..29b397054 100644 --- a/client/android/awg/src/main/kotlin/Awg.kt +++ b/client/android/awg/src/main/kotlin/Awg.kt @@ -65,6 +65,7 @@ class Awg : Wireguard() { val configData = parseConfigData(configDataJson.getString("config")) return AwgConfig.build { configWireguard(configData) + configSplitTunnel(config) configData["Jc"]?.let { setJc(it.toInt()) } configData["Jmin"]?.let { setJmin(it.toInt()) } configData["Jmax"]?.let { setJmax(it.toInt()) } diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt index d22625b58..a01e18423 100644 --- a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt @@ -2,6 +2,7 @@ package org.amnezia.vpn.protocol.openvpn import android.content.Context import android.net.VpnService.Builder +import android.os.Build import kotlinx.coroutines.flow.MutableStateFlow import net.openvpn.ovpn3.ClientAPI_Config import org.amnezia.vpn.protocol.BadConfigException @@ -10,7 +11,8 @@ import org.amnezia.vpn.protocol.ProtocolState import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.VpnException import org.amnezia.vpn.protocol.VpnStartException -import org.amnezia.vpn.util.NetworkUtils +import org.amnezia.vpn.util.net.InetNetwork +import org.amnezia.vpn.util.net.getLocalNetworks import org.json.JSONObject /** @@ -59,7 +61,7 @@ open class OpenVpn : Protocol() { openVpnClient = OpenVpnClient( configBuilder, state, - { ipv6 -> NetworkUtils.getLocalNetworks(context, ipv6) }, + { ipv6 -> getLocalNetworks(context, ipv6) }, makeEstablish(configBuilder, vpnBuilder), protect ) @@ -71,6 +73,16 @@ open class OpenVpn : Protocol() { if (evalConfig.error) { throw BadConfigException("OpenVPN config parse error: ${evalConfig.message}") } + configBuilder.apply { + // fix for split tunneling + // The exclude split tunneling OpenVpn configuration does not contain a default route. + // It is required for split tunneling in newer versions of Android. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + addRoute(InetNetwork("0.0.0.0", 0)) + addRoute(InetNetwork("::", 0)) + } + configSplitTunnel(config) + } val status = client.connect() if (status.error) { diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt index a504adaaf..17a06df65 100644 --- a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpnClient.kt @@ -1,6 +1,7 @@ package org.amnezia.vpn.protocol.openvpn import android.net.ProxyInfo +import android.os.Build import kotlinx.coroutines.flow.MutableStateFlow import net.openvpn.ovpn3.ClientAPI_Config import net.openvpn.ovpn3.ClientAPI_EvalConfig @@ -14,9 +15,9 @@ import org.amnezia.vpn.protocol.ProtocolState import org.amnezia.vpn.protocol.ProtocolState.CONNECTED import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED import org.amnezia.vpn.protocol.VpnStartException -import org.amnezia.vpn.util.InetNetwork import org.amnezia.vpn.util.Log -import org.amnezia.vpn.util.parseInetAddress +import org.amnezia.vpn.util.net.InetNetwork +import org.amnezia.vpn.util.net.parseInetAddress private const val TAG = "OpenVpnClient" private const val EMULATED_EXCLUDE_ROUTES = (1 shl 16) @@ -87,7 +88,9 @@ class OpenVpnClient( // metric is optional and should be ignored if < 0 override fun tun_builder_exclude_route(address: String, prefix_length: Int, metric: Int, ipv6: Boolean): Boolean { Log.v(TAG, "tun_builder_exclude_route: $address, $prefix_length, $metric, $ipv6") - configBuilder.excludeRoute(InetNetwork(address, prefix_length)) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + configBuilder.excludeRoute(InetNetwork(address, prefix_length)) + } return true } @@ -179,11 +182,13 @@ class OpenVpnClient( // Never called more than once per tun_builder session. override fun tun_builder_set_proxy_http(host: String, port: Int): Boolean { Log.v(TAG, "tun_builder_set_proxy_http: $host, $port") - try { - configBuilder.setHttpProxy(ProxyInfo.buildDirectProxy(host, port)) - } catch (e: Exception) { - Log.e(TAG, "Could not set proxy: ${e.message}") - return false + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + try { + configBuilder.setHttpProxy(ProxyInfo.buildDirectProxy(host, port)) + } catch (e: Exception) { + Log.e(TAG, "Could not set proxy: ${e.message}") + return false + } } return true } diff --git a/client/android/protocolApi/src/main/kotlin/Protocol.kt b/client/android/protocolApi/src/main/kotlin/Protocol.kt index 81c54d971..4b0fff471 100644 --- a/client/android/protocolApi/src/main/kotlin/Protocol.kt +++ b/client/android/protocolApi/src/main/kotlin/Protocol.kt @@ -12,14 +12,20 @@ import java.io.File import java.io.FileOutputStream import java.util.zip.ZipFile import kotlinx.coroutines.flow.MutableStateFlow -import org.amnezia.vpn.util.InetNetwork import org.amnezia.vpn.util.Log +import org.amnezia.vpn.util.net.InetNetwork +import org.amnezia.vpn.util.net.IpRange +import org.amnezia.vpn.util.net.IpRangeSet import org.json.JSONObject private const val TAG = "Protocol" const val VPN_SESSION_NAME = "AmneziaVPN" +private const val SPLIT_TUNNEL_DISABLE = 0 +private const val SPLIT_TUNNEL_INCLUDE = 1 +private const val SPLIT_TUNNEL_EXCLUDE = 2 + abstract class Protocol { abstract val statistics: Statistics @@ -33,6 +39,47 @@ abstract class Protocol { abstract fun stopVpn() + protected fun ProtocolConfig.Builder.configSplitTunnel(config: JSONObject) { + val splitTunnelType = config.optInt("splitTunnelType") + if (splitTunnelType == SPLIT_TUNNEL_DISABLE) return + val splitTunnelSites = config.getJSONArray("splitTunnelSites") + when (splitTunnelType) { + SPLIT_TUNNEL_INCLUDE -> { + // remove default routes, if any + removeRoute(InetNetwork("0.0.0.0", 0)) + removeRoute(InetNetwork("::", 0)) + // add routes from config + for (i in 0 until splitTunnelSites.length()) { + val address = InetNetwork.parse(splitTunnelSites.getString(i)) + addRoute(address) + } + } + + SPLIT_TUNNEL_EXCLUDE -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + // exclude routes from config + for (i in 0 until splitTunnelSites.length()) { + val address = InetNetwork.parse(splitTunnelSites.getString(i)) + excludeRoute(address) + } + } else { + // For older versions of Android, build a list of subnets without excluded addresses + val ipRangeSet = IpRangeSet() + ipRangeSet.remove(IpRange("127.0.0.0", 8)) + for (i in 0 until splitTunnelSites.length()) { + val address = InetNetwork.parse(splitTunnelSites.getString(i)) + ipRangeSet.remove(IpRange(address)) + } + // remove default routes, if any + removeRoute(InetNetwork("0.0.0.0", 0)) + removeRoute(InetNetwork("::", 0)) + ipRangeSet.subnets().forEach(::addRoute) + addRoute(InetNetwork("2000::", 3)) + } + } + } + } + protected open fun buildVpnInterface(config: ProtocolConfig, vpnBuilder: Builder) { vpnBuilder.setSession(VPN_SESSION_NAME) diff --git a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt index def77d812..df74206a4 100644 --- a/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt +++ b/client/android/protocolApi/src/main/kotlin/ProtocolConfig.kt @@ -1,8 +1,10 @@ package org.amnezia.vpn.protocol import android.net.ProxyInfo +import android.os.Build +import androidx.annotation.RequiresApi import java.net.InetAddress -import org.amnezia.vpn.util.InetNetwork +import org.amnezia.vpn.util.net.InetNetwork open class ProtocolConfig protected constructor( val addresses: Set, @@ -62,13 +64,19 @@ open class ProtocolConfig protected constructor( fun addRoute(route: InetNetwork) = apply { this.routes += route } fun addRoutes(routes: List) = apply { this.routes += routes } + fun removeRoute(route: InetNetwork) = apply { this.routes.remove(route) } + fun clearRoutes() = apply { this.routes.clear() } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun excludeRoute(route: InetNetwork) = apply { this.excludedRoutes += route } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun excludeRoutes(routes: List) = apply { this.excludedRoutes += routes } fun excludeApplication(application: String) = apply { this.excludedApplications += application } fun excludeApplications(applications: List) = apply { this.excludedApplications += applications } + @RequiresApi(Build.VERSION_CODES.Q) fun setHttpProxy(httpProxy: ProxyInfo) = apply { this.httpProxy = httpProxy } fun setAllowAllAF(allowAllAF: Boolean) = apply { this.allowAllAF = allowAllAF } diff --git a/client/android/utils/src/main/kotlin/NetworkUtils.kt b/client/android/utils/src/main/kotlin/NetworkUtils.kt deleted file mode 100644 index 1efb9da51..000000000 --- a/client/android/utils/src/main/kotlin/NetworkUtils.kt +++ /dev/null @@ -1,87 +0,0 @@ -package org.amnezia.vpn.util - -import android.content.Context -import android.net.ConnectivityManager -import android.net.InetAddresses -import android.net.NetworkCapabilities -import android.os.Build -import java.net.Inet4Address -import java.net.Inet6Address -import java.net.InetAddress - -object NetworkUtils { - - fun getLocalNetworks(context: Context, ipv6: Boolean): List { - val connectivityManager = context.getSystemService(ConnectivityManager::class.java) - connectivityManager.activeNetwork?.let { network -> - val netCapabilities = connectivityManager.getNetworkCapabilities(network) - val linkProperties = connectivityManager.getLinkProperties(network) - if (linkProperties == null || - netCapabilities == null || - netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || - netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) - ) return emptyList() - - val addresses = mutableListOf() - - for (linkAddress in linkProperties.linkAddresses) { - val address = linkAddress.address - if ((!ipv6 && address is Inet4Address) || (ipv6 && address is Inet6Address)) { - addresses += InetNetwork(address, linkAddress.prefixLength) - } - } - return addresses - } - return emptyList() - } -} - -data class InetNetwork(val address: InetAddress, val mask: Int) { - - constructor(address: String, mask: Int) : this(parseInetAddress(address), mask) - - constructor(address: InetAddress) : this(address, address.maxPrefixLength) - - constructor(address: String) : this(parseInetAddress(address)) - - override fun toString(): String = "${address.hostAddress}/$mask" - - companion object { - fun parse(data: String): InetNetwork { - val split = data.split("/") - val address = parseInetAddress(split.first()) - val mask = split.last().toInt() - return InetNetwork(address, mask) - } - - } -} - -data class InetEndpoint(val address: InetAddress, val port: Int) { - - override fun toString(): String = "${address.hostAddress}:$port" - - companion object { - fun parse(data: String): InetEndpoint { - val split = data.split(":") - val address = parseInetAddress(split.first()) - val port = split.last().toInt() - return InetEndpoint(address, port) - } - } -} - -private val InetAddress.maxPrefixLength: Int - get() = if (this is Inet4Address) 32 else 128 - -fun parseInetAddress(address: String): InetAddress = parseNumericAddressCompat(address) - -private val parseNumericAddressCompat: (String) -> InetAddress = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - InetAddresses::parseNumericAddress - } else { - val m = InetAddress::class.java.getMethod("parseNumericAddress", String::class.java) - fun(address: String): InetAddress { - return m.invoke(null, address) as InetAddress - } - } diff --git a/client/android/utils/src/main/kotlin/net/InetEndpoint.kt b/client/android/utils/src/main/kotlin/net/InetEndpoint.kt new file mode 100644 index 000000000..f131182c5 --- /dev/null +++ b/client/android/utils/src/main/kotlin/net/InetEndpoint.kt @@ -0,0 +1,17 @@ +package org.amnezia.vpn.util.net + +import java.net.InetAddress + +data class InetEndpoint(val address: InetAddress, val port: Int) { + + override fun toString(): String = "${address.hostAddress}:$port" + + companion object { + fun parse(data: String): InetEndpoint { + val split = data.split(":") + val address = parseInetAddress(split.first()) + val port = split.last().toInt() + return InetEndpoint(address, port) + } + } +} diff --git a/client/android/utils/src/main/kotlin/net/InetNetwork.kt b/client/android/utils/src/main/kotlin/net/InetNetwork.kt new file mode 100644 index 000000000..2285454be --- /dev/null +++ b/client/android/utils/src/main/kotlin/net/InetNetwork.kt @@ -0,0 +1,26 @@ +package org.amnezia.vpn.util.net + +import java.net.Inet4Address +import java.net.InetAddress + +data class InetNetwork(val address: InetAddress, val mask: Int) { + + constructor(address: String, mask: Int) : this(parseInetAddress(address), mask) + + constructor(address: InetAddress) : this(address, address.maxPrefixLength) + + override fun toString(): String = "${address.hostAddress}/$mask" + + companion object { + fun parse(data: String): InetNetwork { + val split = data.split("/") + val address = parseInetAddress(split.first()) + if (split.size == 1) return InetNetwork(address) + val mask = split.last().toInt() + return InetNetwork(address, mask) + } + } +} + +private val InetAddress.maxPrefixLength: Int + get() = if (this is Inet4Address) 32 else 128 diff --git a/client/android/utils/src/main/kotlin/net/IpAddress.kt b/client/android/utils/src/main/kotlin/net/IpAddress.kt new file mode 100644 index 000000000..83880b917 --- /dev/null +++ b/client/android/utils/src/main/kotlin/net/IpAddress.kt @@ -0,0 +1,85 @@ +package org.amnezia.vpn.util.net + +import java.net.InetAddress + +@OptIn(ExperimentalUnsignedTypes::class) +class IpAddress private constructor(private val address: UByteArray) : Comparable { + + val size: Int = address.size + val lastIndex: Int = address.lastIndex + val maxMask: Int = size * 8 + + constructor(inetAddress: InetAddress) : this(inetAddress.address.asUByteArray()) + + constructor(ipAddress: String) : this(parseInetAddress(ipAddress)) + + operator fun get(i: Int): UByte = address[i] + + operator fun set(i: Int, b: UByte) { address[i] = b } + + fun fill(value: UByte, fromByte: Int) = address.fill(value, fromByte) + + fun copy(): IpAddress = IpAddress(address.copyOf()) + + fun inc(): IpAddress { + if (address.all { it == 0xffu.toUByte() }) { + throw RuntimeException("IP address overflow") + } + val copy = copy() + for (i in copy.lastIndex downTo 0) { + if (++copy[i] != 0u.toUByte()) break + } + return copy + } + + fun dec(): IpAddress { + if (address.all { it == 0u.toUByte() }) { + throw RuntimeException("IP address overflow") + } + val copy = copy() + for (i in copy.lastIndex downTo 0) { + if (--copy[i] != 0xffu.toUByte()) break + } + return copy + } + + fun isMaxIp(): Boolean = address.all { it == 0xffu.toUByte() } + + override fun compareTo(other: IpAddress): Int { + if (size != other.size) return size - other.size + for (i in address.indices) { + val d = (address[i] - other.address[i]).toInt() + if (d != 0) return d + } + return 0 + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + other as IpAddress + return compareTo(other) == 0 + } + + override fun hashCode(): Int { + return address.hashCode() + } + + override fun toString(): String { + if (size > 4) return toIpv6String() + return address.joinToString(".") + } + + @OptIn(ExperimentalStdlibApi::class) + private fun toIpv6String(): String { + val sb = StringBuilder() + var i = 0 + while (i < size) { + sb.append(address[i++].toHexString()) + sb.append(address[i++].toHexString()) + sb.append(':') + } + sb.deleteAt(sb.lastIndex) + return sb.toString() + } +} diff --git a/client/android/utils/src/main/kotlin/net/IpRange.kt b/client/android/utils/src/main/kotlin/net/IpRange.kt new file mode 100644 index 000000000..834c762c0 --- /dev/null +++ b/client/android/utils/src/main/kotlin/net/IpRange.kt @@ -0,0 +1,119 @@ +package org.amnezia.vpn.util.net + +import java.net.InetAddress + +class IpRange(private val start: IpAddress, private val end: IpAddress) : Comparable { + + init { + if (start > end) throw IllegalArgumentException("Start IP: $start is greater then end IP: $end") + } + + private constructor(addresses: Pair) : this(addresses.first, addresses.second) + + constructor(inetAddress: InetAddress, mask: Int) : this(from(inetAddress, mask)) + + constructor(address: String, mask: Int) : this(parseInetAddress(address), mask) + + constructor(inetNetwork: InetNetwork) : this(from(inetNetwork)) + + private operator fun contains(other: IpRange): Boolean = + (start <= other.start) && (end >= other.end) + + private fun isIntersect(other: IpRange): Boolean = + (start <= other.end) && (end >= other.start) + + operator fun minus(other: IpRange): List? { + if (this in other) return emptyList() + if (!isIntersect(other)) return null + val resultRanges = mutableListOf() + if (start < other.start) resultRanges += IpRange(start, other.start.dec()) + if (end > other.end) resultRanges += IpRange(other.end.inc(), end) + return resultRanges + } + + fun subnets(): List { + var currentIp = start + var mask: Int + val subnets = mutableListOf() + while (currentIp <= end) { + mask = getPossibleMaxMask(currentIp) + var lastIp = getLastIpForMask(currentIp, mask) + while (lastIp > end) { + lastIp = getLastIpForMask(currentIp, ++mask) + } + subnets.add(InetNetwork(currentIp.toString(), mask)) + if (lastIp.isMaxIp()) break + currentIp = lastIp.inc() + } + return subnets + } + + private fun getPossibleMaxMask(ip: IpAddress): Int { + var mask = ip.maxMask + for (i in ip.lastIndex downTo 0) { + val lastZeroBits = ip[i].countTrailingZeroBits() + mask -= lastZeroBits + if (lastZeroBits != 8) break + } + return mask + } + + private fun getLastIpForMask(ip: IpAddress, mask: Int): IpAddress { + var remainingBits = ip.maxMask - mask + if (remainingBits == 0) return ip + var i = ip.lastIndex + val lastIp = ip.copy() + while (remainingBits > 0 && i >= 0) { + lastIp[i] = + if (remainingBits > 8) { + lastIp[i] or 0xffu + } else { + lastIp[i] or ((0xffu shl remainingBits).toUByte().inv()) + } + remainingBits -= 8 + --i + } + return lastIp + } + + override fun compareTo(other: IpRange): Int { + val d = start.compareTo(other.start) + return if (d == 0) end.compareTo(other.end) else d + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + other as IpRange + return compareTo(other) == 0 + } + + override fun hashCode(): Int { + var result = start.hashCode() + result = 31 * result + end.hashCode() + return result + } + + override fun toString(): String { + return "$start - $end" + } + + companion object { + private fun from(inetAddress: InetAddress, mask: Int): Pair { + val start = IpAddress(inetAddress) + val end = IpAddress(inetAddress) + val lastByte = mask / 8 + if (lastByte < start.size) { + val byteMask = (0xffu shl (8 - mask % 8)).toUByte() + start[lastByte] = start[lastByte].and(byteMask) + end[lastByte] = end[lastByte].or(byteMask.inv()) + start.fill(0u, lastByte + 1) + end.fill(0xffu, lastByte + 1) + } + return Pair(start, end) + } + + private fun from(inetNetwork: InetNetwork): Pair = + from(inetNetwork.address, inetNetwork.mask) + } +} diff --git a/client/android/utils/src/main/kotlin/net/IpRangeSet.kt b/client/android/utils/src/main/kotlin/net/IpRangeSet.kt new file mode 100644 index 000000000..45bae8544 --- /dev/null +++ b/client/android/utils/src/main/kotlin/net/IpRangeSet.kt @@ -0,0 +1,26 @@ +package org.amnezia.vpn.util.net + +class IpRangeSet(ipRange: IpRange = IpRange("0.0.0.0", 0)) { + + private val ranges = sortedSetOf(ipRange) + + fun remove(ipRange: IpRange) { + val iterator = ranges.iterator() + val splitRanges = mutableListOf() + while (iterator.hasNext()) { + val range = iterator.next() + (range - ipRange)?.let { resultRanges -> + iterator.remove() + splitRanges += resultRanges + } + } + ranges += splitRanges + } + + fun subnets(): List = + ranges.map(IpRange::subnets).flatten() + + override fun toString(): String { + return ranges.toString() + } +} diff --git a/client/android/utils/src/main/kotlin/net/NetworkUtils.kt b/client/android/utils/src/main/kotlin/net/NetworkUtils.kt new file mode 100644 index 000000000..83160e704 --- /dev/null +++ b/client/android/utils/src/main/kotlin/net/NetworkUtils.kt @@ -0,0 +1,46 @@ +package org.amnezia.vpn.util.net + +import android.content.Context +import android.net.ConnectivityManager +import android.net.InetAddresses +import android.net.NetworkCapabilities +import android.os.Build +import java.net.Inet4Address +import java.net.Inet6Address +import java.net.InetAddress + +fun getLocalNetworks(context: Context, ipv6: Boolean): List { + val connectivityManager = context.getSystemService(ConnectivityManager::class.java) + connectivityManager.activeNetwork?.let { network -> + val netCapabilities = connectivityManager.getNetworkCapabilities(network) + val linkProperties = connectivityManager.getLinkProperties(network) + if (linkProperties == null || + netCapabilities == null || + netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || + netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) + ) return emptyList() + + val addresses = mutableListOf() + + for (linkAddress in linkProperties.linkAddresses) { + val address = linkAddress.address + if ((!ipv6 && address is Inet4Address) || (ipv6 && address is Inet6Address)) { + addresses += InetNetwork(address, linkAddress.prefixLength) + } + } + return addresses + } + return emptyList() +} + +fun parseInetAddress(address: String): InetAddress = parseNumericAddressCompat(address) + +private val parseNumericAddressCompat: (String) -> InetAddress = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + InetAddresses::parseNumericAddress + } else { + val m = InetAddress::class.java.getMethod("parseNumericAddress", String::class.java) + fun(address: String): InetAddress { + return m.invoke(null, address) as InetAddress + } + } diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt index 25fcb2104..21423f385 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -11,10 +11,10 @@ import org.amnezia.vpn.protocol.ProtocolState.CONNECTED import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED import org.amnezia.vpn.protocol.Statistics import org.amnezia.vpn.protocol.VpnStartException -import org.amnezia.vpn.util.InetEndpoint -import org.amnezia.vpn.util.InetNetwork import org.amnezia.vpn.util.Log -import org.amnezia.vpn.util.parseInetAddress +import org.amnezia.vpn.util.net.InetEndpoint +import org.amnezia.vpn.util.net.InetNetwork +import org.amnezia.vpn.util.net.parseInetAddress import org.json.JSONObject /** @@ -92,7 +92,20 @@ open class Wireguard : Protocol() { protected open fun parseConfig(config: JSONObject): WireguardConfig { val configDataJson = config.getJSONObject("wireguard_config_data") val configData = parseConfigData(configDataJson.getString("config")) - return WireguardConfig.build { configWireguard(configData) } + return WireguardConfig.build { + configWireguard(configData) + // Default Wireguard routes (0.0.0.0/0, ::/0) will be removed, + // allowed routes from the Wireguard configuration will be merged + // with allowed routes from the split tunneling configuration. + // + // Excluded routes from the split tunneling configuration can overwrite + // allowed routes from the Wireguard configuration (two routes are equal + // if they have the same address and prefix). + // + // If multiple routes match the packet destination, + // route with the longest prefix takes precedence + configSplitTunnel(config) + } } protected fun WireguardConfig.Builder.configWireguard(configData: Map) { diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt index 05dc45913..1e74e6ff6 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt @@ -2,7 +2,7 @@ package org.amnezia.vpn.protocol.wireguard import android.util.Base64 import org.amnezia.vpn.protocol.ProtocolConfig -import org.amnezia.vpn.util.InetEndpoint +import org.amnezia.vpn.util.net.InetEndpoint private const val WIREGUARD_DEFAULT_MTU = 1280 From e619fd4af9584e3e36deb52e7dd78590f47b213a Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Fri, 1 Dec 2023 14:16:27 +0700 Subject: [PATCH 083/144] replaced loader with PageSetupWizardInstalling when updating container settings --- client/ui/controllers/connectionController.cpp | 2 ++ client/ui/qml/Pages2/PageProtocolAwgSettings.qml | 3 +-- client/ui/qml/Pages2/PageProtocolCloakSettings.qml | 5 +++-- client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml | 3 +-- client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml | 5 +++-- client/ui/qml/Pages2/PageStart.qml | 2 ++ 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 74438dcce..b8004d09b 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -110,6 +110,8 @@ void ConnectionController::onCurrentContainerUpdated() if (m_isConnected || m_isConnectionInProgress) { emit reconnectWithUpdatedContainer(tr("Settings updated successfully, Reconnnection...")); openConnection(); + } else { + emit reconnectWithUpdatedContainer(tr("Settings updated successfully")); } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 237a8b463..a4f5abe35 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -312,9 +312,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(AwgConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index 78e666a7e..98e9c28fd 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -4,6 +4,8 @@ import QtQuick.Layouts import SortFilterProxyModel 0.2 +import PageEnum 1.0 + import "./" import "../Controls2" import "../Controls2/TextTypes" @@ -160,9 +162,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(CloakConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 55cdcf047..971f9f39f 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -390,9 +390,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(OpenVpnConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 2453281fe..573aca060 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -4,6 +4,8 @@ import QtQuick.Layouts import SortFilterProxyModel 0.2 +import PageEnum 1.0 + import "./" import "../Controls2" import "../Controls2/TextTypes" @@ -138,9 +140,8 @@ PageType { onClicked: { forceActiveFocus() - PageController.showBusyIndicator(true) + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(ShadowSocksConfigModel.getConfig()) - PageController.showBusyIndicator(false) } } } diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index c92bdb8f6..3afdf73a3 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -100,6 +100,7 @@ PageType { function onUpdateContainerFinished(message) { PageController.showNotificationMessage(message) + PageController.closePage() } } @@ -108,6 +109,7 @@ PageType { function onReconnectWithUpdatedContainer(message) { PageController.showNotificationMessage(message) + PageController.closePage() } } From 1e64413904e61beccd0c1c475571de37462a3775 Mon Sep 17 00:00:00 2001 From: albexk Date: Mon, 4 Dec 2023 18:23:08 +0300 Subject: [PATCH 084/144] Fix disconnect bug --- .../amnezia/vpn/protocol/openvpn/OpenVpn.kt | 15 ++++++--- .../src/org/amnezia/vpn/AmneziaVpnService.kt | 17 ++++++---- client/protocols/android_vpnprotocol.cpp | 9 ++--- client/protocols/android_vpnprotocol.h | 6 +--- client/vpnconnection.cpp | 33 ++++++++----------- client/vpnconnection.h | 3 +- 6 files changed, 40 insertions(+), 43 deletions(-) diff --git a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt index a01e18423..cf55aebc9 100644 --- a/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt +++ b/client/android/openvpn/src/main/kotlin/org/amnezia/vpn/protocol/openvpn/OpenVpn.kt @@ -3,7 +3,10 @@ package org.amnezia.vpn.protocol.openvpn import android.content.Context import android.net.VpnService.Builder import android.os.Build +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch import net.openvpn.ovpn3.ClientAPI_Config import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.Protocol @@ -35,7 +38,8 @@ import org.json.JSONObject open class OpenVpn : Protocol() { private lateinit var context: Context - protected var openVpnClient: OpenVpnClient? = null + private var openVpnClient: OpenVpnClient? = null + private lateinit var scope: CoroutineScope override val statistics: Statistics get() { @@ -53,6 +57,7 @@ open class OpenVpn : Protocol() { super.initialize(context, state) loadSharedLibrary(context, "ovpn3") this.context = context + scope = CoroutineScope(Dispatchers.IO) } override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { @@ -84,9 +89,11 @@ open class OpenVpn : Protocol() { configSplitTunnel(config) } - val status = client.connect() - if (status.error) { - throw VpnException("OpenVpn connect() error: ${status.status}: ${status.message}") + scope.launch { + val status = client.connect() + if (status.error) { + throw VpnException("OpenVpn connect() error: ${status.status}: ${status.message}") + } } } } catch (e: Exception) { diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 23ed8204a..3624d9775 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -22,10 +22,11 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel -import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeoutOrNull import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.LoadLibraryException import org.amnezia.vpn.protocol.Protocol @@ -56,6 +57,7 @@ const val AFTER_PERMISSION_CHECK = "AFTER_PERMISSION_CHECK" private const val PREFS_CONFIG_KEY = "LAST_CONF" private const val NOTIFICATION_ID = 1337 private const val STATISTICS_SENDING_TIMEOUT = 1000L +private const val DISCONNECT_TIMEOUT = 1500L class AmneziaVpnService : VpnService() { @@ -227,8 +229,12 @@ class AmneziaVpnService : VpnService() { override fun onDestroy() { Log.v(TAG, "Destroy service") - // todo: add sync disconnect - disconnect() + runBlocking { + withTimeoutOrNull(DISCONNECT_TIMEOUT) { + disconnect() + disconnectionJob?.join() + } + } connectionScope.cancel() mainScope.cancel() super.onDestroy() @@ -322,9 +328,7 @@ class AmneziaVpnService : VpnService() { protocolState.value = DISCONNECTING disconnectionJob = connectionScope.launch { - connectionJob?.let { - if (it.isActive) it.cancelAndJoin() - } + connectionJob?.join() connectionJob = null protocol?.stopVpn() @@ -342,6 +346,7 @@ class AmneziaVpnService : VpnService() { "cloak" -> Cloak() else -> throw IllegalArgumentException("Protocol '$protocolName' not found") }.apply { initialize(applicationContext, protocolState) } + .also { protocolCache[protocolName] = it } /** * Utils methods diff --git a/client/protocols/android_vpnprotocol.cpp b/client/protocols/android_vpnprotocol.cpp index 2c09dd8e9..313a37499 100644 --- a/client/protocols/android_vpnprotocol.cpp +++ b/client/protocols/android_vpnprotocol.cpp @@ -3,7 +3,7 @@ #include "platforms/android/android_controller.h" -AndroidVpnProtocol::AndroidVpnProtocol(Proto protocol, const QJsonObject &configuration, QObject* parent) +AndroidVpnProtocol::AndroidVpnProtocol(const QJsonObject &configuration, QObject* parent) : VpnProtocol(configuration, parent) { } @@ -16,11 +16,6 @@ ErrorCode AndroidVpnProtocol::start() void AndroidVpnProtocol::stop() { qDebug() << "AndroidVpnProtocol::stop()"; + setConnectionState(Vpn::ConnectionState::Disconnecting); AndroidController::instance()->stop(); } - -void AndroidVpnProtocol::connectionDataUpdated(quint64 rxBytes, quint64 txBytes) -{ - setBytesChanged(rxBytes, txBytes); -} - diff --git a/client/protocols/android_vpnprotocol.h b/client/protocols/android_vpnprotocol.h index 9d4e26cd0..fcf85de79 100644 --- a/client/protocols/android_vpnprotocol.h +++ b/client/protocols/android_vpnprotocol.h @@ -10,15 +10,11 @@ class AndroidVpnProtocol : public VpnProtocol Q_OBJECT public: - explicit AndroidVpnProtocol(Proto protocol, const QJsonObject& configuration, QObject* parent = nullptr); + explicit AndroidVpnProtocol(const QJsonObject& configuration, QObject* parent = nullptr); ~AndroidVpnProtocol() override = default; ErrorCode start() override; void stop() override; - -public slots: - void connectionDataUpdated(quint64 rxBytes, quint64 txBytes); - }; #endif // ANDROID_VPNPROTOCOL_H diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 56f5c2b62..f8c2d3540 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -19,7 +19,7 @@ #endif #ifdef Q_OS_ANDROID - #include "../../platforms/android/android_controller.h" + #include "platforms/android/android_controller.h" #endif #ifdef Q_OS_IOS @@ -339,8 +339,8 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede } m_vpnProtocol->prepare(); #elif defined Q_OS_ANDROID - androidVpnProtocol = createDefaultAndroidVpnProtocol(container); - createAndroidConnections(container); + androidVpnProtocol = createDefaultAndroidVpnProtocol(); + createAndroidConnections(); m_vpnProtocol.reset(androidVpnProtocol); #elif defined Q_OS_IOS @@ -397,28 +397,17 @@ void VpnConnection::restoreConnection() void VpnConnection::createAndroidConnections() { - int serverIndex = m_settings->defaultServerIndex(); - DockerContainer container = m_settings->defaultContainer(serverIndex); - - createAndroidConnections(container); -} - -void VpnConnection::createAndroidConnections(DockerContainer container) -{ - androidVpnProtocol = createDefaultAndroidVpnProtocol(container); + androidVpnProtocol = createDefaultAndroidVpnProtocol(); connect(AndroidController::instance(), &AndroidController::connectionStateChanged, androidVpnProtocol, &AndroidVpnProtocol::setConnectionState); connect(AndroidController::instance(), &AndroidController::statisticsUpdated, androidVpnProtocol, - &AndroidVpnProtocol::connectionDataUpdated); + &AndroidVpnProtocol::setBytesChanged); } -AndroidVpnProtocol *VpnConnection::createDefaultAndroidVpnProtocol(DockerContainer container) +AndroidVpnProtocol *VpnConnection::createDefaultAndroidVpnProtocol() { - Proto proto = ContainerProps::defaultProtocol(container); - AndroidVpnProtocol *androidVpnProtocol = new AndroidVpnProtocol(proto, m_vpnConfiguration); - - return androidVpnProtocol; + return new AndroidVpnProtocol(m_vpnConfiguration); } #endif @@ -441,7 +430,13 @@ void VpnConnection::disconnectFromVpn() #endif #ifdef Q_OS_ANDROID - AndroidController::instance()->stop(); + if (m_vpnProtocol && m_vpnProtocol.data()) { + connect(AndroidController::instance(), &AndroidController::vpnDisconnected, this, + [this]() { + onConnectionStateChanged(Vpn::ConnectionState::Disconnected); + }, Qt::SingleShotConnection); + m_vpnProtocol.data()->stop(); + } #endif #ifdef Q_OS_IOS diff --git a/client/vpnconnection.h b/client/vpnconnection.h index 45582de51..fbdb4e82d 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -106,9 +106,8 @@ protected slots: #ifdef Q_OS_ANDROID AndroidVpnProtocol* androidVpnProtocol = nullptr; - AndroidVpnProtocol* createDefaultAndroidVpnProtocol(DockerContainer container); + AndroidVpnProtocol* createDefaultAndroidVpnProtocol(); void createAndroidConnections(); - void createAndroidConnections(DockerContainer container); #endif void createProtocolConnections(); From 8d43cee52e501739bfc7201bbcef56f739fb5d4c Mon Sep 17 00:00:00 2001 From: albexk Date: Mon, 4 Dec 2023 18:45:53 +0300 Subject: [PATCH 085/144] Remove shadowsocks code --- .../1000.json | 132 - .../3.json | 46 - client/android/shadowsocks/build.gradle | 68 - client/android/shadowsocks/gfwlist/gen.pl | 12 - client/android/shadowsocks/gfwlist/gen.py | 20 - client/android/shadowsocks/gfwlist/parse.py | 121 - client/android/shadowsocks/lint.xml | 7 - .../shadowsocks/src/main/AndroidManifest.xml | 131 - .../core/aidl/IShadowsocksService.aidl | 13 - .../aidl/IShadowsocksServiceCallback.aidl | 18 - .../shadowsocks/core/aidl/TrafficStats.aidl | 3 - .../src/main/assets/acl/bypass-china.acl | 10377 --------------- .../src/main/assets/acl/bypass-lan-china.acl | 10391 ---------------- .../src/main/assets/acl/bypass-lan.acl | 17 - .../src/main/assets/acl/china-list.acl | 5245 -------- .../src/main/assets/acl/gfwlist.acl | 5492 -------- .../vpn/shadowsocks/core/BootReceiver.kt | 51 - .../org/amnezia/vpn/shadowsocks/core/Core.kt | 159 - .../vpn/shadowsocks/core/VpnManager.kt | 148 - .../shadowsocks/core/VpnRequestActivity.kt | 75 - .../amnezia/vpn/shadowsocks/core/acl/Acl.kt | 180 - .../vpn/shadowsocks/core/acl/AclSyncer.kt | 38 - .../core/aidl/ShadowsocksConnection.kt | 153 - .../vpn/shadowsocks/core/aidl/TrafficStats.kt | 52 - .../vpn/shadowsocks/core/bg/BaseService.kt | 377 - .../vpn/shadowsocks/core/bg/Executable.kt | 54 - .../shadowsocks/core/bg/GuardedProcessPool.kt | 119 - .../shadowsocks/core/bg/LocalDnsService.kt | 70 - .../vpn/shadowsocks/core/bg/ProxyInstance.kt | 129 - .../vpn/shadowsocks/core/bg/ProxyService.kt | 42 - .../core/bg/ServiceNotification.kt | 145 - .../core/bg/ShadowsocksVpnService.kt | 256 - .../vpn/shadowsocks/core/bg/TrafficMonitor.kt | 82 - .../shadowsocks/core/bg/TransproxyService.kt | 75 - .../shadowsocks/core/database/KeyValuePair.kt | 128 - .../core/database/PrivateDatabase.kt | 69 - .../vpn/shadowsocks/core/database/Profile.kt | 330 - .../core/database/ProfileManager.kt | 140 - .../core/database/PublicDatabase.kt | 50 - .../migration/RecreateSchemaMigration.kt | 35 - .../shadowsocks/core/net/ChannelMonitor.kt | 128 - .../core/net/ConcurrentLocalSocketListener.kt | 42 - .../core/net/DefaultNetworkListener.kt | 154 - .../vpn/shadowsocks/core/net/HttpsTest.kt | 124 - .../shadowsocks/core/net/LocalDnsServer.kt | 171 - .../core/net/LocalSocketListener.kt | 80 - .../shadowsocks/core/net/Socks5Endpoint.kt | 123 - .../vpn/shadowsocks/core/net/Subnet.kt | 84 - .../vpn/shadowsocks/core/net/TcpFastOpen.kt | 65 - .../shadowsocks/core/plugin/NativePlugin.kt | 33 - .../vpn/shadowsocks/core/plugin/NoPlugin.kt | 9 - .../vpn/shadowsocks/core/plugin/Plugin.kt | 32 - .../core/plugin/PluginConfiguration.kt | 61 - .../shadowsocks/core/plugin/PluginManager.kt | 193 - .../shadowsocks/core/plugin/ResolvedPlugin.kt | 42 - .../shadowsocks/core/preference/DataStore.kt | 131 - .../OnPreferenceDataStoreChangeListener.kt | 27 - .../preference/RoomPreferenceDataStore.kt | 81 - .../shadowsocks/core/utils/ArrayIterator.kt | 51 - .../vpn/shadowsocks/core/utils/Commandline.kt | 173 - .../vpn/shadowsocks/core/utils/Constants.kt | 83 - .../core/utils/DeviceStorageApp.kt | 40 - .../vpn/shadowsocks/core/utils/DirectBoot.kt | 59 - .../vpn/shadowsocks/core/utils/Utils.kt | 95 - .../core/widget/NativePluginProvider.kt | 97 - .../shadowsocks/core/widget/PathProvider.kt | 53 - .../shadowsocks/core/widget/PluginContract.kt | 118 - .../shadowsocks/core/widget/PluginOptions.kt | 110 - .../main/res/drawable/ic_navigation_close.xml | 10 - .../main/res/layout/toolbar_light_dark.xml | 12 - .../src/main/res/raw/china_ip_list.txt | 5215 -------- .../shadowsocks/src/main/res/strings.xml | 160 - .../src/main/res/values/arrays.xml | 215 - .../src/main/res/values/colors.xml | 23 - .../src/main/res/values/strings.xml | 169 - .../src/main/res/values/styles.xml | 16 - .../src/main/res/xml/backup_descriptor.xml | 8 - .../src/main/res/xml/default_configs.xml | 7 - .../main/res/xml/network_security_config.xml | 4 - 79 files changed, 43348 deletions(-) delete mode 100644 client/android/schemas/com.github.shadowsocks.database.PrivateDatabase/1000.json delete mode 100644 client/android/schemas/com.github.shadowsocks.database.PublicDatabase/3.json delete mode 100644 client/android/shadowsocks/build.gradle delete mode 100644 client/android/shadowsocks/gfwlist/gen.pl delete mode 100644 client/android/shadowsocks/gfwlist/gen.py delete mode 100644 client/android/shadowsocks/gfwlist/parse.py delete mode 100644 client/android/shadowsocks/lint.xml delete mode 100644 client/android/shadowsocks/src/main/AndroidManifest.xml delete mode 100644 client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksService.aidl delete mode 100644 client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksServiceCallback.aidl delete mode 100644 client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.aidl delete mode 100644 client/android/shadowsocks/src/main/assets/acl/bypass-china.acl delete mode 100644 client/android/shadowsocks/src/main/assets/acl/bypass-lan-china.acl delete mode 100644 client/android/shadowsocks/src/main/assets/acl/bypass-lan.acl delete mode 100644 client/android/shadowsocks/src/main/assets/acl/china-list.acl delete mode 100644 client/android/shadowsocks/src/main/assets/acl/gfwlist.acl delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/BootReceiver.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/Core.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnManager.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnRequestActivity.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/Acl.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/AclSyncer.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/ShadowsocksConnection.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/BaseService.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/Executable.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/GuardedProcessPool.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/LocalDnsService.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyInstance.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyService.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ServiceNotification.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ShadowsocksVpnService.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TrafficMonitor.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TransproxyService.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/KeyValuePair.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PrivateDatabase.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/Profile.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/ProfileManager.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PublicDatabase.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/migration/RecreateSchemaMigration.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ChannelMonitor.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ConcurrentLocalSocketListener.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/DefaultNetworkListener.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/HttpsTest.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalDnsServer.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Socks5Endpoint.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Subnet.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/TcpFastOpen.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NativePlugin.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NoPlugin.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/Plugin.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginConfiguration.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginManager.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/ResolvedPlugin.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/DataStore.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/OnPreferenceDataStoreChangeListener.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/RoomPreferenceDataStore.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/ArrayIterator.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Commandline.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Constants.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DeviceStorageApp.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DirectBoot.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Utils.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/NativePluginProvider.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PathProvider.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginContract.kt delete mode 100644 client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginOptions.kt delete mode 100644 client/android/shadowsocks/src/main/res/drawable/ic_navigation_close.xml delete mode 100644 client/android/shadowsocks/src/main/res/layout/toolbar_light_dark.xml delete mode 100644 client/android/shadowsocks/src/main/res/raw/china_ip_list.txt delete mode 100644 client/android/shadowsocks/src/main/res/strings.xml delete mode 100644 client/android/shadowsocks/src/main/res/values/arrays.xml delete mode 100644 client/android/shadowsocks/src/main/res/values/colors.xml delete mode 100644 client/android/shadowsocks/src/main/res/values/strings.xml delete mode 100644 client/android/shadowsocks/src/main/res/values/styles.xml delete mode 100644 client/android/shadowsocks/src/main/res/xml/backup_descriptor.xml delete mode 100644 client/android/shadowsocks/src/main/res/xml/default_configs.xml delete mode 100644 client/android/shadowsocks/src/main/res/xml/network_security_config.xml diff --git a/client/android/schemas/com.github.shadowsocks.database.PrivateDatabase/1000.json b/client/android/schemas/com.github.shadowsocks.database.PrivateDatabase/1000.json deleted file mode 100644 index 34c047eb6..000000000 --- a/client/android/schemas/com.github.shadowsocks.database.PrivateDatabase/1000.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 1000, - "identityHash": "14b379f7776710b79b9d617090efe40e", - "entities": [ - { - "tableName": "Profile", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL)", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "host", - "columnName": "host", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "remotePort", - "columnName": "remotePort", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "password", - "columnName": "password", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "method", - "columnName": "method", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "remoteDns", - "columnName": "remoteDns", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "udpdns", - "columnName": "udpdns", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "ipv6", - "columnName": "ipv6", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "tx", - "columnName": "tx", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "rx", - "columnName": "rx", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "userOrder", - "columnName": "userOrder", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "id" - ], - "autoGenerate": true - }, - "indices": [], - "foreignKeys": [] - }, - { - "tableName": "KeyValuePair", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))", - "fields": [ - { - "fieldPath": "key", - "columnName": "key", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "valueType", - "columnName": "valueType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "value", - "columnName": "value", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "key" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - } - ], - "views": [], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '14b379f7776710b79b9d617090efe40e')" - ] - } -} \ No newline at end of file diff --git a/client/android/schemas/com.github.shadowsocks.database.PublicDatabase/3.json b/client/android/schemas/com.github.shadowsocks.database.PublicDatabase/3.json deleted file mode 100644 index ee987bb3c..000000000 --- a/client/android/schemas/com.github.shadowsocks.database.PublicDatabase/3.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 3, - "identityHash": "f1aab1fb633378621635c344dbc8ac7b", - "entities": [ - { - "tableName": "KeyValuePair", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))", - "fields": [ - { - "fieldPath": "key", - "columnName": "key", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "valueType", - "columnName": "valueType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "value", - "columnName": "value", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "key" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - } - ], - "views": [], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f1aab1fb633378621635c344dbc8ac7b')" - ] - } -} \ No newline at end of file diff --git a/client/android/shadowsocks/build.gradle b/client/android/shadowsocks/build.gradle deleted file mode 100644 index 9c05307b9..000000000 --- a/client/android/shadowsocks/build.gradle +++ /dev/null @@ -1,68 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-parcelize' -//apply plugin: 'com.novoda.bintray-release' - -android { - buildFeatures { - aidl true - androidResources true - } - - defaultConfig { - namespace "org.amnezia.vpn.shadowsocks.core" - versionCode 1 - versionName "1.0.0" - - javaCompileOptions { - annotationProcessorOptions { - arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] - } - } - } - sourceSets { - androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -//def lifecycleVersion = '2.0.0' -def roomVersion = "2.4.3" -//def preferencexVersion = '1.0.0' -dependencies { - - implementation 'androidx.lifecycle:lifecycle-common-java8:2.4.0' - - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.30-M1" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" - - implementation "androidx.core:core-ktx:1.2.0" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" - implementation "androidx.lifecycle:lifecycle-livedata-core-ktx:2.5.1" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" - implementation "androidx.room:room-runtime:$roomVersion" // runtime - implementation "androidx.preference:preference:1.1.0" - implementation "androidx.work:work-runtime-ktx:2.7.1" - implementation "androidx.browser:browser:1.3.0-alpha01" - implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "com.google.android.material:material:1.2.0-alpha05" - implementation "com.google.code.gson:gson:2.8.5" - - implementation "dnsjava:dnsjava:2.1.9" - implementation "com.github.kruton:jsocks:1.0.0" - implementation "com.afollestad.material-dialogs:core:2.6.0" -// api "com.takisoft.preferencex:preferencex:1.0.0" - implementation 'com.takisoft.preferencex:preferencex:1.1.0' - api 'com.github.kruton:jsocks:1.0.0' - - kapt "androidx.room:room-compiler:$roomVersion" - kapt "androidx.lifecycle:lifecycle-compiler:2.4.0" -} diff --git a/client/android/shadowsocks/gfwlist/gen.pl b/client/android/shadowsocks/gfwlist/gen.pl deleted file mode 100644 index a9f21976c..000000000 --- a/client/android/shadowsocks/gfwlist/gen.pl +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env perl -## ArchLinux install package via pacman: perl-net-cidr-lite -use strict; -use warnings; -use Net::CIDR::Lite; -my $cidr = Net::CIDR::Lite->new; -while (my $line=<>) { - $cidr->add($line); -} -foreach my $line( @{$cidr->list} ) { - print "$line\n"; -} diff --git a/client/android/shadowsocks/gfwlist/gen.py b/client/android/shadowsocks/gfwlist/gen.py deleted file mode 100644 index ddc250ad9..000000000 --- a/client/android/shadowsocks/gfwlist/gen.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf8 -*- - -import sys - -import IPy - - -def main(): - china_list_set = IPy.IPSet() - for line in sys.stdin: - china_list_set.add(IPy.IP(line)) - - # 输出结果 - for ip in china_list_set: - print '' + str(ip) + '' - - -if __name__ == "__main__": - main() diff --git a/client/android/shadowsocks/gfwlist/parse.py b/client/android/shadowsocks/gfwlist/parse.py deleted file mode 100644 index 976784f5e..000000000 --- a/client/android/shadowsocks/gfwlist/parse.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -import pkgutil -import urlparse -import socket -import logging -from argparse import ArgumentParser -from datetime import date - -__all__ = ['main'] - - -def parse_args(): - parser = ArgumentParser() - parser.add_argument('-i', '--input', dest='input', required=True, - help='path to gfwlist', metavar='GFWLIST') - parser.add_argument('-f', '--file', dest='output', required=True, - help='path to output acl', metavar='ACL') - return parser.parse_args() - - -def decode_gfwlist(content): - # decode base64 if have to - try: - return content.decode('base64') - except: - return content - - -def get_hostname(something): - try: - # quite enough for GFW - if not something.startswith('http:'): - something = 'http://' + something - r = urlparse.urlparse(something) - return r.hostname - except Exception as e: - logging.error(e) - return None - - -def add_domain_to_set(s, something): - hostname = get_hostname(something) - if hostname is not None: - if hostname.startswith('.'): - hostname = hostname.lstrip('.') - if hostname.endswith('/'): - hostname = hostname.rstrip('/') - if hostname: - s.add(hostname) - - -def parse_gfwlist(content): - gfwlist = content.splitlines(False) - domains = set() - for line in gfwlist: - if line.find('.*') >= 0: - continue - elif line.find('*') >= 0: - line = line.replace('*', '/') - if line.startswith('!'): - continue - elif line.startswith('['): - continue - elif line.startswith('@'): - # ignore white list - continue - elif line.startswith('||'): - add_domain_to_set(domains, line.lstrip('||')) - elif line.startswith('|'): - add_domain_to_set(domains, line.lstrip('|')) - elif line.startswith('.'): - add_domain_to_set(domains, line.lstrip('.')) - else: - add_domain_to_set(domains, line) - # TODO: reduce ['www.google.com', 'google.com'] to ['google.com'] - return domains - - -def generate_acl(domains): - header ="""# -# GFW list from https://github.com/gfwlist/gfwlist/blob/master/gfwlist.txt -# updated on DATE -# - -[bypass_all] - -[proxy_list] - -""" - header = header.replace('DATE', str(date.today())) - proxy_content = "" - ip_content = "" - - for domain in sorted(domains): - try: - socket.inet_aton(domain) - ip_content += (domain + "\n") - except socket.error: - domain = domain.replace('.', '\.') - proxy_content += ('(^|\.)' + domain + '$\n') - - proxy_content = header + ip_content + proxy_content - - return proxy_content - - -def main(): - args = parse_args() - with open(args.input, 'rb') as f: - content = f.read() - content = decode_gfwlist(content) - domains = parse_gfwlist(content) - acl_content = generate_acl(domains) - with open(args.output, 'wb') as f: - f.write(acl_content) - -if __name__ == '__main__': - main() - diff --git a/client/android/shadowsocks/lint.xml b/client/android/shadowsocks/lint.xml deleted file mode 100644 index f7d03623b..000000000 --- a/client/android/shadowsocks/lint.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/client/android/shadowsocks/src/main/AndroidManifest.xml b/client/android/shadowsocks/src/main/AndroidManifest.xml deleted file mode 100644 index b1c76391d..000000000 --- a/client/android/shadowsocks/src/main/AndroidManifest.xml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksService.aidl b/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksService.aidl deleted file mode 100644 index 627678938..000000000 --- a/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksService.aidl +++ /dev/null @@ -1,13 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.aidl; - -import org.amnezia.vpn.shadowsocks.core.aidl.IShadowsocksServiceCallback; - -interface IShadowsocksService { - int getState(); - String getProfileName(); - - void registerCallback(in IShadowsocksServiceCallback cb); - void startListeningForBandwidth(in IShadowsocksServiceCallback cb, long timeout); - oneway void stopListeningForBandwidth(in IShadowsocksServiceCallback cb); - oneway void unregisterCallback(in IShadowsocksServiceCallback cb); -} diff --git a/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksServiceCallback.aidl b/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksServiceCallback.aidl deleted file mode 100644 index b575256cf..000000000 --- a/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/IShadowsocksServiceCallback.aidl +++ /dev/null @@ -1,18 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.aidl; - -import org.amnezia.vpn.shadowsocks.core.aidl.TrafficStats; - -//"oneway" unexpected. xinlake -interface IShadowsocksServiceCallback { - oneway void stateChanged(int state, String profileName, String msg); - oneway void trafficUpdated(long profileId, in TrafficStats stats); - // Traffic data has persisted to database, listener should refetch their data from database - oneway void trafficPersisted(long profileId); -} - -//oneway interface IShadowsocksServiceCallback { -// void stateChanged(int state, String profileName, String msg); -// void trafficUpdated(long profileId, in TrafficStats stats); -// // Traffic data has persisted to database, listener should refetch their data from database -// void trafficPersisted(long profileId); -//} diff --git a/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.aidl b/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.aidl deleted file mode 100644 index f37e6b47b..000000000 --- a/client/android/shadowsocks/src/main/aidl/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.aidl; - -parcelable TrafficStats; diff --git a/client/android/shadowsocks/src/main/assets/acl/bypass-china.acl b/client/android/shadowsocks/src/main/assets/acl/bypass-china.acl deleted file mode 100644 index b75a76ed2..000000000 --- a/client/android/shadowsocks/src/main/assets/acl/bypass-china.acl +++ /dev/null @@ -1,10377 +0,0 @@ -[proxy_all] - -[bypass_list] -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.32.0/19 -8.208.64.0/18 -8.208.128.0/17 -8.209.0.0/16 -8.210.0.0/15 -8.212.0.0/14 -8.216.0.0/13 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.251.240.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -65.55.60.184/30 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.119.224.0/22 -103.120.52.0/22 -103.120.72.0/22 -103.120.76.0/24 -103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 -103.121.52.0/22 -103.121.92.0/22 -103.121.160.0/21 -103.121.250.0/24 -103.121.252.0/22 -103.129.52.0/22 -103.129.148.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.197.104.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -130.214.218.0/23 -131.228.96.0/24 -131.253.12.0/29 -131.253.12.80/28 -131.253.12.240/29 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -147.243.13.32/27 -147.243.13.64/27 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.158.0.0/16 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.32.136.0/21 -152.32.144.0/20 -152.32.160.0/19 -152.32.192.0/18 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -188.65.16.0/22 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.1.0/24 -202.95.2.0/23 -202.95.4.0/22 -202.95.8.0/21 -202.95.16.0/20 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 - -[proxy_list] -# Telegram IPs$ -91.108.4.0/22 -91.108.8.0/21 -91.108.16.0/21 -91.108.36.0/22 -91.108.56.0/22 -109.239.140.0/24 -149.154.160.0/20 -14.102.250.18 -14.102.250.19 -174.142.105.153 -50.7.31.230 -67.220.91.15 -67.220.91.18 -67.220.91.23 -69.65.19.160 -72.52.81.22 -85.17.73.31 -(^|\.)030buy\.com$ -(^|\.)0rz\.tw$ -(^|\.)1-apple\.com\.tw$ -(^|\.)10\.tt$ -(^|\.)1000giri\.net$ -(^|\.)100ke\.org$ -(^|\.)10conditionsoflove\.com$ -(^|\.)10musume\.com$ -(^|\.)123rf\.com$ -(^|\.)12bet\.com$ -(^|\.)12vpn\.com$ -(^|\.)12vpn\.net$ -(^|\.)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$ -(^|\.)1984bbs\.com$ -(^|\.)1984bbs\.org$ -(^|\.)1989report\.hkja\.org\.hk$ -(^|\.)1991way\.com$ -(^|\.)1998cdp\.org$ -(^|\.)1bao\.org$ -(^|\.)1dumb\.com$ -(^|\.)1e100\.net$ -(^|\.)1eew\.com$ -(^|\.)1mobile\.com$ -(^|\.)1pondo\.tv$ -(^|\.)2-hand\.info$ -(^|\.)2000fun\.com$ -(^|\.)2008xianzhang\.info$ -(^|\.)2017\.hk$ -(^|\.)21andy\.com$ -(^|\.)21pron\.com$ -(^|\.)21sextury\.com$ -(^|\.)228\.net\.tw$ -(^|\.)233abc\.com$ -(^|\.)24hrs\.ca$ -(^|\.)24smile\.org$ -(^|\.)25u\.com$ -(^|\.)2dbook\.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$ -(^|\.)466453\.com$ -(^|\.)4bluestones\.biz$ -(^|\.)4chan\.com$ -(^|\.)4dq\.com$ -(^|\.)4everproxy\.com$ -(^|\.)4irc\.com$ -(^|\.)4mydomain\.com$ -(^|\.)4pu\.com$ -(^|\.)4rbtv\.com$ -(^|\.)4shared\.com$ -(^|\.)4tern\.com$ -(^|\.)51\.ca$ -(^|\.)51jav\.org$ -(^|\.)51luoben\.com$ -(^|\.)5278\.cc$ -(^|\.)56cun04\.jigsy\.com$ -(^|\.)5aimiku\.com$ -(^|\.)5i01\.com$ -(^|\.)5isotoi5\.org$ -(^|\.)5maodang\.com$ -(^|\.)63i\.com$ -(^|\.)64memo$ -(^|\.)64museum\.org$ -(^|\.)64tianwang\.com$ -(^|\.)64wiki\.com$ -(^|\.)66\.ca$ -(^|\.)666kb\.com$ -(^|\.)6park\.com$ -(^|\.)6parker\.com$ -(^|\.)7capture\.com$ -(^|\.)7cow\.com$ -(^|\.)8-d\.com$ -(^|\.)85cc\.net$ -(^|\.)85cc\.us$ -(^|\.)85st\.com$ -(^|\.)881903\.com$ -(^|\.)888\.com$ -(^|\.)888poker\.com$ -(^|\.)89-64\.org$ -(^|\.)89\.64\.charter\.constitutionalism\.solutions$ -(^|\.)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$ -(^|\.)a-normal-day\.com$ -(^|\.)a248\.e\.akamai\.net$ -(^|\.)a5\.com\.ru$ -(^|\.)aamacau\.com$ -(^|\.)abc\.com$ -(^|\.)abc\.pp\.ru$ -(^|\.)abc\.xyz$ -(^|\.)abchinese\.com$ -(^|\.)abclite\.net$ -(^|\.)abitno\.linpie\.com$ -(^|\.)ablwang\.com$ -(^|\.)aboluowang\.com$ -(^|\.)aboutgfw\.com$ -(^|\.)abs\.edu$ -(^|\.)ac\.jiruan\.net$ -(^|\.)accim\.org$ -(^|\.)aceros-de-hispania\.com$ -(^|\.)acevpn\.com$ -(^|\.)acg18\.me$ -(^|\.)acgkj\.com$ -(^|\.)acmedia365\.com$ -(^|\.)acmetoy\.com$ -(^|\.)acnw\.com\.au$ -(^|\.)actfortibet\.org$ -(^|\.)actimes\.com\.au$ -(^|\.)activpn\.com$ -(^|\.)aculo\.us$ -(^|\.)addictedtocoffee\.de$ -(^|\.)adelaidebbs\.com$ -(^|\.)admob\.com$ -(^|\.)adorama\.com$ -(^|\.)adpl\.org\.hk$ -(^|\.)ads-twitter\.com$ -(^|\.)adsense\.com$ -(^|\.)adult-sex-games\.com$ -(^|\.)adult\.friendfinder\.com$ -(^|\.)adultfriendfinder\.com$ -(^|\.)adultkeep\.net$ -(^|\.)advanscene\.com$ -(^|\.)advertfan\.com$ -(^|\.)ae\.hao123\.com$ -(^|\.)ae\.org$ -(^|\.)aenhancers\.com$ -(^|\.)af\.mil$ -(^|\.)afantibbs\.com$ -(^|\.)agnesb\.fr$ -(^|\.)agoogleaday\.com$ -(^|\.)agro\.hk$ -(^|\.)ahr0chm6ly95zwnslm5lda$ -(^|\.)ai-kan\.net$ -(^|\.)ai-wen\.net$ -(^|\.)ai\.binwang\.me$ -(^|\.)aiph\.net$ -(^|\.)airasia\.com$ -(^|\.)airconsole\.com$ -(^|\.)airvpn\.org$ -(^|\.)aisex\.com$ -(^|\.)ait\.org\.tw$ -(^|\.)aiweiwei\.com$ -(^|\.)aiweiweiblog\.com$ -(^|\.)akademiye\.org$ -(^|\.)akiba-online\.com$ -(^|\.)akiba-web\.com$ -(^|\.)al-islam\.com$ -(^|\.)al-qimmah\.net$ -(^|\.)alabout\.com$ -(^|\.)alanhou\.com$ -(^|\.)alarab\.qa$ -(^|\.)alasbarricadas\.org$ -(^|\.)alexlur\.org$ -(^|\.)alforattv\.net$ -(^|\.)alhayat\.com$ -(^|\.)alicejapan\.co\.jp$ -(^|\.)alien-ufos\.com$ -(^|\.)aliengu\.com$ -(^|\.)alkasir\.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\.com$ -(^|\.)ameblo\.jp$ -(^|\.)americangreencard\.com$ -(^|\.)americanunfinished\.com$ -(^|\.)amiblockedornot\.com$ -(^|\.)amigobbs\.net$ -(^|\.)amitabhafoundation\.us$ -(^|\.)amnesty\.org$ -(^|\.)amnesty\.org\.hk$ -(^|\.)amnesty\.tw$ -(^|\.)amnestyusa\.org$ -(^|\.)amnyemachen\.org$ -(^|\.)amoiist\.com$ -(^|\.)ampproject\.org$ -(^|\.)amtb-taipei\.org$ -(^|\.)anchorfree\.com$ -(^|\.)ancsconf\.org$ -(^|\.)andfaraway\.net$ -(^|\.)android-x86\.org$ -(^|\.)android\.com$ -(^|\.)androidify\.com$ -(^|\.)androidplus\.co$ -(^|\.)andygod\.com$ -(^|\.)angelfire\.com$ -(^|\.)angularjs\.org$ -(^|\.)animecrazy\.net$ -(^|\.)animeshippuuden\.com$ -(^|\.)aniscartujo\.com$ -(^|\.)annatam\.com$ -(^|\.)anobii\.com$ -(^|\.)anontext\.com$ -(^|\.)anonymise\.us$ -(^|\.)anonymitynetwork\.com$ -(^|\.)anonymizer\.com$ -(^|\.)anpopo\.com$ -(^|\.)answering-islam\.org$ -(^|\.)anthonycalzadilla\.com$ -(^|\.)anti1984\.com$ -(^|\.)antichristendom\.com$ -(^|\.)antiwave\.net$ -(^|\.)anyporn\.com$ -(^|\.)anysex\.com$ -(^|\.)aobo\.com\.au$ -(^|\.)aofriend\.com$ -(^|\.)aofriend\.com\.au$ -(^|\.)aojiao\.org$ -(^|\.)aolchannels\.aol\.com$ -(^|\.)aomiwang\.com$ -(^|\.)apetube\.com$ -(^|\.)api-secure\.recaptcha\.net$ -(^|\.)api-verify\.recaptcha\.net$ -(^|\.)api\.ai$ -(^|\.)api\.dropboxapi\.com$ -(^|\.)api\.linksalpha\.com$ -(^|\.)api\.proxlet\.com$ -(^|\.)api\.recaptcha\.net$ -(^|\.)apiary\.io$ -(^|\.)apidocs\.linksalpha\.com$ -(^|\.)apigee\.com$ -(^|\.)apk-dl\.com$ -(^|\.)apkdler\.com$ -(^|\.)apkmirror\.com$ -(^|\.)apkmonk\.com$ -(^|\.)apkplz\.com$ -(^|\.)apkpure\.com$ -(^|\.)aplusvpn\.com$ -(^|\.)app\.box\.com$ -(^|\.)app\.heywire\.com$ -(^|\.)app\.tutanota\.com$ -(^|\.)appdownloader\.net$ -(^|\.)appledaily\.com$ -(^|\.)appshopper\.com$ -(^|\.)appsocks\.net$ -(^|\.)appspot\.com$ -(^|\.)appsto\.re$ -(^|\.)ar\.hao123\.com$ -(^|\.)archive\.fo$ -(^|\.)archive\.is$ -(^|\.)archive\.org$ -(^|\.)archives\.gov$ -(^|\.)archives\.gov\.tw$ -(^|\.)arctosia\.com$ -(^|\.)areca-backup\.org$ -(^|\.)arena\.taipei$ -(^|\.)arethusa\.su$ -(^|\.)arlingtoncemetery\.mil$ -(^|\.)army\.mil$ -(^|\.)art4tibet1998\.org$ -(^|\.)artofpeacefoundation\.org$ -(^|\.)artsy\.net$ -(^|\.)asacp\.org$ -(^|\.)asahichinese\.com$ -(^|\.)asdfg\.jp$ -(^|\.)asg\.to$ -(^|\.)asia-gaming\.com$ -(^|\.)asiaharvest\.org$ -(^|\.)asianews\.it$ -(^|\.)asiansexdiary\.com$ -(^|\.)asianspiss\.com$ -(^|\.)asianwomensfilm\.de$ -(^|\.)asiatgp\.com$ -(^|\.)asiatoday\.us$ -(^|\.)askstudent\.com$ -(^|\.)askynz\.net$ -(^|\.)assembla\.com$ -(^|\.)assimp\.org$ -(^|\.)astrill\.com$ -(^|\.)atc\.org\.au$ -(^|\.)atchinese\.com$ -(^|\.)atdmt\.com$ -(^|\.)atgfw\.org$ -(^|\.)athenaeizou\.com$ -(^|\.)atlanta168\.com$ -(^|\.)atlaspost\.com$ -(^|\.)atnext\.com$ -(^|\.)authorizeddns\.net$ -(^|\.)authorizeddns\.org$ -(^|\.)authorizeddns\.us$ -(^|\.)autodraw\.com$ -(^|\.)av\.com$ -(^|\.)av\.movie$ -(^|\.)av\.nightlife141\.com$ -(^|\.)avaaz\.org$ -(^|\.)avbody\.tv$ -(^|\.)avcity\.tv$ -(^|\.)avcool\.com$ -(^|\.)avdb\.in$ -(^|\.)avdb\.tv$ -(^|\.)avfantasy\.com$ -(^|\.)avidemux\.org$ -(^|\.)avmo\.pw$ -(^|\.)avmoo\.com$ -(^|\.)avmoo\.net$ -(^|\.)avmoo\.pw$ -(^|\.)avoision\.com$ -(^|\.)avyahoo\.com$ -(^|\.)axureformac\.com$ -(^|\.)azerbaycan\.tv$ -(^|\.)azerimix\.com$ -(^|\.)azubu\.tv$ -(^|\.)b0ne\.com$ -(^|\.)babynet\.com\.hk$ -(^|\.)backchina\.com$ -(^|\.)backpackers\.com\.tw$ -(^|\.)backtotiananmen\.com$ -(^|\.)badjojo\.com$ -(^|\.)badoo\.com$ -(^|\.)baidu\.jp$ -(^|\.)bailandaily\.com$ -(^|\.)baixing\.me$ -(^|\.)bakgeekhome\.tk$ -(^|\.)banana-vpn\.com$ -(^|\.)bandwagonhost\.com$ -(^|\.)bangbrosnetwork\.com$ -(^|\.)bangchen\.net$ -(^|\.)bangyoulater\.com$ -(^|\.)bannedbook\.org$ -(^|\.)bannednews\.org$ -(^|\.)banorte\.com$ -(^|\.)baramangaonline\.com$ -(^|\.)barenakedislam\.com$ -(^|\.)barnabu\.co\.uk$ -(^|\.)bartvpn\.com$ -(^|\.)bash-hackers\.org$ -(^|\.)bastillepost\.com$ -(^|\.)bayvoice\.net$ -(^|\.)bb-chat\.tv$ -(^|\.)bb\.ttv\.com\.tw$ -(^|\.)bbc\.co\.uk$ -(^|\.)bbc\.com$ -(^|\.)bbc\.com%2fzhongwen$ -(^|\.)bbc\.in$ -(^|\.)bbcchinese\.com$ -(^|\.)bbchat\.tv$ -(^|\.)bbg\.gov$ -(^|\.)bbkz\.com$ -(^|\.)bbnradio\.org$ -(^|\.)bbs-tw\.com$ -(^|\.)bbs\.brockbbs\.com$ -(^|\.)bbs\.cantonese\.asia$ -(^|\.)bbs\.ecstart\.com$ -(^|\.)bbs\.hanminzu\.org$ -(^|\.)bbs\.hasi\.wang$ -(^|\.)bbs\.huasing\.org$ -(^|\.)bbs\.junglobal\.net$ -(^|\.)bbs\.kimy\.com\.tw$ -(^|\.)bbs\.morbell\.com$ -(^|\.)bbs\.mychat\.to$ -(^|\.)bbs\.netbig\.com$ -(^|\.)bbs\.ozchinese\.com$ -(^|\.)bbs\.qmzdd\.com$ -(^|\.)bbs\.sina\.com$ -(^|\.)bbs\.sina\.com%2f$ -(^|\.)bbs\.skykiwi\.com$ -(^|\.)bbs\.sou-tong\.org$ -(^|\.)bbs\.tuitui\.info$ -(^|\.)bbsdigest\.com$ -(^|\.)bbsfeed\.com$ -(^|\.)bbsland\.com$ -(^|\.)bbsmo\.com$ -(^|\.)bbsone\.com$ -(^|\.)bbtoystore\.com$ -(^|\.)bcast\.co\.nz$ -(^|\.)bcc\.com\.tw$ -(^|\.)bcchinese\.net$ -(^|\.)bcmorning\.com$ -(^|\.)bdsmvideos\.net$ -(^|\.)beaconevents\.com$ -(^|\.)bebo\.com$ -(^|\.)beeg\.com$ -(^|\.)beevpn\.com$ -(^|\.)behindkink\.com$ -(^|\.)beijing1989\.com$ -(^|\.)beijingspring\.com$ -(^|\.)beijingzx\.org$ -(^|\.)belamionline\.com$ -(^|\.)bell\.wiki$ -(^|\.)bemywife\.cc$ -(^|\.)beric\.me$ -(^|\.)berlintwitterwall\.com$ -(^|\.)berm\.co\.nz$ -(^|\.)bestforchina\.org$ -(^|\.)bestgore\.com$ -(^|\.)bestpornstardb\.com$ -(^|\.)bestvpn\.com$ -(^|\.)bestvpnanalysis\.com$ -(^|\.)bestvpnserver\.com$ -(^|\.)bestvpnservice\.com$ -(^|\.)bestvpnusa\.com$ -(^|\.)bet365\.com$ -(^|\.)beta\.usejump\.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$ -(^|\.)bic2011\.org$ -(^|\.)bigfools\.com$ -(^|\.)bigjapanesesex\.com$ -(^|\.)bigmoney\.biz$ -(^|\.)bignews\.org$ -(^|\.)bigsound\.org$ -(^|\.)biliworld\.com$ -(^|\.)billypan\.com$ -(^|\.)binux\.me$ -(^|\.)bipic\.net$ -(^|\.)bit\.do$ -(^|\.)bit\.ly$ -(^|\.)bitc\.bme\.emory\.edu$ -(^|\.)bitcointalk\.org$ -(^|\.)bitmex\.com$ -(^|\.)bitshare\.com$ -(^|\.)bitsnoop\.com$ -(^|\.)bitvise\.com$ -(^|\.)bizhat\.com$ -(^|\.)bjnewlife\.org$ -(^|\.)bjs\.org$ -(^|\.)bjzc\.org$ -(^|\.)bl-doujinsouko\.com$ -(^|\.)blacklogic\.com$ -(^|\.)blackvpn\.com$ -(^|\.)blewpass\.com$ -(^|\.)blinkx\.com$ -(^|\.)blinw\.com$ -(^|\.)blip\.tv$ -(^|\.)blockcn\.com$ -(^|\.)blockless\.com$ -(^|\.)blog\.calibre-ebook\.com$ -(^|\.)blog\.cnyes\.com$ -(^|\.)blog\.daum\.net$ -(^|\.)blog\.de$ -(^|\.)blog\.exblog\.co\.jp$ -(^|\.)blog\.excite\.co\.jp$ -(^|\.)blog\.expofutures\.com$ -(^|\.)blog\.fizzik\.com$ -(^|\.)blog\.foolsmountain\.com$ -(^|\.)blog\.fuckgfw233\.org$ -(^|\.)blog\.goo\.ne\.jp$ -(^|\.)blog\.google$ -(^|\.)blog\.inoreader\.com$ -(^|\.)blog\.istef\.info$ -(^|\.)blog\.jackjia\.com$ -(^|\.)blog\.jp$ -(^|\.)blog\.kangye\.org$ -(^|\.)blog\.lester850\.info$ -(^|\.)blog\.martinoei\.com$ -(^|\.)blog\.pathtosharepoint\.com$ -(^|\.)blog\.pentalogic\.net$ -(^|\.)blog\.qooza\.hk$ -(^|\.)blog\.ranxiang\.com$ -(^|\.)blog\.sina\.com\.tw$ -(^|\.)blog\.sogoo\.org$ -(^|\.)blog\.soylent\.com$ -(^|\.)blog\.syx86\.cn$ -(^|\.)blog\.syx86\.com$ -(^|\.)blog\.taragana\.com$ -(^|\.)blog\.tiney\.com$ -(^|\.)blog\.xuite\.net$ -(^|\.)blog\.youthwant\.com\.tw$ -(^|\.)blog\.youxu\.info$ -(^|\.)blogblog\.com$ -(^|\.)blogcatalog\.com$ -(^|\.)blogcity\.me$ -(^|\.)blogdns\.org$ -(^|\.)blogger\.com$ -(^|\.)blogimg\.jp$ -(^|\.)bloglines\.com$ -(^|\.)bloglovin\.com$ -(^|\.)blogs\.icerocket\.com$ -(^|\.)blogs\.libraryinformationtechnology\.com$ -(^|\.)blogs\.tampabay\.com$ -(^|\.)blogs\.yahoo\.co\.jp$ -(^|\.)blogspot(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)blogtd\.net$ -(^|\.)blogtd\.org$ -(^|\.)bloodshed\.net$ -(^|\.)bloomberg\.cn$ -(^|\.)bloomberg\.com$ -(^|\.)bloomberg\.de$ -(^|\.)bloombergview\.com$ -(^|\.)bloomfortune\.com$ -(^|\.)blueangellive\.com$ -(^|\.)bmfinn\.com$ -(^|\.)bnews\.co$ -(^|\.)bnrmetal\.com$ -(^|\.)boardreader\.com$ -(^|\.)bod\.asia$ -(^|\.)bodog88\.com$ -(^|\.)bolehvpn\.net$ -(^|\.)bolin\.netfirms\.com$ -(^|\.)bonbonme\.com$ -(^|\.)bonbonsex\.com$ -(^|\.)bonfoundation\.org$ -(^|\.)bongacams\.com$ -(^|\.)boobstagram\.com$ -(^|\.)book\.com\.tw$ -(^|\.)book\.zi5\.me$ -(^|\.)bookepub\.com$ -(^|\.)books\.com\.tw$ -(^|\.)boomssr\.com$ -(^|\.)bot\.nu$ -(^|\.)botanwang\.com$ -(^|\.)bowenpress\.com$ -(^|\.)boxpn\.com$ -(^|\.)boxun$ -(^|\.)boxun\.com$ -(^|\.)boxun\.tv$ -(^|\.)boxunblog\.com$ -(^|\.)boxunclub\.com$ -(^|\.)boyangu\.com$ -(^|\.)boyfriendtv\.com$ -(^|\.)boysfood\.com$ -(^|\.)boysmaster\.com$ -(^|\.)br\.hao123\.com$ -(^|\.)br\.st$ -(^|\.)brainyquote\.com$ -(^|\.)brandonhutchinson\.com$ -(^|\.)braumeister\.org$ -(^|\.)bravotube\.net$ -(^|\.)brazzers\.com$ -(^|\.)break\.com$ -(^|\.)breakgfw\.com$ -(^|\.)breaking911\.com$ -(^|\.)breakingtweets\.com$ -(^|\.)breakwall\.net$ -(^|\.)briefdream\.com$ -(^|\.)briian\.com$ -(^|\.)brizzly\.com$ -(^|\.)brkmd\.com$ -(^|\.)broadbook\.com$ -(^|\.)broadpressinc\.com$ -(^|\.)brucewang\.net$ -(^|\.)brutaltgp\.com$ -(^|\.)bt2mag\.com$ -(^|\.)bt95\.com$ -(^|\.)btaia\.com$ -(^|\.)btbtav\.com$ -(^|\.)btdigg\.org$ -(^|\.)btku\.me$ -(^|\.)btku\.org$ -(^|\.)btspread\.com$ -(^|\.)budaedu\.org$ -(^|\.)buddhanet\.com\.tw$ -(^|\.)buddhistchannel\.tv$ -(^|\.)buffered\.com$ -(^|\.)bullog\.org$ -(^|\.)bullogger\.com$ -(^|\.)bunbunhk\.com$ -(^|\.)busayari\.com$ -(^|\.)businessinsider\.com$ -(^|\.)businessweek\.com$ -(^|\.)busu\.org$ -(^|\.)busytrade\.com$ -(^|\.)buugaa\.com$ -(^|\.)buy\.yahoo\.com\.tw$ -(^|\.)buzzhand\.com$ -(^|\.)buzzhand\.net$ -(^|\.)buzzorange\.com$ -(^|\.)bvpn\.com$ -(^|\.)bwsj\.hk$ -(^|\.)bx\.tl$ -(^|\.)bynet\.co\.il$ -(^|\.)c-est-simple\.com$ -(^|\.)c-spanvideo\.org$ -(^|\.)c100tibet\.org$ -(^|\.)c1522\.mooo\.com$ -(^|\.)cablegatesearch\.net$ -(^|\.)cachinese\.com$ -(^|\.)cacnw\.com$ -(^|\.)cactusvpn\.com$ -(^|\.)cafepress\.com$ -(^|\.)cahr\.org\.tw$ -(^|\.)calameo\.com$ -(^|\.)calebelston\.com$ -(^|\.)calgarychinese\.ca$ -(^|\.)calgarychinese\.com$ -(^|\.)calgarychinese\.net$ -(^|\.)cam4\.com$ -(^|\.)cam4\.jp$ -(^|\.)cam4\.sg$ -(^|\.)camfrog\.com$ -(^|\.)cams\.com$ -(^|\.)cams\.org\.sg$ -(^|\.)canadameet\.com$ -(^|\.)canalporno\.com$ -(^|\.)canyu\.org$ -(^|\.)cao\.im$ -(^|\.)caobian\.info$ -(^|\.)caochangqing\.com$ -(^|\.)cap\.org\.hk$ -(^|\.)carabinasypistolas\.com$ -(^|\.)cardinalkungfoundation\.org$ -(^|\.)carfax\.com$ -(^|\.)cari\.com\.my$ -(^|\.)caribbeancom\.com$ -(^|\.)carmotorshow\.com$ -(^|\.)cartoonmovement\.com$ -(^|\.)casadeltibetbcn\.org$ -(^|\.)casatibet\.org\.mx$ -(^|\.)casino\.williamhill\.com$ -(^|\.)casinobellini\.com$ -(^|\.)casinoking\.com$ -(^|\.)casinoriva\.com$ -(^|\.)castbox\.fm$ -(^|\.)catch22\.net$ -(^|\.)catfightpayperview\.xxx$ -(^|\.)catholic\.org\.hk$ -(^|\.)catholic\.org\.tw$ -(^|\.)cathvoice\.org\.tw$ -(^|\.)cattt\.com$ -(^|\.)cbc\.ca$ -(^|\.)cbs\.ntu\.edu\.tw$ -(^|\.)cbsnews\.com$ -(^|\.)cbtc\.org\.hk$ -(^|\.)cccat\.cc$ -(^|\.)cccat\.co$ -(^|\.)ccdtr\.org$ -(^|\.)cchere\.com$ -(^|\.)ccim\.org$ -(^|\.)cclife\.ca$ -(^|\.)cclife\.org$ -(^|\.)cclifefl\.org$ -(^|\.)ccthere\.com$ -(^|\.)cctmweb\.net$ -(^|\.)cctongbao\.com$ -(^|\.)ccue\.ca$ -(^|\.)ccue\.com$ -(^|\.)ccvoice\.ca$ -(^|\.)ccw\.org\.tw$ -(^|\.)cdbook\.org$ -(^|\.)cdcparty\.com$ -(^|\.)cdef\.org$ -(^|\.)cdig\.info$ -(^|\.)cdjp\.org$ -(^|\.)cdn$ -(^|\.)cdn-apple\.com$ -(^|\.)cdn-images\.mailchimp\.com$ -(^|\.)cdn\.assets\.lfpcontent\.com$ -(^|\.)cdn\.helixstudios\.net$ -(^|\.)cdn\.printfriendly\.com$ -(^|\.)cdn\.softlayer\.net$ -(^|\.)cdn1\.lp\.saboom\.com$ -(^|\.)cdnews\.com\.tw$ -(^|\.)cdninstagram\.com$ -(^|\.)cdp1989\.org$ -(^|\.)cdp1998\.org$ -(^|\.)cdp2006\.org$ -(^|\.)cdpa\.url\.tw$ -(^|\.)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$ -(^|\.)certificate\.revocationcheck\.com$ -(^|\.)cfhks\.org\.hk$ -(^|\.)cftfc\.com$ -(^|\.)cgdepot\.org$ -(^|\.)cgst\.edu$ -(^|\.)ch\.shvoong\.com$ -(^|\.)change\.org$ -(^|\.)changeip\.name$ -(^|\.)changeip\.net$ -(^|\.)changeip\.org$ -(^|\.)changp\.com$ -(^|\.)changsa\.net$ -(^|\.)channel8news\.sg$ -(^|\.)chapm25\.com$ -(^|\.)chatnook\.com$ -(^|\.)chaturbate\.com$ -(^|\.)chengmingmag\.com$ -(^|\.)chenguangcheng\.com$ -(^|\.)chenpokong\.com$ -(^|\.)chenpokong\.net$ -(^|\.)chenshan20042005\.wordpress\.com$ -(^|\.)cherrysave\.com$ -(^|\.)chhongbi\.org$ -(^|\.)chicagoncmtv\.com$ -(^|\.)china-mmm\.jp\.net$ -(^|\.)china-mmm\.net$ -(^|\.)china-mmm\.sa\.com$ -(^|\.)china-review\.com\.ua$ -(^|\.)china-week\.com$ -(^|\.)china\.hket\.com$ -(^|\.)china\.ucanews\.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$ -(^|\.)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$ -(^|\.)chinese\.donga\.com$ -(^|\.)chinese\.engadget\.com$ -(^|\.)chinese\.irib\.ir$ -(^|\.)chinese\.soifind\.com$ -(^|\.)chinesedaily\.com$ -(^|\.)chinesedailynews\.com$ -(^|\.)chinesedemocracy\.com$ -(^|\.)chinesegay\.org$ -(^|\.)chinesen\.de$ -(^|\.)chinesepen\.org$ -(^|\.)chinesetalks\.net$ -(^|\.)chineseupress\.com$ -(^|\.)chingcheong\.com$ -(^|\.)chinman\.net$ -(^|\.)chithu\.org$ -(^|\.)chn\.chosun\.com$ -(^|\.)chrdnet\.com$ -(^|\.)christianfreedom\.org$ -(^|\.)christianstudy\.com$ -(^|\.)christiantimes\.org\.hk$ -(^|\.)christusrex\.org$ -(^|\.)chrlawyers\.hk$ -(^|\.)chrome\.com$ -(^|\.)chromecast\.com$ -(^|\.)chromeexperiments\.com$ -(^|\.)chromercise\.com$ -(^|\.)chromestatus\.com$ -(^|\.)chromium\.org$ -(^|\.)chuang-yen\.org$ -(^|\.)chubold\.com$ -(^|\.)chubun\.com$ -(^|\.)chuizi\.net$ -(^|\.)churchinhongkong\.org$ -(^|\.)chushigangdrug\.ch$ -(^|\.)cienen\.com$ -(^|\.)cineastentreff\.de$ -(^|\.)cipfg\.org$ -(^|\.)circlethebayfortibet\.org$ -(^|\.)citizencn\.com$ -(^|\.)citizenlab\.org$ -(^|\.)citizenscommission\.hk$ -(^|\.)citizensradio\.org$ -(^|\.)city365\.ca$ -(^|\.)city9x\.com$ -(^|\.)citypopulation\.de$ -(^|\.)citytalk\.tw$ -(^|\.)civicparty\.hk$ -(^|\.)civildisobediencemovement\.org$ -(^|\.)civilhrfront\.org$ -(^|\.)civiliangunner\.com$ -(^|\.)civilmedia\.tw$ -(^|\.)ck101\.com$ -(^|\.)cl\.d0z\.net$ -(^|\.)clarionproject\.org$ -(^|\.)classicalguitarblog\.net$ -(^|\.)clb\.org\.hk$ -(^|\.)cldr\.unicode\.org$ -(^|\.)cleansite\.biz$ -(^|\.)cleansite\.info$ -(^|\.)cleansite\.us$ -(^|\.)clearharmony\.net$ -(^|\.)clearwisdom\.net$ -(^|\.)clementine-player\.org$ -(^|\.)cling\.omy\.sg$ -(^|\.)clinica-tibet\.ru$ -(^|\.)clipfish\.de$ -(^|\.)cloakpoint\.com$ -(^|\.)cloud\.mail\.ru$ -(^|\.)club1069\.com$ -(^|\.)cmi\.org\.tw$ -(^|\.)cmp\.hku\.hk$ -(^|\.)cms\.gov$ -(^|\.)cmule\.com$ -(^|\.)cmule\.org$ -(^|\.)cn-proxy\.com$ -(^|\.)cn\.calameo\.com$ -(^|\.)cn\.dayabook\.com$ -(^|\.)cn\.fmnnow\.com$ -(^|\.)cn\.freeones\.com$ -(^|\.)cn\.giganews\.com$ -(^|\.)cn\.ibtimes\.com$ -(^|\.)cn\.nytstyle\.com$ -(^|\.)cn\.sandscotaicentral\.com$ -(^|\.)cn\.shafaqna\.com$ -(^|\.)cn\.streetvoice\.com$ -(^|\.)cn\.uncyclopedia\.wikia\.com$ -(^|\.)cn\.uptodown\.com$ -(^|\.)cn\.voa\.mobi$ -(^|\.)cn2\.streetvoice\.com$ -(^|\.)cn6\.eu$ -(^|\.)cna\.com\.tw$ -(^|\.)cnabc\.com$ -(^|\.)cnbbnews\.wordpress\.com$ -(^|\.)cnd\.org$ -(^|\.)cnex\.org\.cn$ -(^|\.)cnineu\.com$ -(^|\.)cnn\.com$ -(^|\.)cnnews\.chosun\.com$ -(^|\.)cnpolitics\.org$ -(^|\.)cnproxy\.com$ -(^|\.)co\.ng\.mil$ -(^|\.)coat\.co\.jp$ -(^|\.)cochina\.co$ -(^|\.)cochina\.org$ -(^|\.)code1984\.com$ -(^|\.)codeshare\.io$ -(^|\.)codeskulptor\.org$ -(^|\.)collateralmurder\.com$ -(^|\.)collateralmurder\.org$ -(^|\.)com\.google$ -(^|\.)comefromchina\.com$ -(^|\.)comic-mega\.me$ -(^|\.)commandarms\.com$ -(^|\.)commentshk\.com$ -(^|\.)communistcrimes\.org$ -(^|\.)community\.windy\.com$ -(^|\.)communitychoicecu\.com$ -(^|\.)compileheart\.com$ -(^|\.)compress\.to$ -(^|\.)connect\.facebook\.net$ -(^|\.)conoha\.jp$ -(^|\.)contactmagazine\.net$ -(^|\.)contests\.twilio\.com$ -(^|\.)convio\.net$ -(^|\.)coobay\.com$ -(^|\.)coolaler\.com$ -(^|\.)coolder\.com$ -(^|\.)coolloud\.org\.tw$ -(^|\.)coolncute\.com$ -(^|\.)corumcollege\.com$ -(^|\.)cos-moe\.com$ -(^|\.)cosmic\.monar\.ch$ -(^|\.)cosplayjav\.pl$ -(^|\.)cotweet\.com$ -(^|\.)coursehero\.com$ -(^|\.)cpj\.org$ -(^|\.)cq99\.us$ -(^|\.)crackle\.com$ -(^|\.)crazys\.cc$ -(^|\.)crchina\.org$ -(^|\.)crd-net\.org$ -(^|\.)creaders\.net$ -(^|\.)creadersnet\.com$ -(^|\.)creativelab5\.com$ -(^|\.)cristyli\.com$ -(^|\.)crocotube\.com$ -(^|\.)crossfire\.co\.kr$ -(^|\.)crossthewall\.net$ -(^|\.)crossvpn\.net$ -(^|\.)crrev\.com$ -(^|\.)crucial\.com$ -(^|\.)csdparty\.com$ -(^|\.)css\.pixnet\.in$ -(^|\.)csuchen\.de$ -(^|\.)csw\.org\.uk$ -(^|\.)ct\.org\.tw$ -(^|\.)ctao\.org$ -(^|\.)ctfriend\.net$ -(^|\.)cthlo\.github\.io$ -(^|\.)ctitv\.com\.tw$ -(^|\.)cts\.com\.tw$ -(^|\.)cuhkacs\.org$ -(^|\.)cuihua\.org$ -(^|\.)cuiweiping\.net$ -(^|\.)culture\.tw$ -(^|\.)cumlouder\.com$ -(^|\.)curvefish\.com$ -(^|\.)cusu\.hk$ -(^|\.)cw\.com\.tw$ -(^|\.)cyberghost\.natado\.com$ -(^|\.)cyberghostvpn\.com$ -(^|\.)cynscribe\.com$ -(^|\.)cytode\.us$ -(^|\.)d-fukyu\.com$ -(^|\.)d100\.net$ -(^|\.)d1b183sg0nvnuh\.cloudfront\.net$ -(^|\.)d1c37gjwa26taa\.cloudfront\.net$ -(^|\.)d2bay\.com$ -(^|\.)d2pass\.com$ -(^|\.)d3c33hcgiwev3\.cloudfront\.net$ -(^|\.)d3rhr7kgmtrq1v\.cloudfront\.net$ -(^|\.)dabr\.co\.uk$ -(^|\.)dabr\.eu$ -(^|\.)dabr\.me$ -(^|\.)dabr\.mobi$ -(^|\.)dadazim\.com$ -(^|\.)dadi360\.com$ -(^|\.)dafagood\.com$ -(^|\.)dafahao\.com$ -(^|\.)dafoh\.org$ -(^|\.)dagelijksestandaard\.nl$ -(^|\.)daidostup\.ru$ -(^|\.)dailidaili\.com$ -(^|\.)dailymotion\.com$ -(^|\.)dailynews\.sina\.com$ -(^|\.)dailynews\.sina\.com%2f$ -(^|\.)daiphapinfo\.net$ -(^|\.)dajiyuan\.com$ -(^|\.)dajiyuan\.de$ -(^|\.)dajiyuan\.eu$ -(^|\.)dajusha\.baywords\.com$ -(^|\.)dalailama-archives\.org$ -(^|\.)dalailama\.com$ -(^|\.)dalailama\.mn$ -(^|\.)dalailama\.ru$ -(^|\.)dalailama\.usc\.edu$ -(^|\.)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$ -(^|\.)danbooru\.donmai\.us$ -(^|\.)danke4china\.net$ -(^|\.)danwei\.org$ -(^|\.)daodu14\.jigsy\.com$ -(^|\.)daolan\.net$ -(^|\.)daozhongxing\.org$ -(^|\.)darktech\.org$ -(^|\.)darktoy\.net$ -(^|\.)darpa\.mil$ -(^|\.)dastrassi\.org$ -(^|\.)data-vocabulary\.org$ -(^|\.)data\.flurry\.com$ -(^|\.)data\.gov\.tw$ -(^|\.)david-kilgour\.com$ -(^|\.)dawangidc\.com$ -(^|\.)daxa\.cn$ -(^|\.)daylife\.com$ -(^|\.)db\.tt$ -(^|\.)dbc\.hk$ -(^|\.)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$ -(^|\.)deaftone\.com$ -(^|\.)debug\.com$ -(^|\.)deck\.ly$ -(^|\.)decodet\.co$ -(^|\.)deepmind\.com$ -(^|\.)deezer\.com$ -(^|\.)definebabe\.com$ -(^|\.)deja\.com$ -(^|\.)delcamp\.net$ -(^|\.)delicious\.com$ -(^|\.)demo\.opera-mini\.net$ -(^|\.)democrats\.org$ -(^|\.)depositphotos\.com$ -(^|\.)derekhsu\.homeip\.net$ -(^|\.)desc\.se$ -(^|\.)design\.google$ -(^|\.)desipro\.de$ -(^|\.)dessci\.com$ -(^|\.)destiny\.xfiles\.to$ -(^|\.)destroy-china\.jp$ -(^|\.)deutsche-welle\.de$ -(^|\.)developers\.box\.net$ -(^|\.)devio\.us$ -(^|\.)devpn\.com$ -(^|\.)dfas\.mil$ -(^|\.)dfn\.org$ -(^|\.)dharamsalanet\.com$ -(^|\.)dharmakara\.net$ -(^|\.)dhcp\.biz$ -(^|\.)diaoyuislands\.org$ -(^|\.)dictionary\.goo\.ne\.jp$ -(^|\.)digiland\.tw$ -(^|\.)digisfera\.com$ -(^|\.)digitalnomadsproject\.org$ -(^|\.)diigo\.com$ -(^|\.)dilber\.se$ -(^|\.)dingchin\.com\.tw$ -(^|\.)dipity\.com$ -(^|\.)directcreative\.com$ -(^|\.)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$ -(^|\.)dl\.box\.net$ -(^|\.)dlsite\.com$ -(^|\.)dlyoutube\.com$ -(^|\.)dm530\.net$ -(^|\.)dmcdn\.net$ -(^|\.)dmm\.co\.jp$ -(^|\.)dns-dns\.com$ -(^|\.)dns-stuff\.com$ -(^|\.)dns04\.com$ -(^|\.)dns05\.com$ -(^|\.)dns1\.us$ -(^|\.)dns2\.us$ -(^|\.)dns2go\.com$ -(^|\.)dnscrypt\.org$ -(^|\.)dnset\.com$ -(^|\.)dnsrd\.com$ -(^|\.)dnssec\.net$ -(^|\.)dnvod\.tv$ -(^|\.)doctorvoice\.org$ -(^|\.)dogfartnetwork\.com$ -(^|\.)dojin\.com$ -(^|\.)dok-forum\.net$ -(^|\.)dolc\.de$ -(^|\.)dolf\.org\.hk$ -(^|\.)dollf\.com$ -(^|\.)domain\.club\.tw$ -(^|\.)domainhelp\.search\.com$ -(^|\.)domains\.google$ -(^|\.)domaintoday\.com\.au$ -(^|\.)dongtaiwang\.com$ -(^|\.)dongtaiwang\.net$ -(^|\.)dongyangjing\.com$ -(^|\.)dontfilter\.us$ -(^|\.)dontmovetochina\.com$ -(^|\.)dorjeshugden\.com$ -(^|\.)dotplane\.com$ -(^|\.)dotsub\.com$ -(^|\.)dotvpn\.com$ -(^|\.)doub\.io$ -(^|\.)dougscripts\.com$ -(^|\.)douhokanko\.net$ -(^|\.)doujincafe\.com$ -(^|\.)dowei\.org$ -(^|\.)download\.aircrack-ng\.org$ -(^|\.)download\.cnet\.com$ -(^|\.)download\.ithome\.com\.tw$ -(^|\.)dphk\.org$ -(^|\.)dpp\.org\.tw$ -(^|\.)dpr\.info$ -(^|\.)dragonsprings\.org$ -(^|\.)dreamamateurs\.com$ -(^|\.)drepung\.org$ -(^|\.)drgan\.net$ -(^|\.)drmingxia\.org$ -(^|\.)dropbooks\.tv$ -(^|\.)dropbox\.com$ -(^|\.)dropboxusercontent\.com$ -(^|\.)drsunacademy\.com$ -(^|\.)drtuber\.com$ -(^|\.)dscn\.info$ -(^|\.)dsmtp\.com$ -(^|\.)dstk\.dk$ -(^|\.)dtdns\.net$ -(^|\.)dtiblog\.com$ -(^|\.)dtic\.mil$ -(^|\.)dtwang\.org$ -(^|\.)duanzhihu\.com$ -(^|\.)duck\.com$ -(^|\.)duckdns\.org$ -(^|\.)duckduckgo-owned-server\.yahoo\.net$ -(^|\.)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$ -(^|\.)dvorak\.org$ -(^|\.)dw-world\.com$ -(^|\.)dw-world\.de$ -(^|\.)dw\.com$ -(^|\.)dw\.de$ -(^|\.)dwnews\.com$ -(^|\.)dwnews\.net$ -(^|\.)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$ -(^|\.)dynupdate\.no-ip\.com$ -(^|\.)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$ -(^|\.)eastturkistancc\.org$ -(^|\.)eastturkistangovernmentinexile\.us$ -(^|\.)easyca\.ca$ -(^|\.)easypic\.com$ -(^|\.)ebony-beauty\.com$ -(^|\.)ebook\.hyread\.com\.tw$ -(^|\.)ebookbrowse\.com$ -(^|\.)ebookee\.com$ -(^|\.)ecfa\.org\.tw$ -(^|\.)echofon\.com$ -(^|\.)ecimg\.tw$ -(^|\.)ecministry\.net$ -(^|\.)economist\.com$ -(^|\.)ecsm\.vs\.com$ -(^|\.)edgecastcdn\.net$ -(^|\.)edicypages\.com$ -(^|\.)edmontonchina\.cn$ -(^|\.)edmontonservice\.com$ -(^|\.)edns\.biz$ -(^|\.)edoors\.com$ -(^|\.)edubridge\.com$ -(^|\.)edupro\.org$ -(^|\.)eeas\.europa\.eu$ -(^|\.)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$ -(^|\.)elpais\.com$ -(^|\.)eltondisney\.com$ -(^|\.)emaga\.com$ -(^|\.)emanna\.com$ -(^|\.)embr\.in$ -(^|\.)emilylau\.org\.hk$ -(^|\.)empfil\.com$ -(^|\.)emule-ed2k\.com$ -(^|\.)emulefans\.com$ -(^|\.)emuparadise\.me$ -(^|\.)en\.favotter\.net$ -(^|\.)en\.hao123\.com$ -(^|\.)enanyang\.my$ -(^|\.)enewstree\.com$ -(^|\.)enfal\.de$ -(^|\.)engagedaily\.org$ -(^|\.)englishforeveryone\.org$ -(^|\.)englishfromengland\.co\.uk$ -(^|\.)englishpen\.org$ -(^|\.)enlighten\.org\.tw$ -(^|\.)entermap\.com$ -(^|\.)entnt\.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$ -(^|\.)etaa\.org\.au$ -(^|\.)etadult\.com$ -(^|\.)etaiwannews\.com$ -(^|\.)etizer\.org$ -(^|\.)etokki\.com$ -(^|\.)etools\.ncol\.com$ -(^|\.)etowns\.net$ -(^|\.)etowns\.org$ -(^|\.)ettoday\.net$ -(^|\.)etvonline\.hk$ -(^|\.)eu\.org$ -(^|\.)eucasino\.com$ -(^|\.)eulam\.com$ -(^|\.)eurekavpt\.com$ -(^|\.)evchk\.wikia\.com$ -(^|\.)evschool\.net$ -(^|\.)exblog\.jp$ -(^|\.)exchristian\.hk$ -(^|\.)exmormon\.org$ -(^|\.)expatshield\.com$ -(^|\.)expecthim\.com$ -(^|\.)expekt\.com$ -(^|\.)experts-univers\.com$ -(^|\.)exploader\.net$ -(^|\.)expressvpn\.com$ -(^|\.)extmatrix\.com$ -(^|\.)extremetube\.com$ -(^|\.)eyevio\.jp$ -(^|\.)eyny\.com$ -(^|\.)ezpc\.tk$ -(^|\.)ezpeer\.com$ -(^|\.)ezua\.com$ -(^|\.)fa\.gov\.tw$ -(^|\.)facebook\.br$ -(^|\.)facebook\.com$ -(^|\.)facebook\.design$ -(^|\.)facebook\.hu$ -(^|\.)facebook\.in$ -(^|\.)facebook\.nl$ -(^|\.)facebook\.se$ -(^|\.)facebookquotes4u\.com$ -(^|\.)faceless\.me$ -(^|\.)facesofnyfw\.com$ -(^|\.)facesoftibetanselfimmolators\.info$ -(^|\.)fail\.hk$ -(^|\.)faith100\.org$ -(^|\.)faithfuleye\.com$ -(^|\.)faiththedog\.info$ -(^|\.)fakku\.net$ -(^|\.)falsefire\.com$ -(^|\.)falun-co\.org$ -(^|\.)falun-ny\.net$ -(^|\.)falun\.caltech\.edu$ -(^|\.)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$ -(^|\.)fangbinxing\.com$ -(^|\.)fangeming\.com$ -(^|\.)fangeqiang\.com$ -(^|\.)fanglizhi\.info$ -(^|\.)fangmincn\.org$ -(^|\.)fangong\.forums-free\.com$ -(^|\.)fangong\.org$ -(^|\.)fangongheike\.com$ -(^|\.)fanhaodang\.com$ -(^|\.)fanqiang\.tk$ -(^|\.)fanqianghou\.com$ -(^|\.)fanqiangyakexi\.net$ -(^|\.)fanqiangzhe\.com$ -(^|\.)fanswong\.com$ -(^|\.)fanyue\.info$ -(^|\.)fapdu\.com$ -(^|\.)faproxy\.com$ -(^|\.)faqserv\.com$ -(^|\.)fartit\.com$ -(^|\.)farwestchina\.com$ -(^|\.)fast\.wistia\.com$ -(^|\.)fastpic\.ru$ -(^|\.)fastssh\.com$ -(^|\.)faststone\.org$ -(^|\.)favstar\.fm$ -(^|\.)fawanghuihui\.org$ -(^|\.)faydao\.com$ -(^|\.)fb\.com$ -(^|\.)fb\.me$ -(^|\.)fbcdn\.net$ -(^|\.)fbsbx\.com$ -(^|\.)fc2\.com$ -(^|\.)fc2blog\.net$ -(^|\.)fc2china\.com$ -(^|\.)fc2cn\.com$ -(^|\.)fda\.gov\.tw$ -(^|\.)fdc64\.de$ -(^|\.)fdc64\.org$ -(^|\.)fdc89\.jp$ -(^|\.)feedburner\.com$ -(^|\.)feeds\.fileforum\.com$ -(^|\.)feelssh\.com$ -(^|\.)feer\.com$ -(^|\.)feifeiss\.com$ -(^|\.)feitian-california\.org$ -(^|\.)feitianacademy\.org$ -(^|\.)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$ -(^|\.)files2me\.com$ -(^|\.)fileserve\.com$ -(^|\.)filesor\.com$ -(^|\.)fillthesquare\.org$ -(^|\.)filmingfortibet\.org$ -(^|\.)filmy\.olabloga\.pl$ -(^|\.)filthdump\.com$ -(^|\.)financetwitter\.com$ -(^|\.)finchvpn\.com$ -(^|\.)findmespot\.com$ -(^|\.)findyoutube\.com$ -(^|\.)fingerdaily\.com$ -(^|\.)finler\.net$ -(^|\.)firearmsworld\.net$ -(^|\.)firebaseio\.com$ -(^|\.)fireofliberty\.org$ -(^|\.)firetweet\.io$ -(^|\.)firstfivefollowers\.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$ -(^|\.)fochk\.org$ -(^|\.)focustaiwan\.tw$ -(^|\.)focusvpn\.com$ -(^|\.)fofg-europe\.net$ -(^|\.)fofg\.org$ -(^|\.)fofldfradio\.org$ -(^|\.)fooooo\.com$ -(^|\.)footwiball\.com$ -(^|\.)forum\.baby-kingdom\.com$ -(^|\.)forum\.cyberctm\.com$ -(^|\.)forum\.idsam\.com$ -(^|\.)forum\.my903\.com$ -(^|\.)forum\.mymaji\.com$ -(^|\.)forum\.omy\.sg$ -(^|\.)forum\.palmislife\.com$ -(^|\.)forum\.setty\.com\.tw$ -(^|\.)forum\.sina\.com\.hk$ -(^|\.)forum\.slime\.com\.tw$ -(^|\.)forum\.tvb\.com$ -(^|\.)forum\.xinbao\.de$ -(^|\.)forum4hk\.com$ -(^|\.)fotile\.me$ -(^|\.)fourface\.nodesnoop\.com$ -(^|\.)fourthinternational\.org$ -(^|\.)foxdie\.us$ -(^|\.)foxgay\.com$ -(^|\.)foxsub\.com$ -(^|\.)foxtang\.com$ -(^|\.)fpmt-osel\.org$ -(^|\.)fpmt\.org$ -(^|\.)fpmt\.tw$ -(^|\.)fpmtmexico\.org$ -(^|\.)fq\.wikia\.com$ -(^|\.)fqok\.org$ -(^|\.)fqrouter\.com$ -(^|\.)franklc\.com$ -(^|\.)freakshare\.com$ -(^|\.)free-gate\.org$ -(^|\.)free-hada-now\.org$ -(^|\.)free-proxy\.cz$ -(^|\.)free-ssh\.com$ -(^|\.)free\.fr$ -(^|\.)free4u\.com\.ar$ -(^|\.)freealim\.com$ -(^|\.)freebrowser\.org$ -(^|\.)freechal\.com$ -(^|\.)freechina\.net$ -(^|\.)freechina\.news$ -(^|\.)freechinaforum\.org$ -(^|\.)freeddns\.com$ -(^|\.)freeddns\.org$ -(^|\.)freedomchina\.info$ -(^|\.)freedomcollection\.org$ -(^|\.)freedomhouse\.org$ -(^|\.)freedominfonetweb\.wordpress\.com$ -(^|\.)freedomsherald\.org$ -(^|\.)freeforums\.org$ -(^|\.)freefq\.com$ -(^|\.)freefuckvids\.com$ -(^|\.)freegao\.com$ -(^|\.)freeilhamtohti\.org$ -(^|\.)freekwonpyong\.org$ -(^|\.)freelotto\.com$ -(^|\.)freeman2\.com$ -(^|\.)freemoren\.com$ -(^|\.)freemorenews\.com$ -(^|\.)freemuse\.org$ -(^|\.)freenet$ -(^|\.)freenet-china\.org$ -(^|\.)freenetproject\.org$ -(^|\.)freenewscn\.com$ -(^|\.)freeopenvpn\.com$ -(^|\.)freeoz\.org$ -(^|\.)freessh\.us$ -(^|\.)freetcp\.com$ -(^|\.)freetibet\.net$ -(^|\.)freetibet\.org$ -(^|\.)freetibetanheroes\.org$ -(^|\.)freeviewmovies\.com$ -(^|\.)freevpn\.me$ -(^|\.)freevpn\.nl$ -(^|\.)freewallpaper4\.me$ -(^|\.)freewebs\.com$ -(^|\.)freewechat\.com$ -(^|\.)freeweibo\.com$ -(^|\.)freewww\.biz$ -(^|\.)freewww\.info$ -(^|\.)freexinwen\.com$ -(^|\.)freeyellow\.com$ -(^|\.)freeyoutubeproxy\.net$ -(^|\.)friendfeed-media\.com$ -(^|\.)friendfeed\.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$ -(^|\.)fucd\.com$ -(^|\.)fuckcnnic\.net$ -(^|\.)fuckgfw\.org$ -(^|\.)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$ -(^|\.)g6hentai\.com$ -(^|\.)gabocorp\.com$ -(^|\.)gaeproxy\.com$ -(^|\.)gaforum\.org$ -(^|\.)galaxymacau\.com$ -(^|\.)galenwu\.com$ -(^|\.)galstars\.net$ -(^|\.)game735\.com$ -(^|\.)gamebase\.com\.tw$ -(^|\.)gamejolt\.com$ -(^|\.)gamer\.com\.tw$ -(^|\.)gamez\.com\.tw$ -(^|\.)gamousa\.com$ -(^|\.)ganges\.com$ -(^|\.)gaoming\.net$ -(^|\.)gaopi\.net$ -(^|\.)gaozhisheng\.net$ -(^|\.)gaozhisheng\.org$ -(^|\.)gardennetworks\.com$ -(^|\.)gardennetworks\.org$ -(^|\.)gartlive\.com$ -(^|\.)gate-project\.com$ -(^|\.)gather\.com$ -(^|\.)gatherproxy\.com$ -(^|\.)gati\.org\.tw$ -(^|\.)gaybubble\.com$ -(^|\.)gaycn\.net$ -(^|\.)gayhub\.com$ -(^|\.)gaymap\.cc$ -(^|\.)gaytube\.com$ -(^|\.)gaywatch\.com$ -(^|\.)gazotube\.com$ -(^|\.)gcc\.org\.hk$ -(^|\.)gclooney\.com$ -(^|\.)gcpnews\.com$ -(^|\.)gcr\.io$ -(^|\.)gdbt\.net$ -(^|\.)gdzf\.org$ -(^|\.)geek-art\.net$ -(^|\.)geekerhome\.com$ -(^|\.)geekheart\.info$ -(^|\.)gekikame\.com$ -(^|\.)gelbooru\.com$ -(^|\.)geocities\.co\.jp$ -(^|\.)geocities\.com$ -(^|\.)geocities\.jp$ -(^|\.)gerefoundation\.org$ -(^|\.)get\.how$ -(^|\.)getastrill\.com$ -(^|\.)getchu\.com$ -(^|\.)getcloak\.com$ -(^|\.)getfoxyproxy\.org$ -(^|\.)getfreedur\.com$ -(^|\.)getgom\.com$ -(^|\.)geti2p\.net$ -(^|\.)getiton\.com$ -(^|\.)getjetso\.com$ -(^|\.)getlantern\.org$ -(^|\.)getmdl\.io$ -(^|\.)getsocialscope\.com$ -(^|\.)getsync\.com$ -(^|\.)gettrials\.com$ -(^|\.)gettyimages\.com$ -(^|\.)getuploader\.com$ -(^|\.)gfbv\.de$ -(^|\.)gfgold\.com\.hk$ -(^|\.)gfsale\.com$ -(^|\.)gfw\.org\.ua$ -(^|\.)gfw\.press$ -(^|\.)ggpht\.com$ -(^|\.)ggssl\.com$ -(^|\.)ghost\.org$ -(^|\.)ghostpath\.com$ -(^|\.)ghut\.org$ -(^|\.)giantessnight\.com$ -(^|\.)gifree\.com$ -(^|\.)giga-web\.jp$ -(^|\.)gigporno\.ru$ -(^|\.)girlbanker\.com$ -(^|\.)git\.io$ -(^|\.)gizlen\.net$ -(^|\.)gjczz\.com$ -(^|\.)glass8\.eu$ -(^|\.)global\.bing\.com$ -(^|\.)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$ -(^|\.)gmbd\.cn$ -(^|\.)gmhz\.org$ -(^|\.)gmll\.org$ -(^|\.)gmodules\.com$ -(^|\.)gmozomg\.izihost\.org$ -(^|\.)gnci\.org\.hk$ -(^|\.)go-pki\.com$ -(^|\.)go\.nesnode\.com$ -(^|\.)go141\.com$ -(^|\.)goagent\.biz$ -(^|\.)goagent\.codeplex\.com$ -(^|\.)goagentplus\.com$ -(^|\.)gobet\.cc$ -(^|\.)godfootsteps\.org$ -(^|\.)godns\.work$ -(^|\.)godoc\.org$ -(^|\.)godsdirectcontact\.co\.uk$ -(^|\.)godsdirectcontact\.org$ -(^|\.)godsdirectcontact\.org\.tw$ -(^|\.)godsimmediatecontact\.com$ -(^|\.)gogotunnel\.com$ -(^|\.)gohappy\.com\.tw$ -(^|\.)gojet\.krtco\.com\.tw$ -(^|\.)gokbayrak\.com$ -(^|\.)golang\.org$ -(^|\.)goldbet\.com$ -(^|\.)goldbetsports\.com$ -(^|\.)goldeneyevault\.com$ -(^|\.)goldenfrog\.com$ -(^|\.)goldjizz\.com$ -(^|\.)goldstep\.net$ -(^|\.)goldwave\.com$ -(^|\.)gongm\.in$ -(^|\.)gongmeng\.info$ -(^|\.)gongminliliang\.com$ -(^|\.)gongwt\.com$ -(^|\.)goo\.gl$ -(^|\.)gooday\.xyz$ -(^|\.)gooddns\.info$ -(^|\.)goodreaders\.com$ -(^|\.)goodreads\.com$ -(^|\.)goodtv\.com\.tw$ -(^|\.)goodtv\.tv$ -(^|\.)goofind\.com$ -(^|\.)google(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapis(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapps\.com$ -(^|\.)googlearth\.com$ -(^|\.)googleartproject\.com$ -(^|\.)googleblog\.com$ -(^|\.)googlebot\.com$ -(^|\.)googlechinawebmaster\.com$ -(^|\.)googlecode\.com$ -(^|\.)googlecommerce\.com$ -(^|\.)googledomains\.com$ -(^|\.)googledrive\.com$ -(^|\.)googleearth\.com$ -(^|\.)googlegroups\.com$ -(^|\.)googlehosted\.com$ -(^|\.)googleideas\.com$ -(^|\.)googleinsidesearch\.com$ -(^|\.)googlelabs\.com$ -(^|\.)googlemail\.com$ -(^|\.)googlemashups\.com$ -(^|\.)googlepagecreator\.com$ -(^|\.)googleplay\.com$ -(^|\.)googleplus\.com$ -(^|\.)googlescholar\.com$ -(^|\.)googlesile\.com$ -(^|\.)googlesource\.com$ -(^|\.)googleusercontent\.com$ -(^|\.)googlevideo\.com$ -(^|\.)googleweblight\.com$ -(^|\.)googlezip\.net$ -(^|\.)gopetition\.com$ -(^|\.)goproxing\.net$ -(^|\.)gospelherald\.com$ -(^|\.)got-game\.org$ -(^|\.)gotdns\.ch$ -(^|\.)gotgeeks\.com$ -(^|\.)gotrusted\.com$ -(^|\.)gotw\.ca$ -(^|\.)gov\.taipei$ -(^|\.)gov\.tw$ -(^|\.)gr8domain\.biz$ -(^|\.)gr8name\.biz$ -(^|\.)grammaly\.com$ -(^|\.)grandtrial\.org$ -(^|\.)grangorz\.org$ -(^|\.)graphis\.ne\.jp$ -(^|\.)graphql\.org$ -(^|\.)greasespot\.net$ -(^|\.)great-firewall\.com$ -(^|\.)great-roc\.org$ -(^|\.)greatfire\.org$ -(^|\.)greatfire\.us7\.list-manage\.com$ -(^|\.)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$ -(^|\.)groups\.google\.cn$ -(^|\.)gs-discuss\.com$ -(^|\.)gstatic\.com$ -(^|\.)gtricks\.com$ -(^|\.)gts-vpn\.com$ -(^|\.)gu-chu-sum\.org$ -(^|\.)guaguass\.com$ -(^|\.)guaguass\.org$ -(^|\.)guancha\.org$ -(^|\.)guangming\.com\.my$ -(^|\.)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$ -(^|\.)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$ -(^|\.)hackthatphone\.net$ -(^|\.)hahlo\.com$ -(^|\.)hakkatv\.org\.tw$ -(^|\.)handcraftedsoftware\.org$ -(^|\.)hanunyi\.com$ -(^|\.)hao\.news$ -(^|\.)haoel\.github\.io$ -(^|\.)happy-vpn\.com$ -(^|\.)haproxy\.org$ -(^|\.)hardsextube\.com$ -(^|\.)harunyahya\.com$ -(^|\.)hautelook\.com$ -(^|\.)hautelookcdn\.com$ -(^|\.)have8\.com$ -(^|\.)hclips\.com$ -(^|\.)hd\.stheadline\.com$ -(^|\.)hdlt\.me$ -(^|\.)hdtvb\.net$ -(^|\.)hdzog\.com$ -(^|\.)heartyit\.com$ -(^|\.)hec\.su$ -(^|\.)hecaitou\.net$ -(^|\.)hechaji\.com$ -(^|\.)heeact\.edu\.tw$ -(^|\.)hegre-art\.com$ -(^|\.)heix\.pp\.ru$ -(^|\.)helloandroid\.com$ -(^|\.)helloqueer\.com$ -(^|\.)helloss\.pw$ -(^|\.)hellotxt\.com$ -(^|\.)hellouk\.org$ -(^|\.)help\.linksalpha\.com$ -(^|\.)helpeachpeople\.com$ -(^|\.)helplinfen\.com$ -(^|\.)helpster\.de$ -(^|\.)helpzhuling\.org$ -(^|\.)hentai\.to$ -(^|\.)hentaitube\.tv$ -(^|\.)hentaivideoworld\.com$ -(^|\.)heqinglian\.net$ -(^|\.)heungkongdiscuss\.com$ -(^|\.)hexieshe\.com$ -(^|\.)hexieshe\.xyz$ -(^|\.)hexxeh\.net$ -(^|\.)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$ -(^|\.)hihiforum\.com$ -(^|\.)hihistory\.net$ -(^|\.)hiitch\.com$ -(^|\.)hikinggfw\.org$ -(^|\.)hilive\.tv$ -(^|\.)himalayan-foundation\.org$ -(^|\.)himalayanglacier\.com$ -(^|\.)himemix\.com$ -(^|\.)himemix\.net$ -(^|\.)hitomi\.la$ -(^|\.)hiwifi\.com$ -(^|\.)hizb-ut-tahrir\.info$ -(^|\.)hizb-ut-tahrir\.org$ -(^|\.)hizbuttahrir\.org$ -(^|\.)hjclub\.info$ -(^|\.)hk-pub\.com$ -(^|\.)hk\.frienddy\.com$ -(^|\.)hk\.geocities\.com$ -(^|\.)hk\.gradconnection\.com$ -(^|\.)hk\.hao123img\.com$ -(^|\.)hk\.jiepang\.com$ -(^|\.)hk\.knowledge\.yahoo\.com$ -(^|\.)hk\.myblog\.yahoo\.com$ -(^|\.)hk\.news\.yahoo\.com$ -(^|\.)hk\.rd\.yahoo\.com$ -(^|\.)hk\.search\.yahoo\.com$ -(^|\.)hk\.video\.news\.yahoo\.com$ -(^|\.)hk\.yahoo\.com$ -(^|\.)hk01\.com$ -(^|\.)hk32168\.com$ -(^|\.)hka8964\.wordpress\.com$ -(^|\.)hkacg\.com$ -(^|\.)hkacg\.net$ -(^|\.)hkanews\.wordpress\.com$ -(^|\.)hkatvnews\.com$ -(^|\.)hkbc\.net$ -(^|\.)hkbf\.org$ -(^|\.)hkbookcity\.com$ -(^|\.)hkchurch\.org$ -(^|\.)hkci\.org\.hk$ -(^|\.)hkcmi\.edu$ -(^|\.)hkcnews\.com$ -(^|\.)hkcoc\.com$ -(^|\.)hkcoc\.weather\.com\.hk$ -(^|\.)hkdailynews\.com\.hk$ -(^|\.)hkday\.net$ -(^|\.)hkdf\.org$ -(^|\.)hkej\.com$ -(^|\.)hkepc\.com$ -(^|\.)hkfaa\.com$ -(^|\.)hkfreezone\.com$ -(^|\.)hkfront\.org$ -(^|\.)hkgolden\.com$ -(^|\.)hkgreenradio\.org$ -(^|\.)hkheadline\.com$ -(^|\.)hkhkhk\.com$ -(^|\.)hkhrc\.org\.hk$ -(^|\.)hkhrm\.org\.hk$ -(^|\.)hkip\.org\.uk$ -(^|\.)hkjc\.com$ -(^|\.)hkjp\.org$ -(^|\.)hklft\.com$ -(^|\.)hklts\.org\.hk$ -(^|\.)hkptu\.org$ -(^|\.)hkreporter\.com$ -(^|\.)hkreporter\.loved\.hk$ -(^|\.)hkupop\.hku\.hk$ -(^|\.)hkusu\.net$ -(^|\.)hkvwet\.com$ -(^|\.)hkwcc\.org\.hk$ -(^|\.)hkzone\.org$ -(^|\.)hmonghot\.com$ -(^|\.)hmvdigital\.ca$ -(^|\.)hmvdigital\.com$ -(^|\.)hnjhj\.com$ -(^|\.)hnntube\.com$ -(^|\.)hola\.com$ -(^|\.)hola\.org$ -(^|\.)holymountaincn\.com$ -(^|\.)holyspiritspeaks\.org$ -(^|\.)home\.sina\.com$ -(^|\.)home\.so-net\.net\.tw$ -(^|\.)homedepot\.com$ -(^|\.)homeperversion\.com$ -(^|\.)homeservershow\.com$ -(^|\.)hongkongfp\.com$ -(^|\.)hongmeimei\.com$ -(^|\.)hongzhi\.li$ -(^|\.)hootsuite\.com$ -(^|\.)hoovers\.com$ -(^|\.)hopedialogue\.org$ -(^|\.)hopto\.org$ -(^|\.)hornygamer\.com$ -(^|\.)hornytrip\.com$ -(^|\.)hotav\.tv$ -(^|\.)hotels\.cn$ -(^|\.)hotfrog\.com\.tw$ -(^|\.)hotgoo\.com$ -(^|\.)hotpornshow\.com$ -(^|\.)hotpot\.hk$ -(^|\.)hotshame\.com$ -(^|\.)hotspotshield\.com$ -(^|\.)hotvpn\.com$ -(^|\.)hougaige\.com$ -(^|\.)howtoforge\.com$ -(^|\.)hpa\.gov\.tw$ -(^|\.)hqcdp\.org$ -(^|\.)hqjapanesesex\.com$ -(^|\.)hqmovies\.com$ -(^|\.)hqsbnet\.wordpress\.com$ -(^|\.)hqsbonline\.wordpress\.com$ -(^|\.)hrcchina\.org$ -(^|\.)hrcir\.com$ -(^|\.)hrea\.org$ -(^|\.)hrichina\.org$ -(^|\.)hrw\.org$ -(^|\.)hrweb\.org$ -(^|\.)hsjp\.net$ -(^|\.)hsselite\.com$ -(^|\.)hst\.net\.tw$ -(^|\.)hstern\.net$ -(^|\.)hstt\.net$ -(^|\.)ht\.ly$ -(^|\.)htkou\.net$ -(^|\.)htl\.li$ -(^|\.)html5rocks\.com$ -(^|\.)https$ -(^|\.)https443\.net$ -(^|\.)https443\.org$ -(^|\.)hua-yue\.net$ -(^|\.)huaglad\.com$ -(^|\.)huanghuagang\.org$ -(^|\.)huangyiyu\.com$ -(^|\.)huaren\.us$ -(^|\.)huaren4us\.com$ -(^|\.)huashangnews\.com$ -(^|\.)huaxia-news\.com$ -(^|\.)huaxiabao\.org$ -(^|\.)huaxin\.ph$ -(^|\.)huayuworld\.org$ -(^|\.)hudatoriq\.web\.id$ -(^|\.)huffingtonpost\.com$ -(^|\.)hugoroy\.eu$ -(^|\.)huhaitai\.com$ -(^|\.)huhamhire\.com$ -(^|\.)huiyi\.in$ -(^|\.)hulkshare\.com$ -(^|\.)hulu\.com$ -(^|\.)huluim\.com$ -(^|\.)hum$ -(^|\.)humanrightsbriefing\.org$ -(^|\.)hung-ya\.com$ -(^|\.)hungerstrikeforaids\.org$ -(^|\.)huobi\.com$ -(^|\.)huobi\.pro$ -(^|\.)huobipro\.com$ -(^|\.)huping\.net$ -(^|\.)hurgokbayrak\.com$ -(^|\.)hurriyet\.com\.tr$ -(^|\.)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$ -(^|\.)i-cable\.com$ -(^|\.)i-part\.com\.tw$ -(^|\.)i\.lithium\.com$ -(^|\.)i1\.hk$ -(^|\.)i2p2\.de$ -(^|\.)i2runner\.com$ -(^|\.)i818hk\.com$ -(^|\.)iam\.soy$ -(^|\.)iamtopone\.com$ -(^|\.)iask\.bz$ -(^|\.)iask\.ca$ -(^|\.)iav19\.com$ -(^|\.)ibiblio\.org$ -(^|\.)iblist\.com$ -(^|\.)iblogserv-f\.net$ -(^|\.)ibros\.org$ -(^|\.)ibvpn\.com$ -(^|\.)icams\.com$ -(^|\.)ice\.audionow\.com$ -(^|\.)icij\.org$ -(^|\.)icl-fi\.org$ -(^|\.)icoco\.com$ -(^|\.)iconpaper\.org$ -(^|\.)icu-project\.org$ -(^|\.)id\.hao123\.com$ -(^|\.)id\.heroku\.com$ -(^|\.)iddddg\.com$ -(^|\.)idemocracy\.asia$ -(^|\.)identi\.ca$ -(^|\.)idiomconnection\.com$ -(^|\.)idouga\.com$ -(^|\.)idreamx\.com$ -(^|\.)idv\.tw$ -(^|\.)ieasy5\.com$ -(^|\.)ied2k\.net$ -(^|\.)ienergy1\.com$ -(^|\.)if\.ttt$ -(^|\.)ifan\.cz\.cc$ -(^|\.)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$ -(^|\.)illusionfactory\.com$ -(^|\.)ilove80\.be$ -(^|\.)ilovelongtoes\.com$ -(^|\.)im\.tv$ -(^|\.)im88\.tw$ -(^|\.)imageab\.com$ -(^|\.)imagefap\.com$ -(^|\.)imageflea\.com$ -(^|\.)images-gaytube\.com$ -(^|\.)images\.comico\.tw$ -(^|\.)imageshack\.us$ -(^|\.)imagevenue\.com$ -(^|\.)imagezilla\.net$ -(^|\.)imb\.org$ -(^|\.)imdb\.com$ -(^|\.)img$ -(^|\.)img\.dlsite\.jp$ -(^|\.)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$ -(^|\.)in99\.org$ -(^|\.)incapdns\.net$ -(^|\.)incloak\.com$ -(^|\.)incredibox\.fr$ -(^|\.)indiandefensenews\.in$ -(^|\.)indiemerch\.com$ -(^|\.)info-graf\.fr$ -(^|\.)initiativesforchina\.org$ -(^|\.)inkui\.com$ -(^|\.)inmediahk\.net$ -(^|\.)innermongolia\.org$ -(^|\.)inote\.tw$ -(^|\.)insecam\.org$ -(^|\.)insidevoa\.com$ -(^|\.)instagram\.com$ -(^|\.)instanthq\.com$ -(^|\.)institut-tibetain\.org$ -(^|\.)internet\.org$ -(^|\.)internetdefenseleague\.org$ -(^|\.)internetfreedom\.org$ -(^|\.)internetpopculture\.com$ -(^|\.)investigating\.wordpress\.com$ -(^|\.)inxian\.com$ -(^|\.)iownyour\.biz$ -(^|\.)iownyour\.org$ -(^|\.)ipalter\.com$ -(^|\.)ipfire\.org$ -(^|\.)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$ -(^|\.)iredmail\.org$ -(^|\.)ironbigfools\.compython\.net$ -(^|\.)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$ -(^|\.)istiqlalhewer\.com$ -(^|\.)istockphoto\.com$ -(^|\.)isunaffairs\.com$ -(^|\.)isuntv\.com$ -(^|\.)itaboo\.info$ -(^|\.)itaiwan\.gov\.tw$ -(^|\.)italiatibet\.org$ -(^|\.)itasoftware\.com$ -(^|\.)itemdb\.com$ -(^|\.)ithelp\.ithome\.com\.tw$ -(^|\.)its\.caltech\.edu$ -(^|\.)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$ -(^|\.)izaobao\.us$ -(^|\.)izles\.net$ -(^|\.)izlesem\.org$ -(^|\.)j\.mp$ -(^|\.)ja\.wikipedia\.org$ -(^|\.)jamaat\.org$ -(^|\.)jamyangnorbu\.com$ -(^|\.)jandyx\.com$ -(^|\.)janwongphoto\.com$ -(^|\.)japan-whores\.com$ -(^|\.)japanfirst\.asianfreeforum\.com$ -(^|\.)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$ -(^|\.)jfqu36\.club$ -(^|\.)jfqu37\.xyz$ -(^|\.)jgoodies\.com$ -(^|\.)jiangweiping\.com$ -(^|\.)jiaoyou8\.com$ -(^|\.)jiehua\.cz$ -(^|\.)jieshibaobao\.com$ -(^|\.)jigglegifs\.com$ -(^|\.)jigong1024\.com$ -(^|\.)jihadintel\.meforum\.org$ -(^|\.)jihadology\.net$ -(^|\.)jiji\.com$ -(^|\.)jims\.net$ -(^|\.)jinbushe\.org$ -(^|\.)jingpin\.org$ -(^|\.)jingsim\.org$ -(^|\.)jinpianwang\.com$ -(^|\.)jinroukong\.com$ -(^|\.)jitouch\.com$ -(^|\.)jizzthis\.com$ -(^|\.)jjgirls\.com$ -(^|\.)jkb\.cc$ -(^|\.)jkforum\.net$ -(^|\.)jkub\.com$ -(^|\.)jma\.go\.jp$ -(^|\.)jmscult\.com$ -(^|\.)joachims\.org$ -(^|\.)jobnewera\.wordpress\.com$ -(^|\.)jobso\.tv$ -(^|\.)journalchretien\.net$ -(^|\.)journalofdemocracy\.org$ -(^|\.)joymiihub\.com$ -(^|\.)joyourself\.com$ -(^|\.)jp\.hao123\.com$ -(^|\.)jpl\.nasa\.gov$ -(^|\.)jpopforum\.net$ -(^|\.)jubushoushen\.com$ -(^|\.)juhuaren\.com$ -(^|\.)jukujo-club\.com$ -(^|\.)juliepost\.com$ -(^|\.)juliereyc\.com$ -(^|\.)junauza\.com$ -(^|\.)june4commemoration\.org$ -(^|\.)junefourth-20\.net$ -(^|\.)jungleheart\.com$ -(^|\.)juoaa\.com$ -(^|\.)justdied\.com$ -(^|\.)justfreevpn\.com$ -(^|\.)justicefortenzin\.org$ -(^|\.)justpaste\.it$ -(^|\.)justtristan\.com$ -(^|\.)juyuange\.org$ -(^|\.)juziyue\.com$ -(^|\.)jwmusic\.org$ -(^|\.)jyxf\.net$ -(^|\.)k-doujin\.net$ -(^|\.)ka-wai\.com$ -(^|\.)kagyu\.org$ -(^|\.)kagyu\.org\.za$ -(^|\.)kagyumonlam\.org$ -(^|\.)kagyunews\.com\.hk$ -(^|\.)kagyuoffice\.org$ -(^|\.)kagyuoffice\.org\.tw$ -(^|\.)kaiyuan\.de$ -(^|\.)kakao\.com$ -(^|\.)kalachakralugano\.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$ -(^|\.)kb\.monitorware\.com$ -(^|\.)kba-tx\.org$ -(^|\.)kcoolonline\.com$ -(^|\.)kebrum\.com$ -(^|\.)kechara\.com$ -(^|\.)keepandshare\.com$ -(^|\.)keezmovies\.com$ -(^|\.)kendatire\.com$ -(^|\.)kendincos\.net$ -(^|\.)kenengba\.com$ -(^|\.)keontech\.net$ -(^|\.)kepard\.com$ -(^|\.)keycdn\.com$ -(^|\.)khabdha\.org$ -(^|\.)khatrimaza\.org$ -(^|\.)khmusic\.com\.tw$ -(^|\.)kichiku-doujinko\.com$ -(^|\.)kik\.com$ -(^|\.)killwall\.com$ -(^|\.)kindleren\.com$ -(^|\.)kineox\.free\.fr$ -(^|\.)kingdomsalvation\.org$ -(^|\.)kinghost\.com$ -(^|\.)kingstone\.com\.tw$ -(^|\.)kink\.com$ -(^|\.)kinmen\.org\.tw$ -(^|\.)kinmen\.travel$ -(^|\.)kir\.jp$ -(^|\.)kissbbao\.cn$ -(^|\.)kiwi\.kz$ -(^|\.)kk-whys\.co\.jp$ -(^|\.)kkbox\.com$ -(^|\.)kknews\.cc$ -(^|\.)kmuh\.org\.tw$ -(^|\.)knowledgerush\.com$ -(^|\.)kobo\.com$ -(^|\.)kobobooks\.com$ -(^|\.)kodingen\.com$ -(^|\.)kompozer\.net$ -(^|\.)konachan\.com$ -(^|\.)kone\.com$ -(^|\.)koolsolutions\.com$ -(^|\.)koornk\.com$ -(^|\.)koranmandarin\.com$ -(^|\.)korenan2\.com$ -(^|\.)ksdl\.org$ -(^|\.)ksnews\.com\.tw$ -(^|\.)ktzhk\.com$ -(^|\.)kui\.name$ -(^|\.)kun\.im$ -(^|\.)kurashsultan\.com$ -(^|\.)kurtmunger\.com$ -(^|\.)kusocity\.com$ -(^|\.)kwcg\.ca$ -(^|\.)kwongwah\.com\.my$ -(^|\.)kxsw\.life$ -(^|\.)kyofun\.com$ -(^|\.)kyohk\.net$ -(^|\.)kyoyue\.com$ -(^|\.)kyzyhello\.com$ -(^|\.)kzeng\.info$ -(^|\.)la-forum\.org$ -(^|\.)labiennale\.org$ -(^|\.)ladbrokes\.com$ -(^|\.)lagranepoca\.com$ -(^|\.)lalulalu\.com$ -(^|\.)lama\.com\.tw$ -(^|\.)lamayeshe\.com$ -(^|\.)lamnia\.co\.uk$ -(^|\.)lamrim\.com$ -(^|\.)lanterncn\.cn$ -(^|\.)lantosfoundation\.org$ -(^|\.)laod\.cn$ -(^|\.)laogai\.org$ -(^|\.)laomiu\.com$ -(^|\.)laoyang\.info$ -(^|\.)laptoplockdown\.com$ -(^|\.)laqingdan\.net$ -(^|\.)larsgeorge\.com$ -(^|\.)lastcombat\.com$ -(^|\.)lastfm\.es$ -(^|\.)latelinenews\.com$ -(^|\.)latibet\.org$ -(^|\.)ld\.hao123img\.com$ -(^|\.)le-vpn\.com$ -(^|\.)leafyvpn\.net$ -(^|\.)lecloud\.net$ -(^|\.)leeao\.com\.cn$ -(^|\.)lefora\.com$ -(^|\.)left21\.hk$ -(^|\.)legalporno\.com$ -(^|\.)legaltech\.law\.com$ -(^|\.)legsjapan\.com$ -(^|\.)leirentv\.ca$ -(^|\.)leisurecafe\.ca$ -(^|\.)leisurepro\.com$ -(^|\.)lematin\.ch$ -(^|\.)lemonde\.fr$ -(^|\.)lenwhite\.com$ -(^|\.)lerosua\.org$ -(^|\.)lers\.google$ -(^|\.)lesoir\.be$ -(^|\.)letou\.com$ -(^|\.)letscorp\.net$ -(^|\.)lflink\.com$ -(^|\.)lflinkup\.com$ -(^|\.)lflinkup\.net$ -(^|\.)lflinkup\.org$ -(^|\.)lhakar\.org$ -(^|\.)lhasocialwork\.org$ -(^|\.)liangyou\.net$ -(^|\.)lianyue\.net$ -(^|\.)liaowangxizang\.net$ -(^|\.)liberal\.org\.hk$ -(^|\.)libertytimes\.com\.tw$ -(^|\.)library\.usc\.cuhk\.edu\.hk$ -(^|\.)lidecheng\.com$ -(^|\.)lifemiles\.com$ -(^|\.)lighten\.org\.tw$ -(^|\.)lightnovel\.cn$ -(^|\.)like\.com$ -(^|\.)limiao\.net$ -(^|\.)line-apps\.com$ -(^|\.)line-scdn\.net$ -(^|\.)line\.me$ -(^|\.)line\.naver\.jp$ -(^|\.)linglingfa\.com$ -(^|\.)lingvodics\.com$ -(^|\.)link-o-rama\.com$ -(^|\.)linkideo\.com$ -(^|\.)linkuswell\.com$ -(^|\.)linux\.org\.hk$ -(^|\.)linuxtoy\.org$ -(^|\.)lionsroar\.com$ -(^|\.)lipuman\.com$ -(^|\.)liquidvpn\.com$ -(^|\.)listentoyoutube\.com$ -(^|\.)listorious\.com$ -(^|\.)lists\.w3\.org$ -(^|\.)liudejun\.com$ -(^|\.)liuhanyu\.com$ -(^|\.)liujianshu\.com$ -(^|\.)liuxiaobo\.net$ -(^|\.)liuxiaotong\.com$ -(^|\.)livedoor\.jp$ -(^|\.)liveleak\.com$ -(^|\.)livestation\.com$ -(^|\.)livestream\.com$ -(^|\.)livevideo\.com$ -(^|\.)livingonline\.us$ -(^|\.)livingstream\.com$ -(^|\.)liwangyang\.com$ -(^|\.)lizhizhuangbi\.com$ -(^|\.)lkcn\.net$ -(^|\.)llss\.me$ -(^|\.)load\.to$ -(^|\.)lobsangwangyal\.com$ -(^|\.)localdomain\.ws$ -(^|\.)localpresshk\.com$ -(^|\.)lockestek\.com$ -(^|\.)logbot\.net$ -(^|\.)logiqx\.com$ -(^|\.)londonchinese\.ca$ -(^|\.)longhair\.hk$ -(^|\.)longmusic\.com$ -(^|\.)longtermly\.net$ -(^|\.)longtoes\.com$ -(^|\.)lookpic\.com$ -(^|\.)looktoronto\.com$ -(^|\.)lotsawahouse\.org$ -(^|\.)lotuslight\.org\.hk$ -(^|\.)lotuslight\.org\.tw$ -(^|\.)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$ -(^|\.)luke54\.com$ -(^|\.)luke54\.org$ -(^|\.)lupm\.org$ -(^|\.)lushstories\.com$ -(^|\.)luxebc\.com$ -(^|\.)lvhai\.org$ -(^|\.)lvv2\.com$ -(^|\.)lyfhk\.net$ -(^|\.)lzmtnews\.org$ -(^|\.)m\.hkgalden\.com$ -(^|\.)m\.me$ -(^|\.)m\.plixi\.com$ -(^|\.)m\.slandr\.net$ -(^|\.)ma\.hao123\.com$ -(^|\.)macgamestore\.com$ -(^|\.)macrovpn\.com$ -(^|\.)macts\.com\.tw$ -(^|\.)mad-ar\.ch$ -(^|\.)madewithcode\.com$ -(^|\.)madonna-av\.com$ -(^|\.)madthumbs\.com$ -(^|\.)magazines\.sina\.com\.tw$ -(^|\.)magic-net\.info$ -(^|\.)mahabodhi\.org$ -(^|\.)maiio\.net$ -(^|\.)mail-archive\.com$ -(^|\.)maildns\.xyz$ -(^|\.)maiplus\.com$ -(^|\.)maizhong\.org$ -(^|\.)makemymood\.com$ -(^|\.)makkahnewspaper\.com$ -(^|\.)makzhou\.warehouse333\.com$ -(^|\.)malaysiakini\.com$ -(^|\.)mamingzhe\.com$ -(^|\.)manchukuo\.net$ -(^|\.)mangafox\.com$ -(^|\.)mangafox\.me$ -(^|\.)maniash\.com$ -(^|\.)manicur4ik\.ru$ -(^|\.)mansion\.com$ -(^|\.)mansionpoker\.com$ -(^|\.)manta\.com$ -(^|\.)maplew\.com$ -(^|\.)marc\.info$ -(^|\.)marguerite\.su$ -(^|\.)martau\.com$ -(^|\.)martincartoons\.com$ -(^|\.)martsangkagyuofficial\.org$ -(^|\.)maruta\.be$ -(^|\.)marxist\.com$ -(^|\.)marxist\.net$ -(^|\.)marxists\.org$ -(^|\.)mash\.to$ -(^|\.)maskedip\.com$ -(^|\.)matainja\.com$ -(^|\.)material\.io$ -(^|\.)mathable\.io$ -(^|\.)mathiew-badimon\.com$ -(^|\.)matome-plus\.com$ -(^|\.)matome-plus\.net$ -(^|\.)matsushimakaede\.com$ -(^|\.)mattwilcox\.net$ -(^|\.)maturejp\.com$ -(^|\.)maxing\.jp$ -(^|\.)mayimayi\.com$ -(^|\.)mcadforums\.com$ -(^|\.)mcaf\.ee$ -(^|\.)mcfog\.com$ -(^|\.)mcreasite\.com$ -(^|\.)md-t\.org$ -(^|\.)me\.youthwant\.com\.tw$ -(^|\.)meansys\.com$ -(^|\.)media\.nu\.nl$ -(^|\.)media\.org\.hk$ -(^|\.)mediachinese\.com$ -(^|\.)mediafire\.com$ -(^|\.)mediafreakcity\.com$ -(^|\.)medium\.com$ -(^|\.)meetav\.com$ -(^|\.)meetup\.com$ -(^|\.)mefeedia\.com$ -(^|\.)mefound\.com$ -(^|\.)mega\.nz$ -(^|\.)megaproxy\.com$ -(^|\.)megarotic\.com$ -(^|\.)megavideo\.com$ -(^|\.)megurineluka\.com$ -(^|\.)meirixiaochao\.com$ -(^|\.)melon-peach\.com$ -(^|\.)meltoday\.com$ -(^|\.)meme\.yahoo\.com$ -(^|\.)memehk\.com$ -(^|\.)memorybbs\.com$ -(^|\.)memri\.org$ -(^|\.)memrijttm\.org$ -(^|\.)mercyprophet\.org$ -(^|\.)meridian-trust\.org$ -(^|\.)meripet\.biz$ -(^|\.)meripet\.com$ -(^|\.)merit-times\.com\.tw$ -(^|\.)meshrep\.com$ -(^|\.)mesotw\.com$ -(^|\.)messenger\.com$ -(^|\.)metacafe\.com$ -(^|\.)metarthunter\.com$ -(^|\.)meteorshowersonline\.com$ -(^|\.)metrohk\.com\.hk$ -(^|\.)metrolife\.ca$ -(^|\.)metroradio\.com\.hk$ -(^|\.)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$ -(^|\.)mike\.cz\.cc$ -(^|\.)mikesoltys\.com$ -(^|\.)milph\.net$ -(^|\.)milsurps\.com$ -(^|\.)mimiai\.net$ -(^|\.)mimivip\.com$ -(^|\.)mimivv\.com$ -(^|\.)mindrolling\.org$ -(^|\.)minghui-a\.org$ -(^|\.)minghui-b\.org$ -(^|\.)minghui-school\.org$ -(^|\.)minghui\.or\.kr$ -(^|\.)minghui\.org$ -(^|\.)minghuiyw\.wordpress\.com$ -(^|\.)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$ -(^|\.)mist\.vip$ -(^|\.)mitao\.com\.tw$ -(^|\.)mitbbs\.com$ -(^|\.)mitbbsau\.com$ -(^|\.)mixero\.com$ -(^|\.)mixpod\.com$ -(^|\.)mixx\.com$ -(^|\.)mizzmona\.com$ -(^|\.)mjib\.gov\.tw$ -(^|\.)mjlsh\.usc\.cuhk\.edu\.hk$ -(^|\.)mk5000\.com$ -(^|\.)mlcool\.com$ -(^|\.)mm-cg\.com$ -(^|\.)mmaaxx\.com$ -(^|\.)mmmca\.com$ -(^|\.)mnewstv\.com$ -(^|\.)mo\.nightlife141\.com$ -(^|\.)mobatek\.net$ -(^|\.)mobile01\.com$ -(^|\.)mobileways\.de$ -(^|\.)moby\.to$ -(^|\.)mobypicture\.com$ -(^|\.)moeaic\.gov\.tw$ -(^|\.)moeerolibrary\.com$ -(^|\.)mofaxiehui\.com$ -(^|\.)mofos\.com$ -(^|\.)mog\.com$ -(^|\.)mol\.gov\.tw$ -(^|\.)molihua\.org$ -(^|\.)mondex\.org$ -(^|\.)money-link\.com\.tw$ -(^|\.)moneyhome\.biz$ -(^|\.)monitorchina\.org$ -(^|\.)monster\.com$ -(^|\.)moodyz\.com$ -(^|\.)moonbbs\.com$ -(^|\.)morningsun\.org$ -(^|\.)moroneta\.com$ -(^|\.)mos\.ru$ -(^|\.)motherless\.com$ -(^|\.)motor4ik\.ru$ -(^|\.)mousebreaker\.com$ -(^|\.)movements\.org$ -(^|\.)moviefap\.com$ -(^|\.)mp3buscador\.com$ -(^|\.)mp3ye\.eu$ -(^|\.)mpettis\.com$ -(^|\.)mpfinance\.com$ -(^|\.)mpinews\.com$ -(^|\.)mponline\.hk$ -(^|\.)mqxd\.org$ -(^|\.)mrbasic\.com$ -(^|\.)mrbonus\.com$ -(^|\.)mrface\.com$ -(^|\.)mrslove\.com$ -(^|\.)mrtweet\.com$ -(^|\.)msguancha\.com$ -(^|\.)msha\.gov$ -(^|\.)mswe1\.org$ -(^|\.)mthruf\.com$ -(^|\.)mtw\.tl$ -(^|\.)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$ -(^|\.)mx\.hao123\.com$ -(^|\.)mx981\.com$ -(^|\.)my-formosa\.com$ -(^|\.)my-private-network\.co\.uk$ -(^|\.)my-proxy\.com$ -(^|\.)my\.mail\.ru$ -(^|\.)my\.opera\.com$ -(^|\.)my\.pcloud\.com$ -(^|\.)my03\.com$ -(^|\.)myactimes\.com$ -(^|\.)myanniu\.com$ -(^|\.)myaudiocast\.com$ -(^|\.)myav\.com\.tw$ -(^|\.)mybbs\.us$ -(^|\.)mybet\.com$ -(^|\.)myca168\.com$ -(^|\.)mycanadanow\.com$ -(^|\.)mychinamyhome\.com$ -(^|\.)mychinanet\.com$ -(^|\.)mychinanews\.com$ -(^|\.)mychinese\.news$ -(^|\.)mycnnews\.com$ -(^|\.)mycould\.com$ -(^|\.)mydad\.info$ -(^|\.)myddns\.com$ -(^|\.)myeasytv\.com$ -(^|\.)myeclipseide\.com$ -(^|\.)myforum\.com\.hk$ -(^|\.)myforum\.com\.uk$ -(^|\.)myfreecams\.com$ -(^|\.)myfreepaysite\.com$ -(^|\.)myfreshnet\.com$ -(^|\.)myftp\.info$ -(^|\.)myftp\.name$ -(^|\.)myiphide\.com$ -(^|\.)mykomica\.org$ -(^|\.)mylftv\.com$ -(^|\.)mymediarom\.com$ -(^|\.)mymoe\.moe$ -(^|\.)mymom\.info$ -(^|\.)mymusic\.net\.tw$ -(^|\.)mynetav\.net$ -(^|\.)mynetav\.org$ -(^|\.)mynumber\.org$ -(^|\.)myparagliding\.com$ -(^|\.)mypicture\.info$ -(^|\.)mypop3\.net$ -(^|\.)mypop3\.org$ -(^|\.)mypopescu\.com$ -(^|\.)myradio\.hk$ -(^|\.)myreadingmanga\.info$ -(^|\.)mysecondarydns\.com$ -(^|\.)myshare\.url\.com\.tw$ -(^|\.)mysinablog\.com$ -(^|\.)mysite\.verizon\.net$ -(^|\.)myspace\.com$ -(^|\.)myspacecdn\.com$ -(^|\.)mytalkbox\.com$ -(^|\.)mytizi\.com$ -(^|\.)mywww\.biz$ -(^|\.)myz\.info$ -(^|\.)naacoalition\.org$ -(^|\.)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$ -(^|\.)nat\.gov\.tw$ -(^|\.)nat\.moe$ -(^|\.)national-lottery\.co\.uk$ -(^|\.)nationsonline\.org$ -(^|\.)nationwide\.com$ -(^|\.)naughtyamerica\.com$ -(^|\.)navyfamily\.navy\.mil$ -(^|\.)navyreserve\.navy\.mil$ -(^|\.)naweeklytimes\.com$ -(^|\.)nbtvpn\.com$ -(^|\.)nccwatch\.org\.tw$ -(^|\.)nch\.com\.tw$ -(^|\.)ncn\.org$ -(^|\.)nde\.de$ -(^|\.)ndr\.de$ -(^|\.)ned\.org$ -(^|\.)nekoslovakia\.net$ -(^|\.)nemesis2\.qx\.net$ -(^|\.)neo-miracle\.com$ -(^|\.)nepusoku\.com$ -(^|\.)net-fits\.pro$ -(^|\.)netbirds\.com$ -(^|\.)netcolony\.com$ -(^|\.)netflix\.com$ -(^|\.)netme\.cc$ -(^|\.)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$ -(^|\.)newipnow\.com$ -(^|\.)newlandmagazine\.com\.au$ -(^|\.)newnews\.ca$ -(^|\.)news\.bbc\.co\.uk$ -(^|\.)news\.cnyes\.com$ -(^|\.)news\.hk\.msn\.com$ -(^|\.)news\.hkpeanut\.com$ -(^|\.)news\.msn\.com\.tw$ -(^|\.)news\.nationalgeographic\.com$ -(^|\.)news\.now\.com$ -(^|\.)news\.now\.com%2fhome$ -(^|\.)news\.omy\.sg$ -(^|\.)news\.seehua\.com$ -(^|\.)news\.sina\.com\.hk$ -(^|\.)news\.sina\.com\.tw$ -(^|\.)news\.sinchew\.com\.my$ -(^|\.)news\.singtao\.ca$ -(^|\.)news\.tvb\.com$ -(^|\.)news\.tvbs\.com\.tw$ -(^|\.)news\.yahoo\.com$ -(^|\.)news100\.com\.tw$ -(^|\.)newsancai\.com$ -(^|\.)newschinacomment\.org$ -(^|\.)newscn\.org$ -(^|\.)newsdetox\.ca$ -(^|\.)newsdh\.com$ -(^|\.)newsforums\.bbc\.co\.uk$ -(^|\.)newspeak\.cc$ -(^|\.)newstamago\.com$ -(^|\.)newstapa\.org$ -(^|\.)newstarnet\.com$ -(^|\.)newtaiwan\.com\.tw$ -(^|\.)newtalk\.tw$ -(^|\.)newyorktimes\.com$ -(^|\.)nexon\.com$ -(^|\.)next11\.co\.jp$ -(^|\.)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$ -(^|\.)nga\.mil$ -(^|\.)ngensis\.com$ -(^|\.)nhentai\.net$ -(^|\.)nhi\.gov\.tw$ -(^|\.)nhk-ondemand\.jp$ -(^|\.)nic\.cz\.cc$ -(^|\.)nic\.google$ -(^|\.)nic\.gov$ -(^|\.)nicovideo\.jp$ -(^|\.)nighost\.org$ -(^|\.)nikkei\.com$ -(^|\.)ninecommentaries\.com$ -(^|\.)ninjacloak\.com$ -(^|\.)ninjaproxy\.ninja$ -(^|\.)nintendium\.com$ -(^|\.)ninth\.biz$ -(^|\.)niusnews\.com$ -(^|\.)njactb\.org$ -(^|\.)njuice\.com$ -(^|\.)nko\.navy\.mil$ -(^|\.)nlfreevpn\.com$ -(^|\.)no-ip\.org$ -(^|\.)nobel\.se$ -(^|\.)nobelprize\.org$ -(^|\.)nobodycanstop\.us$ -(^|\.)nokogiri\.org$ -(^|\.)nokola\.com$ -(^|\.)noodlevpn\.com$ -(^|\.)norbulingka\.org$ -(^|\.)nordstrom\.com$ -(^|\.)nordstromimage\.com$ -(^|\.)nordstromrack\.com$ -(^|\.)nordvpn\.com$ -(^|\.)nottinghampost\.com$ -(^|\.)novelasia\.com$ -(^|\.)now\.im$ -(^|\.)nownews\.com$ -(^|\.)nowtorrents\.com$ -(^|\.)noypf\.com$ -(^|\.)npa\.go\.jp$ -(^|\.)npa\.gov\.tw$ -(^|\.)npnt\.me$ -(^|\.)nps\.gov$ -(^|\.)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\.cz$ -(^|\.)ntdtv\.org$ -(^|\.)ntdtv\.ru$ -(^|\.)ntdtvla\.com$ -(^|\.)ntrfun\.com$ -(^|\.)ntsna\.gov\.tw$ -(^|\.)nubiles\.net$ -(^|\.)nuexpo\.com$ -(^|\.)nukistream\.com$ -(^|\.)nurgo-software\.com$ -(^|\.)nusatrip\.com$ -(^|\.)nutaku\.net$ -(^|\.)nuuvem\.com$ -(^|\.)nuvid\.com$ -(^|\.)nuzcom\.com$ -(^|\.)nvdst\.com$ -(^|\.)nvquan\.org$ -(^|\.)nvtongzhisheng\.org$ -(^|\.)nwtca\.org$ -(^|\.)ny\.stgloballink\.com$ -(^|\.)ny\.visiontimes\.com$ -(^|\.)nyaa\.eu$ -(^|\.)nyaa\.si$ -(^|\.)nydus\.ca$ -(^|\.)nylon-angel\.com$ -(^|\.)nylonstockingsonline\.com$ -(^|\.)nyt\.com$ -(^|\.)nytchina\.com$ -(^|\.)nytcn\.me$ -(^|\.)nytco\.com$ -(^|\.)nyti\.ms$ -(^|\.)nytimes\.com$ -(^|\.)nytimes\.map\.fastly\.net$ -(^|\.)nytimg\.com$ -(^|\.)nytstyle\.com$ -(^|\.)nzchinese\.com$ -(^|\.)nzchinese\.net\.nz$ -(^|\.)observechina\.net$ -(^|\.)obutu\.com$ -(^|\.)ocaspro\.com$ -(^|\.)occupytiananmen\.com$ -(^|\.)oclp\.hk$ -(^|\.)ocreampies\.com$ -(^|\.)ocry\.com$ -(^|\.)october-review\.org$ -(^|\.)oculus\.com$ -(^|\.)oculuscdn\.com$ -(^|\.)offbeatchina\.com$ -(^|\.)officeoftibet\.com$ -(^|\.)ofile\.org$ -(^|\.)ogaoga\.org$ -(^|\.)ogate\.org$ -(^|\.)oikos\.com\.tw$ -(^|\.)oiktv\.com$ -(^|\.)oizoblog\.com$ -(^|\.)ok\.ru$ -(^|\.)okayfreedom\.com$ -(^|\.)okk\.tw$ -(^|\.)old-cat\.net$ -(^|\.)old\.honeynet\.org$ -(^|\.)old\.nabble\.com$ -(^|\.)olumpo\.com$ -(^|\.)olympicwatch\.org$ -(^|\.)omgili\.com$ -(^|\.)omni7\.jp$ -(^|\.)omnitalk\.com$ -(^|\.)omnitalk\.org$ -(^|\.)on\.cc$ -(^|\.)on2\.com$ -(^|\.)onapp\.com$ -(^|\.)onedrive\.live\.com$ -(^|\.)onedumb\.com$ -(^|\.)onion\.city$ -(^|\.)online\.recoveryversion\.org$ -(^|\.)onlinecha\.com$ -(^|\.)onlineyoutube\.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$ -(^|\.)openvpn\.net$ -(^|\.)openwebster\.com$ -(^|\.)openwrt\.org\.cn$ -(^|\.)opml\.radiotime\.com$ -(^|\.)organcare\.org\.tw$ -(^|\.)organharvestinvestigation\.net$ -(^|\.)organiccrap\.com$ -(^|\.)orgasm\.com$ -(^|\.)orgfree\.com$ -(^|\.)orient-doll\.com$ -(^|\.)orientaldaily\.com\.my$ -(^|\.)orn\.jp$ -(^|\.)orzistic\.org$ -(^|\.)osfoora\.com$ -(^|\.)otnd\.org$ -(^|\.)otto\.de$ -(^|\.)otzo\.com$ -(^|\.)ourdearamy\.com$ -(^|\.)ourhobby\.com$ -(^|\.)oursogo\.com$ -(^|\.)oursteps\.com\.au$ -(^|\.)oursweb\.net$ -(^|\.)ourtv\.hk$ -(^|\.)overplay\.net$ -(^|\.)oversea\.istarshine\.com$ -(^|\.)ow\.ly$ -(^|\.)owl\.li$ -(^|\.)oyax\.com$ -(^|\.)oyghan\.com$ -(^|\.)ozchinese\.com$ -(^|\.)ozvoice\.org$ -(^|\.)ozxw\.com$ -(^|\.)ozyoyo\.com$ -(^|\.)pachosting\.com$ -(^|\.)pacificpoker\.com$ -(^|\.)packages\.debian\.org$ -(^|\.)packetix\.net$ -(^|\.)pacopacomama\.com$ -(^|\.)padmanet\.com$ -(^|\.)page\.bid\.yahoo\.com$ -(^|\.)page2rss\.com$ -(^|\.)pagodabox\.com$ -(^|\.)palacemoon\.com$ -(^|\.)paldengyal\.com$ -(^|\.)paljorpublications\.com$ -(^|\.)paltalk\.com$ -(^|\.)panacom\.co\.jp$ -(^|\.)panamapapers\.sueddeutsche\.de$ -(^|\.)pandapow\.co$ -(^|\.)pandapow\.net$ -(^|\.)pandavpn-jp\.com$ -(^|\.)pandora\.com$ -(^|\.)pandora\.tv$ -(^|\.)pangci\.net$ -(^|\.)panluan\.net$ -(^|\.)panoramio\.com$ -(^|\.)pao-pao\.net$ -(^|\.)paper\.li$ -(^|\.)paperb\.us$ -(^|\.)paradisehill\.cc$ -(^|\.)paradisepoker\.com$ -(^|\.)parkansky\.com$ -(^|\.)partycasino\.com$ -(^|\.)partypoker\.com$ -(^|\.)passion\.com$ -(^|\.)passiontimes\.hk$ -(^|\.)pastebin\.com$ -(^|\.)pastie\.org$ -(^|\.)pbs\.org$ -(^|\.)pbwiki\.com$ -(^|\.)pbworks\.com$ -(^|\.)pbxes\.com$ -(^|\.)pbxes\.org$ -(^|\.)pcanywhere\.net$ -(^|\.)pcc\.gov\.tw$ -(^|\.)pcdvd\.com\.tw$ -(^|\.)pchome\.com\.tw$ -(^|\.)pcij\.org$ -(^|\.)pcstore\.com\.tw$ -(^|\.)pct\.org\.tw$ -(^|\.)pdetails\.com$ -(^|\.)pdproxy\.com$ -(^|\.)pds\.nasa\.gov$ -(^|\.)peace\.ca$ -(^|\.)peacefire\.org$ -(^|\.)peacehall\.com$ -(^|\.)pearlher\.org$ -(^|\.)peeasian\.com$ -(^|\.)pekingduck\.org$ -(^|\.)pemulihan\.or\.id$ -(^|\.)pen\.io$ -(^|\.)penchinese\.com$ -(^|\.)penchinese\.net$ -(^|\.)pengyulong\.com$ -(^|\.)penisbot\.com$ -(^|\.)penthouse\.com$ -(^|\.)pentoy\.hk$ -(^|\.)peoplebookcafe\.com$ -(^|\.)peoplenews\.tw$ -(^|\.)peopo\.org$ -(^|\.)percy\.in$ -(^|\.)perfectgirls\.net$ -(^|\.)perfectvpn\.net$ -(^|\.)periscope\.tv$ -(^|\.)persecutionblog\.com$ -(^|\.)persiankitty\.com$ -(^|\.)pfd\.org\.hk$ -(^|\.)phapluan\.org$ -(^|\.)phayul\.com$ -(^|\.)philborges\.com$ -(^|\.)philly\.com$ -(^|\.)phmsociety\.org$ -(^|\.)phncdn\.com$ -(^|\.)phobos\.apple\.com$ -(^|\.)phosphation13\.rssing\.com$ -(^|\.)photodharma\.net$ -(^|\.)photofocus\.com$ -(^|\.)phuquocservices\.com$ -(^|\.)picacomic\.com$ -(^|\.)picacomiccn\.com$ -(^|\.)picasaweb\.com$ -(^|\.)picidae\.net$ -(^|\.)pictures\.playboy\.com$ -(^|\.)picturesocial\.com$ -(^|\.)pin-cong\.com$ -(^|\.)pin6\.com$ -(^|\.)ping\.fm$ -(^|\.)pinimg\.com$ -(^|\.)pinkrod\.com$ -(^|\.)pinoy-n\.com$ -(^|\.)pinterest\.at$ -(^|\.)pinterest\.co\.kr$ -(^|\.)pinterest\.co\.uk$ -(^|\.)pinterest\.com$ -(^|\.)pinterest\.de$ -(^|\.)pinterest\.dk$ -(^|\.)pinterest\.fr$ -(^|\.)pinterest\.jp$ -(^|\.)pinterest\.nl$ -(^|\.)pinterest\.se$ -(^|\.)pioneer-worker\.forums-free\.com$ -(^|\.)pipii\.tv$ -(^|\.)piposay\.com$ -(^|\.)piraattilahti\.org$ -(^|\.)piring\.com$ -(^|\.)pixelqi\.com$ -(^|\.)pixiv\.net$ -(^|\.)pixnet\.net$ -(^|\.)pk\.com$ -(^|\.)placemix\.com$ -(^|\.)playboy\.com$ -(^|\.)playboyplus\.com$ -(^|\.)player\.fm$ -(^|\.)playno1\.com$ -(^|\.)playpcesor\.com$ -(^|\.)plays\.com\.tw$ -(^|\.)plm\.org\.hk$ -(^|\.)plunder\.com$ -(^|\.)plus28\.com$ -(^|\.)plusbb\.com$ -(^|\.)pmatehunter\.com$ -(^|\.)pmates\.com$ -(^|\.)po2b\.com$ -(^|\.)pobieramy\.top$ -(^|\.)podictionary\.com$ -(^|\.)pokerstars\.net$ -(^|\.)politicalchina\.org$ -(^|\.)politicalconsultation\.org$ -(^|\.)poloniex\.com$ -(^|\.)polymer-project\.org$ -(^|\.)polymerhk\.com$ -(^|\.)popo\.tw$ -(^|\.)popvote\.hk$ -(^|\.)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$ -(^|\.)potvpn\.com$ -(^|\.)power\.com$ -(^|\.)powerapple\.com$ -(^|\.)powercx\.com$ -(^|\.)powerphoto\.org$ -(^|\.)prayforchina\.net$ -(^|\.)premeforwindows7\.com$ -(^|\.)presentationzen\.com$ -(^|\.)presidentlee\.tw$ -(^|\.)prestige-av\.com$ -(^|\.)prisoner-state-secret-journal-premier$ -(^|\.)prisoneralert\.com$ -(^|\.)pritunl\.com$ -(^|\.)privacybox\.de$ -(^|\.)private\.com$ -(^|\.)privateinternetaccess\.com$ -(^|\.)privatepaste\.com$ -(^|\.)privatetunnel\.com$ -(^|\.)privatevpn\.com$ -(^|\.)procopytips\.com$ -(^|\.)prosiben\.de$ -(^|\.)provideocoalition\.com$ -(^|\.)provpnaccounts\.com$ -(^|\.)proxfree\.com$ -(^|\.)proxifier\.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$ -(^|\.)psiphon\.ca$ -(^|\.)psiphon\.civisec\.org$ -(^|\.)psiphon3\.com$ -(^|\.)psiphontoday\.com$ -(^|\.)pts\.org\.tw$ -(^|\.)ptt\.cc$ -(^|\.)pttvan\.org$ -(^|\.)pubu\.com\.tw$ -(^|\.)puffinbrowser\.com$ -(^|\.)puffstore\.com$ -(^|\.)pullfolio\.com$ -(^|\.)pulse\.yahoo\.com$ -(^|\.)punyu\.com$ -(^|\.)pure18\.com$ -(^|\.)pureconcepts\.net$ -(^|\.)pureinsight\.org$ -(^|\.)purepdf\.com$ -(^|\.)purevpn\.com$ -(^|\.)purplelotus\.org$ -(^|\.)pursuestar\.com$ -(^|\.)pushchinawall\.com$ -(^|\.)pussyspace\.com$ -(^|\.)putihome\.org$ -(^|\.)putlocker\.com$ -(^|\.)putty\.org$ -(^|\.)puuko\.com$ -(^|\.)pwned\.com$ -(^|\.)python\.com$ -(^|\.)python\.com\.tw$ -(^|\.)pythonhackers\.com$ -(^|\.)q%3dfreedom$ -(^|\.)q%3dtriangle$ -(^|\.)q=freedom$ -(^|\.)q=triangle$ -(^|\.)qanote\.com$ -(^|\.)qgirl\.com\.tw$ -(^|\.)qhigh\.com$ -(^|\.)qi-gong\.me$ -(^|\.)qiandao\.today$ -(^|\.)qiangyou\.org$ -(^|\.)qidian\.ca$ -(^|\.)qienkuen\.org$ -(^|\.)qiwen\.lu$ -(^|\.)qixianglu\.cn$ -(^|\.)qkshare\.com$ -(^|\.)qoos\.com$ -(^|\.)qpoe\.com$ -(^|\.)qq\.co\.za$ -(^|\.)qstatus\.com$ -(^|\.)qtrac\.eu$ -(^|\.)qtweeter\.com$ -(^|\.)quannengshen\.org$ -(^|\.)quantumbooter\.net$ -(^|\.)questvisual\.com$ -(^|\.)quitccp\.net$ -(^|\.)quitccp\.org$ -(^|\.)quora\.com$ -(^|\.)quran\.com$ -(^|\.)quranexplorer\.com$ -(^|\.)qusi8\.net$ -(^|\.)qvodzy\.org$ -(^|\.)qxbbs\.org$ -(^|\.)r18\.com$ -(^|\.)ra\.gg$ -(^|\.)radicalparty\.org$ -(^|\.)radiko\.jp$ -(^|\.)radioaustralia\.net\.au$ -(^|\.)radiohilight\.net$ -(^|\.)radiovaticana\.org$ -(^|\.)radiovncr\.com$ -(^|\.)rael\.org$ -(^|\.)raggedbanner\.com$ -(^|\.)raidcall\.com\.tw$ -(^|\.)raidtalk\.com\.tw$ -(^|\.)rainbowplan\.org$ -(^|\.)raizoji\.or\.jp$ -(^|\.)ramcity\.com\.au$ -(^|\.)rangwang\.biz$ -(^|\.)rangzen\.com$ -(^|\.)rangzen\.net$ -(^|\.)rangzen\.org$ -(^|\.)ranyunfei\.com$ -(^|\.)rapbull\.net$ -(^|\.)rapidgator\.net$ -(^|\.)rapidmoviez\.com$ -(^|\.)rapidvpn\.com$ -(^|\.)raremovie\.cc$ -(^|\.)raremovie\.net$ -(^|\.)rawgit\.com$ -(^|\.)rawgithub\.com$ -(^|\.)razyboard\.com$ -(^|\.)rcinet\.ca$ -(^|\.)rconversation\.blogs\.com$ -(^|\.)rd\.com$ -(^|\.)rdio\.com$ -(^|\.)read01\.com$ -(^|\.)read100\.com$ -(^|\.)readingtimes\.com\.tw$ -(^|\.)readmoo\.com$ -(^|\.)readydown\.com$ -(^|\.)realcourage\.org$ -(^|\.)realforum\.zkiz\.com$ -(^|\.)realitykings\.com$ -(^|\.)realraptalk\.com$ -(^|\.)realsexpass\.com$ -(^|\.)rebatesrule\.net$ -(^|\.)recordhistory\.org$ -(^|\.)recovery\.org\.tw$ -(^|\.)recoveryversion\.com\.tw$ -(^|\.)red-lang\.org$ -(^|\.)redballoonsolidarity\.org$ -(^|\.)redchinacn\.net$ -(^|\.)redchinacn\.org$ -(^|\.)redhotlabs\.com$ -(^|\.)redtube\.com$ -(^|\.)referer\.us$ -(^|\.)reflectivecode\.com$ -(^|\.)registry\.google$ -(^|\.)relaxbbs\.com$ -(^|\.)relay\.com\.tw$ -(^|\.)releaseinternational\.org$ -(^|\.)religioustolerance\.org$ -(^|\.)remembering_tiananmen_20_years$ -(^|\.)renminbao\.com$ -(^|\.)renyurenquan\.org$ -(^|\.)research\.jmsc\.hku\.hk$ -(^|\.)resilio\.com$ -(^|\.)retweeteffect\.com$ -(^|\.)retweetist\.com$ -(^|\.)retweetrank\.com$ -(^|\.)reuters\.com$ -(^|\.)reutersmedia\.net$ -(^|\.)revleft\.com$ -(^|\.)revver\.com$ -(^|\.)rfa\.org$ -(^|\.)rfachina\.com$ -(^|\.)rfamobile\.org$ -(^|\.)rfaweb\.org$ -(^|\.)rferl\.org$ -(^|\.)rfi\.fr$ -(^|\.)rfi\.my$ -(^|\.)rigpa\.org$ -(^|\.)riku\.me$ -(^|\.)rileyguide\.com$ -(^|\.)ritouki\.jp$ -(^|\.)ritter\.vg$ -(^|\.)rlwlw\.com$ -(^|\.)rmjdw\.com$ -(^|\.)rmjdw132\.info$ -(^|\.)roadshow\.hk$ -(^|\.)roboforex\.com$ -(^|\.)robustnessiskey\.com$ -(^|\.)rocket-inc\.net$ -(^|\.)rocksdb\.org$ -(^|\.)rojo\.com$ -(^|\.)rolia\.net$ -(^|\.)ronjoneswriter\.com$ -(^|\.)roodo\.com$ -(^|\.)rosechina\.net$ -(^|\.)rotten\.com$ -(^|\.)rsf-chinese\.org$ -(^|\.)rsf\.org$ -(^|\.)rsgamen\.org$ -(^|\.)rssmeme\.com$ -(^|\.)rtalabel\.org$ -(^|\.)rthk\.hk$ -(^|\.)rthk\.org\.hk$ -(^|\.)rti\.org\.tw$ -(^|\.)rtycminnesota\.org$ -(^|\.)ruanyifeng\.com$ -(^|\.)rukor\.org$ -(^|\.)rushbee\.com$ -(^|\.)ruten\.com\.tw$ -(^|\.)rutube\.ru$ -(^|\.)ruyiseek\.com$ -(^|\.)rxhj\.net$ -(^|\.)s-cute\.com$ -(^|\.)s-dragon\.org$ -(^|\.)s1\.nudezz\.com$ -(^|\.)s1heng\.com$ -(^|\.)s1s1s1\.com$ -(^|\.)s3-ap-northeast-1\.amazonaws\.com$ -(^|\.)s3-ap-southeast-2\.amazonaws\.com$ -(^|\.)s8forum\.com$ -(^|\.)sa\.hao123\.com$ -(^|\.)sacks\.com$ -(^|\.)sacom\.hk$ -(^|\.)sadistic-v\.com$ -(^|\.)sadpanda\.us$ -(^|\.)safervpn\.com$ -(^|\.)saintyculture\.com$ -(^|\.)saiq\.me$ -(^|\.)sakuralive\.com$ -(^|\.)sakya\.org$ -(^|\.)salvation\.org\.hk$ -(^|\.)samair\.ru$ -(^|\.)sambhota\.org$ -(^|\.)sanmin\.com\.tw$ -(^|\.)sapikachu\.net$ -(^|\.)saveliuxiaobo\.com$ -(^|\.)savemedia\.com$ -(^|\.)savethedate\.foo$ -(^|\.)savetibet\.de$ -(^|\.)savetibet\.fr$ -(^|\.)savetibet\.nl$ -(^|\.)savetibet\.org$ -(^|\.)savetibet\.ru$ -(^|\.)savetibetstore\.org$ -(^|\.)savevid\.com$ -(^|\.)say2\.info$ -(^|\.)sbme\.me$ -(^|\.)sbs\.com\.au$ -(^|\.)scasino\.com$ -(^|\.)schema\.org$ -(^|\.)sciencenets\.com$ -(^|\.)scieron\.com$ -(^|\.)scmp\.com$ -(^|\.)scmpchinese\.com$ -(^|\.)scramble\.io$ -(^|\.)scribd\.com$ -(^|\.)scriptspot\.com$ -(^|\.)seapuff\.com$ -(^|\.)search$ -(^|\.)search\.aol\.com$ -(^|\.)search\.yahoo\.co\.jp$ -(^|\.)searchtruth\.com$ -(^|\.)secretchina\.com$ -(^|\.)secretgarden\.no$ -(^|\.)secretsline\.biz$ -(^|\.)secure\.hustler\.com$ -(^|\.)secure\.logmein\.com$ -(^|\.)secure\.raxcdn\.com$ -(^|\.)securetunnel\.com$ -(^|\.)securitykiss\.com$ -(^|\.)seed4\.me$ -(^|\.)seesmic\.com$ -(^|\.)seevpn\.com$ -(^|\.)seezone\.net$ -(^|\.)sejie\.com$ -(^|\.)sellclassics\.com$ -(^|\.)sendsmtp\.com$ -(^|\.)sendspace\.com$ -(^|\.)servehttp\.com$ -(^|\.)serveuser\.com$ -(^|\.)serveusers\.com$ -(^|\.)sesawe\.net$ -(^|\.)sesawe\.org$ -(^|\.)sethwklein\.net$ -(^|\.)setn\.com$ -(^|\.)settv\.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$ -(^|\.)sfileydy\.com$ -(^|\.)sfshibao\.com$ -(^|\.)sftindia\.org$ -(^|\.)sftuk\.org$ -(^|\.)shadeyouvpn\.com$ -(^|\.)shadow\.ma$ -(^|\.)shadowsky\.xyz$ -(^|\.)shadowsocks-r\.com$ -(^|\.)shadowsocks\.asia$ -(^|\.)shadowsocks\.com$ -(^|\.)shadowsocks\.com\.hk$ -(^|\.)shadowsocks\.org$ -(^|\.)shadowsocks9\.com$ -(^|\.)shambalapost\.com$ -(^|\.)shambhalasun\.com$ -(^|\.)shangfang\.org$ -(^|\.)shapeservices\.com$ -(^|\.)share\.dmhy\.org$ -(^|\.)share\.ovi\.com$ -(^|\.)share\.youthwant\.com\.tw$ -(^|\.)sharebee\.com$ -(^|\.)sharecool\.org$ -(^|\.)sharpdaily\.com\.hk$ -(^|\.)sharpdaily\.hk$ -(^|\.)sharpdaily\.tw$ -(^|\.)shat-tibet\.com$ -(^|\.)shattered\.io$ -(^|\.)sheikyermami\.com$ -(^|\.)shellfire\.de$ -(^|\.)shenshou\.org$ -(^|\.)shenyun\.com$ -(^|\.)shenyunperformingarts\.org$ -(^|\.)shenzhoufilm\.com$ -(^|\.)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$ -(^|\.)shopping\.com$ -(^|\.)showbiz\.omy\.sg$ -(^|\.)showhaotu\.com$ -(^|\.)showtime\.jp$ -(^|\.)shutterstock\.com$ -(^|\.)shwchurch\.org$ -(^|\.)shwchurch3\.com$ -(^|\.)siddharthasintent\.org$ -(^|\.)sidelinesnews\.com$ -(^|\.)sidelinessportseatery\.com$ -(^|\.)sierrafriendsoftibet\.org$ -(^|\.)sijihuisuo\.club$ -(^|\.)sijihuisuo\.com$ -(^|\.)silkbook\.com$ -(^|\.)simbolostwitter\.com$ -(^|\.)simplecd\.org$ -(^|\.)simpleproductivityblog\.com$ -(^|\.)sinchew\.com\.my$ -(^|\.)singaporepools\.com\.sg$ -(^|\.)singfortibet\.com$ -(^|\.)singpao\.com\.hk$ -(^|\.)singtao\.com$ -(^|\.)singtaousa\.com$ -(^|\.)sino-monthly\.com$ -(^|\.)sinoants\.com$ -(^|\.)sinocast\.com$ -(^|\.)sinocism\.com$ -(^|\.)sinomontreal\.ca$ -(^|\.)sinonet\.ca$ -(^|\.)sinopitt\.info$ -(^|\.)sinoquebec\.com$ -(^|\.)sipml5\.org$ -(^|\.)sis\.xxx$ -(^|\.)sis001\.com$ -(^|\.)sis001\.us$ -(^|\.)site90\.net$ -(^|\.)sitebro\.tw$ -(^|\.)sitekreator\.com$ -(^|\.)siteks\.uk\.to$ -(^|\.)sitemaps\.org$ -(^|\.)sixth\.biz$ -(^|\.)sjrt\.org$ -(^|\.)sjum\.cn$ -(^|\.)sketchappsources\.com$ -(^|\.)skimtube\.com$ -(^|\.)skybet\.com$ -(^|\.)skyking\.com\.tw$ -(^|\.)skyvegas\.com$ -(^|\.)skyxvpn\.com$ -(^|\.)slacker\.com$ -(^|\.)slaytizle\.com$ -(^|\.)sleazydream\.com$ -(^|\.)slheng\.com$ -(^|\.)slickvpn\.com$ -(^|\.)slideshare\.net$ -(^|\.)slinkset\.com$ -(^|\.)slutload\.com$ -(^|\.)slutmoonbeam\.com$ -(^|\.)slyip\.com$ -(^|\.)slyip\.net$ -(^|\.)sm-miracle\.com$ -(^|\.)smartdnsproxy\.com$ -(^|\.)smarthide\.com$ -(^|\.)smchbooks\.com$ -(^|\.)smh\.com\.au$ -(^|\.)smhric\.org$ -(^|\.)smith\.edu$ -(^|\.)smyxy\.org$ -(^|\.)snapchat\.com$ -(^|\.)snaptu\.com$ -(^|\.)sndcdn\.com$ -(^|\.)sneakme\.net$ -(^|\.)snowlionpub\.com$ -(^|\.)sobees\.com$ -(^|\.)soc\.mil$ -(^|\.)socialwhale\.com$ -(^|\.)sockscap64\.com$ -(^|\.)sockslist\.net$ -(^|\.)socrec\.org$ -(^|\.)sod\.co\.jp$ -(^|\.)sodatea\.github\.io$ -(^|\.)softether-download\.com$ -(^|\.)softether\.co\.jp$ -(^|\.)softether\.org$ -(^|\.)softwarebychuck\.com$ -(^|\.)softwaredownload\.gitbooks\.io$ -(^|\.)sogclub\.com$ -(^|\.)sogrady\.me$ -(^|\.)soh\.tw$ -(^|\.)sohcradio\.com$ -(^|\.)sohfrance\.org$ -(^|\.)sokamonline\.com$ -(^|\.)sokmil\.com$ -(^|\.)solarsystem\.nasa\.gov$ -(^|\.)solidaritetibet\.org$ -(^|\.)solidfiles\.com$ -(^|\.)somee\.com$ -(^|\.)songjianjun\.com$ -(^|\.)sonicbbs\.cc$ -(^|\.)sonidodelaesperanza\.org$ -(^|\.)sopcast\.com$ -(^|\.)sopcast\.org$ -(^|\.)sorazone\.net$ -(^|\.)sorting-algorithms\.com$ -(^|\.)sos\.org$ -(^|\.)sosreader\.com$ -(^|\.)sostibet\.org$ -(^|\.)soubory\.com$ -(^|\.)soul-plus\.net$ -(^|\.)soulcaliburhentai\.net$ -(^|\.)soumo\.info$ -(^|\.)soundcloud\.com$ -(^|\.)soundofhope\.kr$ -(^|\.)soundofhope\.org$ -(^|\.)soup\.io$ -(^|\.)soupofmedia\.com$ -(^|\.)sourceforge\.net$ -(^|\.)sourcewadio\.com$ -(^|\.)southnews\.com\.tw$ -(^|\.)sowers\.org\.hk$ -(^|\.)spankbang\.com$ -(^|\.)spankingtube\.com$ -(^|\.)spankwire\.com$ -(^|\.)spb\.com$ -(^|\.)speakerdeck\.com$ -(^|\.)specxinzl\.jigsy\.com$ -(^|\.)speedify\.com$ -(^|\.)spem\.at$ -(^|\.)spencertipping\.com$ -(^|\.)spicevpn\.com$ -(^|\.)spideroak\.com$ -(^|\.)spike\.com$ -(^|\.)sports\.williamhill\.com$ -(^|\.)spotflux\.com$ -(^|\.)spotify\.com$ -(^|\.)spreadshirt\.es$ -(^|\.)spring4u\.info$ -(^|\.)springboardplatform\.com$ -(^|\.)sprite\.org$ -(^|\.)sproutcore\.com$ -(^|\.)sproxy\.info$ -(^|\.)squirly\.info$ -(^|\.)srcf\.ucam\.org$ -(^|\.)srocket\.us$ -(^|\.)ss-link\.com$ -(^|\.)ss\.carryzhou\.com$ -(^|\.)ss\.levyhsu\.com$ -(^|\.)ssglobal\.co$ -(^|\.)ssglobal\.me$ -(^|\.)ssh91\.com$ -(^|\.)ssl\.webpack\.de$ -(^|\.)ssl443\.org$ -(^|\.)sspro\.ml$ -(^|\.)sss\.camp$ -(^|\.)sstmlt\.moe$ -(^|\.)sstmlt\.net$ -(^|\.)stackoverflow\.com$ -(^|\.)stage64\.hk$ -(^|\.)standupfortibet\.org$ -(^|\.)stanford\.edu$ -(^|\.)starfishfx\.com$ -(^|\.)starp2p\.com$ -(^|\.)startpage\.com$ -(^|\.)startuplivingchina\.com$ -(^|\.)stat\.gov\.tw$ -(^|\.)static-economist\.com$ -(^|\.)static\.comico\.tw$ -(^|\.)static01\.nyt\.com$ -(^|\.)staticflickr\.com$ -(^|\.)statueofdemocracy\.org$ -(^|\.)stc\.com\.sa$ -(^|\.)steamcommunity\.com$ -(^|\.)steel-storm\.com$ -(^|\.)steganos\.com$ -(^|\.)steganos\.net$ -(^|\.)stepchina\.com$ -(^|\.)stephaniered\.com$ -(^|\.)sthoo\.com$ -(^|\.)stickam\.com$ -(^|\.)stickeraction\.com$ -(^|\.)stileproject\.com$ -(^|\.)sto\.cc$ -(^|\.)stoporganharvesting\.org$ -(^|\.)stoptibetcrisis\.net$ -(^|\.)storagenewsletter\.com$ -(^|\.)store\.steampowered\.com$ -(^|\.)stories\.google$ -(^|\.)storify\.com$ -(^|\.)storm\.mg$ -(^|\.)stormmediagroup\.com$ -(^|\.)stoweboyd\.com$ -(^|\.)stranabg\.com$ -(^|\.)straplessdildo\.com$ -(^|\.)streamingthe\.net$ -(^|\.)streema\.com$ -(^|\.)strikingly\.com$ -(^|\.)strongvpn\.com$ -(^|\.)strongwindpress\.com$ -(^|\.)student\.tw$ -(^|\.)studentsforafreetibet\.org$ -(^|\.)stumbleupon\.com$ -(^|\.)stupidvideos\.com$ -(^|\.)subacme\.rerouted\.org$ -(^|\.)successfn\.com$ -(^|\.)sugarsync\.com$ -(^|\.)sugobbs\.com$ -(^|\.)sugumiru18\.com$ -(^|\.)suissl\.com$ -(^|\.)sujiatun\.wordpress\.com$ -(^|\.)sulian\.me$ -(^|\.)summify\.com$ -(^|\.)sumrando\.com$ -(^|\.)sun1911\.com$ -(^|\.)sunmedia\.ca$ -(^|\.)sunporno\.com$ -(^|\.)sunskyforum\.com$ -(^|\.)sunta\.com\.tw$ -(^|\.)sunvpn\.net$ -(^|\.)sunwinism\.joinbbs\.net$ -(^|\.)suoluo\.org$ -(^|\.)superfreevpn\.com$ -(^|\.)superokayama\.com$ -(^|\.)superpages\.com$ -(^|\.)supervpn\.net$ -(^|\.)suppig\.net$ -(^|\.)suprememastertv\.com$ -(^|\.)surfeasy\.com$ -(^|\.)surfeasy\.com\.au$ -(^|\.)suroot\.com$ -(^|\.)surrenderat20\.net$ -(^|\.)suyangg\.com$ -(^|\.)svsfx\.com$ -(^|\.)swagbucks\.com$ -(^|\.)swissvpn\.net$ -(^|\.)switch1\.jp$ -(^|\.)switchvpn\.net$ -(^|\.)sydneytoday\.com$ -(^|\.)sylfoundation\.org$ -(^|\.)syncback\.com$ -(^|\.)synergyse\.com$ -(^|\.)sysresccd\.org$ -(^|\.)sytes\.net$ -(^|\.)szbbs\.net$ -(^|\.)szetowah\.org\.hk$ -(^|\.)t-g\.com$ -(^|\.)t\.co$ -(^|\.)t\.me$ -(^|\.)t\.orzdream\.com$ -(^|\.)t35\.com$ -(^|\.)t66y\.com$ -(^|\.)taa-usa\.org$ -(^|\.)taaze\.tw$ -(^|\.)tabtter\.jp$ -(^|\.)tacc\.cwb\.gov\.tw$ -(^|\.)tacem\.org$ -(^|\.)taconet\.com\.tw$ -(^|\.)taedp\.org\.tw$ -(^|\.)tafm\.org$ -(^|\.)tagwa\.org\.au$ -(^|\.)tagwalk\.com$ -(^|\.)tahr\.org\.tw$ -(^|\.)taipei\.gov\.tw$ -(^|\.)taipeisociety\.org$ -(^|\.)taiwan-sex\.com$ -(^|\.)taiwanbible\.com$ -(^|\.)taiwancon\.com$ -(^|\.)taiwandaily\.net$ -(^|\.)taiwandc\.org$ -(^|\.)taiwanjobs\.gov\.tw$ -(^|\.)taiwanjustice\.com$ -(^|\.)taiwankiss\.com$ -(^|\.)taiwannation\.50webs\.com$ -(^|\.)taiwannation\.com$ -(^|\.)taiwannation\.com\.tw$ -(^|\.)taiwanncf\.org\.tw$ -(^|\.)taiwannews\.com\.tw$ -(^|\.)taiwantp\.net$ -(^|\.)taiwantt\.org\.tw$ -(^|\.)taiwanus\.net$ -(^|\.)taiwanyes\.com$ -(^|\.)taiwanyes\.ning\.com$ -(^|\.)talk853\.com$ -(^|\.)talkboxapp\.com$ -(^|\.)talkonly\.net$ -(^|\.)tamiaode\.tk$ -(^|\.)tanc\.org$ -(^|\.)tangben\.com$ -(^|\.)tangren\.us$ -(^|\.)taoism\.net$ -(^|\.)taolun\.info$ -(^|\.)tapanwap\.com$ -(^|\.)tapatalk\.com$ -(^|\.)tarr\.uspto\.gov$ -(^|\.)tascn\.com\.au$ -(^|\.)taup\.net$ -(^|\.)taweet\.com$ -(^|\.)tbcollege\.org$ -(^|\.)tbi\.org\.hk$ -(^|\.)tbicn\.org$ -(^|\.)tbjyt\.org$ -(^|\.)tbpic\.info$ -(^|\.)tbrc\.org$ -(^|\.)tbs-rainbow\.org$ -(^|\.)tbsec\.org$ -(^|\.)tbskkinabalu\.page\.tl$ -(^|\.)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$ -(^|\.)teachparentstech\.org$ -(^|\.)teamamericany\.com$ -(^|\.)tech2\.in\.com$ -(^|\.)teck\.in$ -(^|\.)teeniefuck\.net$ -(^|\.)teensinasia\.com$ -(^|\.)telecomspace\.com$ -(^|\.)telegram\.dog$ -(^|\.)telegram\.me$ -(^|\.)telegram\.org$ -(^|\.)telegramdownload\.com$ -(^|\.)telegraph\.co\.uk$ -(^|\.)telesco\.pe$ -(^|\.)tellme\.pw$ -(^|\.)tenacy\.com$ -(^|\.)tensorflow\.org$ -(^|\.)tenzinpalmo\.com$ -(^|\.)tew\.org$ -(^|\.)th\.hao123\.com$ -(^|\.)thaicn\.com$ -(^|\.)thb\.gov\.tw$ -(^|\.)theatrum-belli\.com$ -(^|\.)thebcomplex\.com$ -(^|\.)theblemish\.com$ -(^|\.)thebobs\.com$ -(^|\.)thebodyshop-usa\.com$ -(^|\.)thecenter\.mit\.edu$ -(^|\.)thechinabeat\.org$ -(^|\.)thedalailamamovie\.com$ -(^|\.)thedw\.us$ -(^|\.)thefacebook\.com$ -(^|\.)thefrontier\.hk$ -(^|\.)thegioitinhoc\.vn$ -(^|\.)thegly\.com$ -(^|\.)thehots\.info$ -(^|\.)thehousenews\.com$ -(^|\.)thehun\.net$ -(^|\.)theinitium\.com$ -(^|\.)thenewslens\.com$ -(^|\.)thepiratebay\.org$ -(^|\.)theportalwiki\.com$ -(^|\.)thereallove\.kr$ -(^|\.)therock\.net\.nz$ -(^|\.)thespeeder\.com$ -(^|\.)thestandnews\.com$ -(^|\.)thetibetcenter\.org$ -(^|\.)thetibetconnection\.org$ -(^|\.)thetibetmuseum\.org$ -(^|\.)thetibetpost\.com$ -(^|\.)thetinhat\.com$ -(^|\.)thetrotskymovie\.com$ -(^|\.)thevivekspot\.com$ -(^|\.)thewgo\.org$ -(^|\.)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-info\.net$ -(^|\.)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$ -(^|\.)tibetanfeministcollective\.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$ -(^|\.)tibetlibre\.free\.fr$ -(^|\.)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$ -(^|\.)tiltbrush\.com$ -(^|\.)timdir\.com$ -(^|\.)time\.com$ -(^|\.)times\.hinet\.net$ -(^|\.)timesofindia\.indiatimes\.com$ -(^|\.)timsah\.com$ -(^|\.)tintuc101\.com$ -(^|\.)tiny\.cc$ -(^|\.)tinychat\.com$ -(^|\.)tinypaste\.com$ -(^|\.)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$ -(^|\.)tongil\.or\.kr$ -(^|\.)tono-oka\.jp$ -(^|\.)tonyyan\.net$ -(^|\.)toodoc\.com$ -(^|\.)toonel\.net$ -(^|\.)top\.tv$ -(^|\.)top81\.ws$ -(^|\.)topic\.youthwant\.com\.tw$ -(^|\.)topnews\.in$ -(^|\.)toppornsites\.com$ -(^|\.)topshareware\.com$ -(^|\.)topsy\.com$ -(^|\.)toptip\.ca$ -(^|\.)tor\.blingblingsquad\.net$ -(^|\.)tor\.cn\.uptodown\.com$ -(^|\.)tor\.updatestar\.com$ -(^|\.)tora\.to$ -(^|\.)torcn\.com$ -(^|\.)torguard\.net$ -(^|\.)torproject\.org$ -(^|\.)torrentprivacy\.com$ -(^|\.)torrentproject\.se$ -(^|\.)torrenty\.org$ -(^|\.)torrentz\.eu$ -(^|\.)torvpn\.com$ -(^|\.)tosh\.comedycentral\.com$ -(^|\.)totalvpn\.com$ -(^|\.)toutiaoabc\.com$ -(^|\.)towngain\.com$ -(^|\.)toypark\.in$ -(^|\.)toythieves\.com$ -(^|\.)toytractorshow\.com$ -(^|\.)tparents\.org$ -(^|\.)tpi\.org\.tw$ -(^|\.)tracfone\.com$ -(^|\.)traffichaus\.com$ -(^|\.)trans\.wenweipo\.com$ -(^|\.)transparency\.org$ -(^|\.)treemall\.com\.tw$ -(^|\.)trendsmap\.com$ -(^|\.)trialofccp\.org$ -(^|\.)trickip\.net$ -(^|\.)trickip\.org$ -(^|\.)trimondi\.de$ -(^|\.)trouw\.nl$ -(^|\.)trt\.net\.tr$ -(^|\.)trtc\.com\.tw$ -(^|\.)truebuddha-md\.org$ -(^|\.)trulyergonomic\.com$ -(^|\.)truth101\.co\.tv$ -(^|\.)truthontour\.org$ -(^|\.)truveo\.com$ -(^|\.)tryheart\.jp$ -(^|\.)tsctv\.net$ -(^|\.)tsdr\.uspto\.gov$ -(^|\.)tsemtulku\.com$ -(^|\.)tsquare\.tv$ -(^|\.)tsu\.org\.tw$ -(^|\.)tsunagarumon\.com$ -(^|\.)tt-rss\.org$ -(^|\.)tt1069\.com$ -(^|\.)tttan\.com$ -(^|\.)tu8964\.com$ -(^|\.)tubaholic\.com$ -(^|\.)tube\.com$ -(^|\.)tube8\.com$ -(^|\.)tube911\.com$ -(^|\.)tubecup\.com$ -(^|\.)tubegals\.com$ -(^|\.)tubeislam\.com$ -(^|\.)tubestack\.com$ -(^|\.)tubewolf\.com$ -(^|\.)tui\.orzdream\.com$ -(^|\.)tuibeitu\.net$ -(^|\.)tuidang\.net$ -(^|\.)tuidang\.org$ -(^|\.)tuidang\.se$ -(^|\.)tuitwit\.com$ -(^|\.)tumblr\.com$ -(^|\.)tumutanzi\.com$ -(^|\.)tumview\.com$ -(^|\.)tunein\.com$ -(^|\.)tunnelbear\.com$ -(^|\.)tunnelr\.com$ -(^|\.)tuo8\.blue$ -(^|\.)tuo8\.cc$ -(^|\.)tuo8\.club$ -(^|\.)tuo8\.fit$ -(^|\.)tuo8\.hk$ -(^|\.)tuo8\.in$ -(^|\.)tuo8\.ninja$ -(^|\.)tuo8\.org$ -(^|\.)tuo8\.pw$ -(^|\.)tuo8\.red$ -(^|\.)tuo8\.space$ -(^|\.)turansam\.org$ -(^|\.)turbobit\.net$ -(^|\.)turbohide\.com$ -(^|\.)turbotwitter\.com$ -(^|\.)turntable\.fm$ -(^|\.)tushycash\.com$ -(^|\.)tuvpn\.com$ -(^|\.)tuzaijidi\.com$ -(^|\.)tv\.com$ -(^|\.)tvants\.com$ -(^|\.)tvboxnow\.com$ -(^|\.)tvider\.com$ -(^|\.)tvmost\.com\.hk$ -(^|\.)tvplayvideos\.com$ -(^|\.)tvunetworks\.com$ -(^|\.)tw-blog\.com$ -(^|\.)tw-npo\.org$ -(^|\.)tw\.answers\.yahoo\.com$ -(^|\.)tw\.bid\.yahoo\.com$ -(^|\.)tw\.gigacircle\.com$ -(^|\.)tw\.hao123\.com$ -(^|\.)tw\.jiepang\.com$ -(^|\.)tw\.knowledge\.yahoo\.com$ -(^|\.)tw\.mall\.yahoo\.com$ -(^|\.)tw\.mobi\.yahoo\.com$ -(^|\.)tw\.money\.yahoo\.com$ -(^|\.)tw\.myblog\.yahoo\.com$ -(^|\.)tw\.news\.yahoo\.com$ -(^|\.)tw\.streetvoice\.com$ -(^|\.)tw\.tomonews\.net$ -(^|\.)tw\.voa\.mobi$ -(^|\.)tw\.yahoo\.com$ -(^|\.)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$ -(^|\.)tweets\.seraph\.me$ -(^|\.)tweettunnel\.com$ -(^|\.)tweetwally\.com$ -(^|\.)tweetymail\.com$ -(^|\.)tweez\.net$ -(^|\.)twelve\.today$ -(^|\.)twerkingbutt\.com$ -(^|\.)twftp\.org$ -(^|\.)twgreatdaily\.com$ -(^|\.)twibase\.com$ -(^|\.)twibble\.de$ -(^|\.)twibbon\.com$ -(^|\.)twibs\.com$ -(^|\.)twicsy\.com$ -(^|\.)twiends\.com$ -(^|\.)twifan\.com$ -(^|\.)twiffo\.com$ -(^|\.)twiggit\.org$ -(^|\.)twilightsex\.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$ -(^|\.)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$ -(^|\.)twskype\.com$ -(^|\.)twstar\.net$ -(^|\.)twt\.tl$ -(^|\.)twtkr\.com$ -(^|\.)twtr2src\.ogaoga\.org$ -(^|\.)twtrland\.com$ -(^|\.)twttr\.com$ -(^|\.)twurl\.nl$ -(^|\.)twyac\.org$ -(^|\.)txxx\.com$ -(^|\.)tycool\.com$ -(^|\.)typepad\.com$ -(^|\.)u9un\.com$ -(^|\.)ub0\.cc$ -(^|\.)ubddns\.org$ -(^|\.)uberproxy\.net$ -(^|\.)uc-japan\.org$ -(^|\.)ucdc1998\.org$ -(^|\.)uderzo\.it$ -(^|\.)udn\.com$ -(^|\.)udn\.com\.tw$ -(^|\.)udnbkk\.com$ -(^|\.)uforadio\.com\.tw$ -(^|\.)ufreevpn\.com$ -(^|\.)ugo\.com$ -(^|\.)uhdwallpapers\.org$ -(^|\.)uhrp\.org$ -(^|\.)uighur\.narod\.ru$ -(^|\.)uighur\.nl$ -(^|\.)uighurbiz\.net$ -(^|\.)ukcdp\.co\.uk$ -(^|\.)ukliferadio\.co\.uk$ -(^|\.)ulike\.net$ -(^|\.)ulop\.net$ -(^|\.)ultrareach$ -(^|\.)ultrasurf$ -(^|\.)ultravpn\.fr$ -(^|\.)ultraxs\.com$ -(^|\.)umich\.edu$ -(^|\.)unblock-us\.com$ -(^|\.)unblock\.cn\.com$ -(^|\.)unblockdmm\.com$ -(^|\.)unblocker\.yt$ -(^|\.)unblocksit\.es$ -(^|\.)uncyclomedia\.org$ -(^|\.)uncyclopedia\.hk$ -(^|\.)uncyclopedia\.tw$ -(^|\.)underwoodammo\.com$ -(^|\.)unholyknight\.com$ -(^|\.)uni\.cc$ -(^|\.)unification\.net$ -(^|\.)unification\.org\.tw$ -(^|\.)unitedsocialpress\.com$ -(^|\.)unix100\.com$ -(^|\.)unknownspace\.org$ -(^|\.)unodedos\.com$ -(^|\.)unpo\.org$ -(^|\.)unseen\.is$ -(^|\.)untraceable\.us$ -(^|\.)uocn\.org$ -(^|\.)upcoming\.yahoo\.com$ -(^|\.)updates\.tdesktop\.com$ -(^|\.)upholdjustice\.org$ -(^|\.)upload4u\.info$ -(^|\.)uploaded\.net$ -(^|\.)uploaded\.to$ -(^|\.)uploadstation\.com$ -(^|\.)upmedia\.mg$ -(^|\.)upornia\.com$ -(^|\.)uproxy\.org$ -(^|\.)upwill\.org$ -(^|\.)ur7s\.com$ -(^|\.)urbansurvival\.com$ -(^|\.)urchin\.com$ -(^|\.)urlborg\.com$ -(^|\.)urlparser\.com$ -(^|\.)us\.to$ -(^|\.)usacn\.com$ -(^|\.)usaip\.eu$ -(^|\.)userapi\.nytlog\.com$ -(^|\.)users\.skynet\.be$ -(^|\.)usfk\.mil$ -(^|\.)ushuarencity\.echainhost\.com$ -(^|\.)usinfo\.state\.gov$ -(^|\.)usma\.edu$ -(^|\.)usmc\.mil$ -(^|\.)usmgtcg\.ning\.com$ -(^|\.)usno\.navy\.mil$ -(^|\.)usocctn\.com$ -(^|\.)ustream\.tv$ -(^|\.)usunitednews\.com$ -(^|\.)usus\.cc$ -(^|\.)utopianpal\.com$ -(^|\.)uu-gg\.com$ -(^|\.)uvwxyz\.xyz$ -(^|\.)uwants\.com$ -(^|\.)uwants\.net$ -(^|\.)uyghur-j\.org$ -(^|\.)uyghur\.co\.uk$ -(^|\.)uyghuramerican\.org$ -(^|\.)uyghurcanadiansociety\.org$ -(^|\.)uyghurcongress\.org$ -(^|\.)uyghurensemble\.co\.uk$ -(^|\.)uyghurpen\.org$ -(^|\.)uyghurpress\.com$ -(^|\.)uyghurstudies\.org$ -(^|\.)uygur\.fc2web\.com$ -(^|\.)uygur\.org$ -(^|\.)uymaarip\.com$ -(^|\.)v2ex\.com$ -(^|\.)v2ray\.com$ -(^|\.)van001\.com$ -(^|\.)van698\.com$ -(^|\.)vanemu\.cn$ -(^|\.)vanilla-jp\.com$ -(^|\.)vanpeople\.com$ -(^|\.)vansky\.com$ -(^|\.)vatn\.org$ -(^|\.)vcf-online\.org$ -(^|\.)vcfbuilder\.org$ -(^|\.)vds\.rightster\.com$ -(^|\.)vegas\.williamhill\.com$ -(^|\.)vegasred\.com$ -(^|\.)velkaepocha\.sk$ -(^|\.)venbbs\.com$ -(^|\.)venchina\.com$ -(^|\.)venetianmacao\.com$ -(^|\.)ventureswell\.com$ -(^|\.)veoh\.com$ -(^|\.)vermonttibet\.org$ -(^|\.)versavpn\.com$ -(^|\.)verybs\.com$ -(^|\.)vevo\.com$ -(^|\.)vft\.com\.tw$ -(^|\.)viber\.com$ -(^|\.)vica\.info$ -(^|\.)victimsofcommunism\.org$ -(^|\.)vid\.me$ -(^|\.)vidble\.com$ -(^|\.)video\.aol\.ca$ -(^|\.)video\.aol\.co\.uk$ -(^|\.)video\.aol\.com$ -(^|\.)video\.ap\.org$ -(^|\.)video\.fdbox\.com$ -(^|\.)video\.foxbusiness\.com$ -(^|\.)video\.pbs\.org$ -(^|\.)video\.yahoo\.com$ -(^|\.)videobam\.com$ -(^|\.)videodetective\.com$ -(^|\.)videomega\.tv$ -(^|\.)videomo\.com$ -(^|\.)videopediaworld\.com$ -(^|\.)videopress\.com$ -(^|\.)vidinfo\.org$ -(^|\.)vietdaikynguyen\.com$ -(^|\.)vijayatemple\.org$ -(^|\.)vimeo\.com$ -(^|\.)vimperator\.org$ -(^|\.)vincnd\.com$ -(^|\.)vine\.co$ -(^|\.)vinniev\.com$ -(^|\.)vip-enterprise\.com$ -(^|\.)visibletweets\.com$ -(^|\.)vital247\.org$ -(^|\.)viu\.com$ -(^|\.)viu\.tv$ -(^|\.)vivahentai4u\.net$ -(^|\.)vivatube\.com$ -(^|\.)vivthomas\.com$ -(^|\.)vizvaz\.com$ -(^|\.)vjmedia\.com\.hk$ -(^|\.)vllcs\.org$ -(^|\.)vlog\.xuite\.net$ -(^|\.)vmixcore\.com$ -(^|\.)vn\.hao123\.com$ -(^|\.)vnet\.link$ -(^|\.)voa-11\.akacast\.akamaistream\.net$ -(^|\.)voacantonese\.com$ -(^|\.)voachinese\.com$ -(^|\.)voachineseblog\.com$ -(^|\.)voagd\.com$ -(^|\.)voanews\.com$ -(^|\.)voatibetan\.com$ -(^|\.)voatibetanenglish\.com$ -(^|\.)vocativ\.com$ -(^|\.)vocn\.tv$ -(^|\.)vod\.wwe\.com$ -(^|\.)vot\.org$ -(^|\.)vovo2000\.com$ -(^|\.)voxer\.com$ -(^|\.)voy\.com$ -(^|\.)vpn\.ac$ -(^|\.)vpn\.cjb\.net$ -(^|\.)vpn\.cmu\.edu$ -(^|\.)vpn\.sv\.cmu\.edu$ -(^|\.)vpn4all\.com$ -(^|\.)vpnaccount\.org$ -(^|\.)vpnaccounts\.com$ -(^|\.)vpnbook\.com$ -(^|\.)vpncomparison\.org$ -(^|\.)vpncoupons\.com$ -(^|\.)vpncup\.com$ -(^|\.)vpndada\.com$ -(^|\.)vpnfan\.com$ -(^|\.)vpnfire\.com$ -(^|\.)vpnforgame\.net$ -(^|\.)vpngate\.jp$ -(^|\.)vpngate\.net$ -(^|\.)vpngratis\.net$ -(^|\.)vpnhq\.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$ -(^|\.)vtunnel\.com$ -(^|\.)vuku\.cc$ -(^|\.)w\.idaiwan\.com$ -(^|\.)w3schools\.com$ -(^|\.)waffle1999\.com$ -(^|\.)wahas\.com$ -(^|\.)waigaobu\.com$ -(^|\.)waikeung\.org$ -(^|\.)wailaike\.net$ -(^|\.)waiwaier\.com$ -(^|\.)wallmama\.com$ -(^|\.)wallornot\.org$ -(^|\.)wallpapercasa\.com$ -(^|\.)wallproxy\.com$ -(^|\.)waltermartin\.com$ -(^|\.)waltermartin\.org$ -(^|\.)wanderinghorse\.net$ -(^|\.)wangafu\.net$ -(^|\.)wangjinbo\.org$ -(^|\.)wanglixiong\.com$ -(^|\.)wango\.org$ -(^|\.)wangruoshui\.net$ -(^|\.)want-daily\.com$ -(^|\.)wanz-factory\.com$ -(^|\.)wapedia\.mobi$ -(^|\.)warbler\.iconfactory\.net$ -(^|\.)waselpro\.com$ -(^|\.)washeng\.net$ -(^|\.)watch8x\.com$ -(^|\.)watchinese\.com$ -(^|\.)watchmygf\.net$ -(^|\.)wattpad\.com$ -(^|\.)wav\.tv$ -(^|\.)waveprotocol\.org$ -(^|\.)waymo\.com$ -(^|\.)wda\.gov\.tw$ -(^|\.)wdf5\.com$ -(^|\.)wearehairy\.com$ -(^|\.)wearn\.com$ -(^|\.)web2project\.net$ -(^|\.)webbang\.net$ -(^|\.)webevader\.org$ -(^|\.)webfreer\.com$ -(^|\.)webjb\.org$ -(^|\.)weblagu\.com$ -(^|\.)webmproject\.org$ -(^|\.)webrtc\.org$ -(^|\.)webrush\.net$ -(^|\.)webs-tv\.net$ -(^|\.)website\.informer\.com$ -(^|\.)websitepulse\.com$ -(^|\.)webwarper\.net$ -(^|\.)webworkerdaily\.com$ -(^|\.)weekmag\.info$ -(^|\.)wefightcensorship\.org$ -(^|\.)wefong\.com$ -(^|\.)weiboleak\.com$ -(^|\.)weiboscope\.jmsc\.hku\.hk$ -(^|\.)weihuo\.org$ -(^|\.)weijingsheng\.org$ -(^|\.)weiming\.info$ -(^|\.)weiquanwang\.org$ -(^|\.)weisuo\.ws$ -(^|\.)welovecock\.com$ -(^|\.)wemigrate\.org$ -(^|\.)wengewang\.com$ -(^|\.)wengewang\.org$ -(^|\.)wenhui\.ch$ -(^|\.)wenxuecity\.com$ -(^|\.)wenyunchao\.com$ -(^|\.)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\.net$ -(^|\.)wheatseeds\.org$ -(^|\.)wheelockslatin\.com$ -(^|\.)whereiswerner\.com$ -(^|\.)wheretowatch\.com$ -(^|\.)whippedass\.com$ -(^|\.)whitebear\.freebearblog\.org$ -(^|\.)whodns\.xyz$ -(^|\.)whoer\.net$ -(^|\.)whotalking\.com$ -(^|\.)whylover\.com$ -(^|\.)whyx\.org$ -(^|\.)widevine\.com$ -(^|\.)wikaba\.com$ -(^|\.)wiki\.cnitter\.com$ -(^|\.)wiki\.esu\.im$ -(^|\.)wiki\.gamerp\.jp$ -(^|\.)wiki\.jqueryui\.com$ -(^|\.)wiki\.keso\.cn$ -(^|\.)wiki\.moegirl\.org$ -(^|\.)wiki\.oauth\.net$ -(^|\.)wiki\.phonegap\.com$ -(^|\.)wikileaks-forum\.com$ -(^|\.)wikileaks\.ch$ -(^|\.)wikileaks\.com$ -(^|\.)wikileaks\.de$ -(^|\.)wikileaks\.eu$ -(^|\.)wikileaks\.lu$ -(^|\.)wikileaks\.org$ -(^|\.)wikileaks\.pl$ -(^|\.)wikilivres\.info$ -(^|\.)wikimapia\.org$ -(^|\.)wikiwiki\.jp$ -(^|\.)wildammo\.com$ -(^|\.)willw\.net$ -(^|\.)windowsphoneme\.com$ -(^|\.)windscribe\.com$ -(^|\.)wingamestore\.com$ -(^|\.)wingy\.site$ -(^|\.)winning11\.com$ -(^|\.)winwhispers\.info$ -(^|\.)wire\.com$ -(^|\.)wiredbytes\.com$ -(^|\.)wiredpen\.com$ -(^|\.)wisdompubs\.org$ -(^|\.)wisevid\.com$ -(^|\.)withgoogle\.com$ -(^|\.)withyoutube\.com$ -(^|\.)witnessleeteaching\.com$ -(^|\.)witopia\.net$ -(^|\.)wizcrafts\.net$ -(^|\.)wjbk\.org$ -(^|\.)wlcnew\.jigsy\.com$ -(^|\.)wlx\.sowiki\.net$ -(^|\.)wn\.com$ -(^|\.)wnacg\.com$ -(^|\.)wnacg\.org$ -(^|\.)wo\.tc$ -(^|\.)wo3ttt\.wordpress\.com$ -(^|\.)woeser\.com$ -(^|\.)woesermiddle-way\.net$ -(^|\.)wokar\.org$ -(^|\.)wolfax\.com$ -(^|\.)woolyss\.com$ -(^|\.)woopie\.jp$ -(^|\.)woopie\.tv$ -(^|\.)wordpress\.com$ -(^|\.)workatruna\.com$ -(^|\.)workerdemo\.org\.hk$ -(^|\.)workersthebig\.net$ -(^|\.)worldcat\.org$ -(^|\.)worldjournal\.com$ -(^|\.)worldvpn\.net$ -(^|\.)wow-life\.net$ -(^|\.)wow\.com$ -(^|\.)wowgirls\.com$ -(^|\.)wowlegacy\.ml$ -(^|\.)wowporn\.com$ -(^|\.)wowrk\.com$ -(^|\.)woxinghuiguo\.com$ -(^|\.)woyaolian\.org$ -(^|\.)wozy\.in$ -(^|\.)wp\.com$ -(^|\.)wpoforum\.com$ -(^|\.)wqyd\.org$ -(^|\.)wrchina\.org$ -(^|\.)wretch\.cc$ -(^|\.)writer\.zoho\.com$ -(^|\.)wsgzao\.github\.io$ -(^|\.)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$ -(^|\.)wuu\.wikipedia\.org$ -(^|\.)wuw\.red$ -(^|\.)wuyanblog\.com$ -(^|\.)wwitv\.com$ -(^|\.)www\.ajsands\.com$ -(^|\.)www\.americorps\.gov$ -(^|\.)www\.antd\.org$ -(^|\.)www\.aolnews\.com$ -(^|\.)www\.businessinsider\.com\.au$ -(^|\.)www\.citizenlab\.org$ -(^|\.)www\.cmoinc\.org$ -(^|\.)www\.cool18\.com$ -(^|\.)www\.dmm\.com$ -(^|\.)www\.dwheeler\.com$ -(^|\.)www\.eastturkistan\.net$ -(^|\.)www\.ftchinese\.com$ -(^|\.)www\.gmiddle\.com$ -(^|\.)www\.gmiddle\.net$ -(^|\.)www\.hustlercash\.com$ -(^|\.)www\.idlcoyote\.com$ -(^|\.)www\.imdb\.com$ -(^|\.)www\.kindleren\.com$ -(^|\.)www\.klip\.me$ -(^|\.)www\.lamenhu\.com$ -(^|\.)www\.lib\.virginia\.edu$ -(^|\.)www\.linksalpha\.com$ -(^|\.)www\.m-sport\.co\.uk$ -(^|\.)www\.metro\.taipei$ -(^|\.)www\.monlamit\.org$ -(^|\.)www\.moztw\.org$ -(^|\.)www\.nbc\.com$ -(^|\.)www\.orchidbbs\.com$ -(^|\.)www\.owind\.com$ -(^|\.)www\.oxid\.it$ -(^|\.)www\.powerpointninja\.com$ -(^|\.)www\.s4miniarchive\.com$ -(^|\.)www\.sciencemag\.org$ -(^|\.)www\.shadowsocks\.com$ -(^|\.)www\.shwchurch\.org$ -(^|\.)www\.skype\.com$ -(^|\.)www\.tablesgenerator\.com$ -(^|\.)www\.taiwanonline\.cc$ -(^|\.)www\.taup\.org\.tw$ -(^|\.)www\.thechinastory\.org$ -(^|\.)www\.wan-press\.org$ -(^|\.)www\.wangruowang\.org$ -(^|\.)www\.websnapr\.com$ -(^|\.)www\.zensur\.freerk\.com$ -(^|\.)www1\.american\.edu$ -(^|\.)www1\.biz$ -(^|\.)www2\.ohchr\.org$ -(^|\.)www2\.rocketbbs\.com$ -(^|\.)wwwhost\.biz$ -(^|\.)wzyboy\.im$ -(^|\.)x-art\.com$ -(^|\.)x-berry\.com$ -(^|\.)x-wall\.org$ -(^|\.)x\.company$ -(^|\.)x1949x\.com$ -(^|\.)x24hr\.com$ -(^|\.)x365x\.com$ -(^|\.)xa\.yimg\.com$ -(^|\.)xanga\.com$ -(^|\.)xbabe\.com$ -(^|\.)xbookcn\.com$ -(^|\.)xcafe\.in$ -(^|\.)xcity\.jp$ -(^|\.)xcritic\.com$ -(^|\.)xerotica\.com$ -(^|\.)xfinity\.com$ -(^|\.)xfm\.pp\.ru$ -(^|\.)xgmyd\.com$ -(^|\.)xhamster\.com$ -(^|\.)xianchawang\.net$ -(^|\.)xianjian\.tw$ -(^|\.)xianqiao\.net$ -(^|\.)xiaobaiwu\.com$ -(^|\.)xiaochuncnjp\.com$ -(^|\.)xiaod\.in$ -(^|\.)xiaohexie\.com$ -(^|\.)xiaolan\.me$ -(^|\.)xiaoma\.org$ -(^|\.)xiezhua\.com$ -(^|\.)xihua\.es$ -(^|\.)xing\.com$ -(^|\.)xinhuanet\.org$ -(^|\.)xinmiao\.com\.hk$ -(^|\.)xinqimeng\.over-blog\.com$ -(^|\.)xinsheng\.net$ -(^|\.)xinshijue\.com$ -(^|\.)xinyubbs\.net$ -(^|\.)xiongpian\.com$ -(^|\.)xiuren\.org$ -(^|\.)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--czq75pvv1aj5c\.org$ -(^|\.)xn--i2ru8q2qg\.com$ -(^|\.)xn--ngstr-lra8j\.com$ -(^|\.)xn--p8j9a0d9c9a\.xn--q9jyb4c$ -(^|\.)xnxx\.com$ -(^|\.)xpdo\.net$ -(^|\.)xpud\.org$ -(^|\.)xrentdvd\.com$ -(^|\.)xskywalker\.com$ -(^|\.)xskywalker\.net$ -(^|\.)xtube\.com$ -(^|\.)xuchao\.net$ -(^|\.)xuchao\.org$ -(^|\.)xuehua\.us$ -(^|\.)xuzhiyong\.net$ -(^|\.)xvideo\.cc$ -(^|\.)xvideos\.com$ -(^|\.)xvideos\.es$ -(^|\.)xxbbx\.com$ -(^|\.)xxlmovies\.com$ -(^|\.)xxuz\.com$ -(^|\.)xxx\.com$ -(^|\.)xxx\.xxx$ -(^|\.)xxxfuckmom\.com$ -(^|\.)xxxx\.com\.au$ -(^|\.)xxxy\.biz$ -(^|\.)xxxy\.info$ -(^|\.)xxxymovies\.com$ -(^|\.)xys\.dxiong\.com$ -(^|\.)xys\.org$ -(^|\.)xysblogs\.org$ -(^|\.)xyy69\.com$ -(^|\.)xyy69\.info$ -(^|\.)yahoo\.com\.hk$ -(^|\.)yakbutterblues\.com$ -(^|\.)yam\.com$ -(^|\.)yam\.org\.tw$ -(^|\.)yanghengjun\.com$ -(^|\.)yangjianli\.com$ -(^|\.)yasni\.co\.uk$ -(^|\.)yayabay\.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$ -(^|\.)yilubbs\.com$ -(^|\.)yingsuoss\.com$ -(^|\.)yinlei\.org$ -(^|\.)yipub\.com$ -(^|\.)yizhihongxing\.com$ -(^|\.)yobt\.com$ -(^|\.)yobt\.tv$ -(^|\.)yogichen\.org$ -(^|\.)yong\.hu$ -(^|\.)yorkbbs\.ca$ -(^|\.)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$ -(^|\.)youthnetradio\.org$ -(^|\.)youtu\.be$ -(^|\.)youtube-nocookie\.com$ -(^|\.)youtube\.com$ -(^|\.)youtubecn\.com$ -(^|\.)youtubeeducation\.com$ -(^|\.)youtubegaming\.com$ -(^|\.)youversion\.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$ -(^|\.)yzzk\.com$ -(^|\.)zacebook\.com$ -(^|\.)zalmos\.com$ -(^|\.)zannel\.com$ -(^|\.)zaobao\.com\.sg$ -(^|\.)zaozon\.com$ -(^|\.)zapto\.org$ -(^|\.)zattoo\.com$ -(^|\.)zdnet\.com\.tw$ -(^|\.)zello\.com$ -(^|\.)zengjinyan\.org$ -(^|\.)zenmate\.com$ -(^|\.)zenmate\.com\.ru$ -(^|\.)zeronet\.io$ -(^|\.)zeutch\.com$ -(^|\.)zfreet\.com$ -(^|\.)zgsddh\.com$ -(^|\.)zgzcjj\.net$ -(^|\.)zh-yue\.wikipedia\.org$ -(^|\.)zh\.ecdm\.wikia\.com$ -(^|\.)zh\.m\.wikipedia\.org$ -(^|\.)zh\.pokerstrategy\.com$ -(^|\.)zh\.uncyclopedia\.wikia\.com$ -(^|\.)zh\.wikinews\.org$ -(^|\.)zh\.wikipedia\.org$ -(^|\.)zh\.wikisource\.org$ -(^|\.)zhanbin\.net$ -(^|\.)zhangboli\.net$ -(^|\.)zhangtianliang\.com$ -(^|\.)zhanlve\.org$ -(^|\.)zhao\.1984\.city$ -(^|\.)zhao\.jinhai\.de$ -(^|\.)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$ -(^|\.)ziddu\.com$ -(^|\.)zillionk\.com$ -(^|\.)zim\.vn$ -(^|\.)zinio\.com$ -(^|\.)ziporn\.com$ -(^|\.)zippyshare\.com$ -(^|\.)zkaip\.com$ -(^|\.)zmw\.cn$ -(^|\.)zodgame\.us$ -(^|\.)zomobo\.net$ -(^|\.)zonaeuropa\.com$ -(^|\.)zonghexinwen\.com$ -(^|\.)zonghexinwen\.net$ -(^|\.)zoogvpn\.com$ -(^|\.)zootool\.com$ -(^|\.)zoozle\.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$ -(^|\.)zyzc9\.com$ -(^|\.)zzcartoon\.com$ -(^|\.)zzux\.com$ diff --git a/client/android/shadowsocks/src/main/assets/acl/bypass-lan-china.acl b/client/android/shadowsocks/src/main/assets/acl/bypass-lan-china.acl deleted file mode 100644 index 64500c093..000000000 --- a/client/android/shadowsocks/src/main/assets/acl/bypass-lan-china.acl +++ /dev/null @@ -1,10391 +0,0 @@ -[proxy_all] - -[bypass_list] -0.0.0.0/8 -10.0.0.0/8 -100.64.0.0/10 -127.0.0.0/8 -169.254.0.0/16 -172.16.0.0/12 -192.0.0.0/29 -192.0.2.0/24 -192.88.99.0/24 -192.168.0.0/16 -198.18.0.0/15 -198.51.100.0/24 -203.0.113.0/24 -224.0.0.0/3 -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.32.0/19 -8.208.64.0/18 -8.208.128.0/17 -8.209.0.0/16 -8.210.0.0/15 -8.212.0.0/14 -8.216.0.0/13 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.251.240.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -65.55.60.184/30 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.119.224.0/22 -103.120.52.0/22 -103.120.72.0/22 -103.120.76.0/24 -103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 -103.121.52.0/22 -103.121.92.0/22 -103.121.160.0/21 -103.121.250.0/24 -103.121.252.0/22 -103.129.52.0/22 -103.129.148.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.197.104.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -130.214.218.0/23 -131.228.96.0/24 -131.253.12.0/29 -131.253.12.80/28 -131.253.12.240/29 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -147.243.13.32/27 -147.243.13.64/27 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.158.0.0/16 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.32.136.0/21 -152.32.144.0/20 -152.32.160.0/19 -152.32.192.0/18 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -188.65.16.0/22 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.1.0/24 -202.95.2.0/23 -202.95.4.0/22 -202.95.8.0/21 -202.95.16.0/20 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 - -[proxy_list] -# Telegram IPs$ -91.108.4.0/22 -91.108.8.0/21 -91.108.16.0/21 -91.108.36.0/22 -91.108.56.0/22 -109.239.140.0/24 -149.154.160.0/20 -14.102.250.18 -14.102.250.19 -174.142.105.153 -50.7.31.230 -67.220.91.15 -67.220.91.18 -67.220.91.23 -69.65.19.160 -72.52.81.22 -85.17.73.31 -(^|\.)030buy\.com$ -(^|\.)0rz\.tw$ -(^|\.)1-apple\.com\.tw$ -(^|\.)10\.tt$ -(^|\.)1000giri\.net$ -(^|\.)100ke\.org$ -(^|\.)10conditionsoflove\.com$ -(^|\.)10musume\.com$ -(^|\.)123rf\.com$ -(^|\.)12bet\.com$ -(^|\.)12vpn\.com$ -(^|\.)12vpn\.net$ -(^|\.)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$ -(^|\.)1984bbs\.com$ -(^|\.)1984bbs\.org$ -(^|\.)1989report\.hkja\.org\.hk$ -(^|\.)1991way\.com$ -(^|\.)1998cdp\.org$ -(^|\.)1bao\.org$ -(^|\.)1dumb\.com$ -(^|\.)1e100\.net$ -(^|\.)1eew\.com$ -(^|\.)1mobile\.com$ -(^|\.)1pondo\.tv$ -(^|\.)2-hand\.info$ -(^|\.)2000fun\.com$ -(^|\.)2008xianzhang\.info$ -(^|\.)2017\.hk$ -(^|\.)21andy\.com$ -(^|\.)21pron\.com$ -(^|\.)21sextury\.com$ -(^|\.)228\.net\.tw$ -(^|\.)233abc\.com$ -(^|\.)24hrs\.ca$ -(^|\.)24smile\.org$ -(^|\.)25u\.com$ -(^|\.)2dbook\.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$ -(^|\.)466453\.com$ -(^|\.)4bluestones\.biz$ -(^|\.)4chan\.com$ -(^|\.)4dq\.com$ -(^|\.)4everproxy\.com$ -(^|\.)4irc\.com$ -(^|\.)4mydomain\.com$ -(^|\.)4pu\.com$ -(^|\.)4rbtv\.com$ -(^|\.)4shared\.com$ -(^|\.)4tern\.com$ -(^|\.)51\.ca$ -(^|\.)51jav\.org$ -(^|\.)51luoben\.com$ -(^|\.)5278\.cc$ -(^|\.)56cun04\.jigsy\.com$ -(^|\.)5aimiku\.com$ -(^|\.)5i01\.com$ -(^|\.)5isotoi5\.org$ -(^|\.)5maodang\.com$ -(^|\.)63i\.com$ -(^|\.)64memo$ -(^|\.)64museum\.org$ -(^|\.)64tianwang\.com$ -(^|\.)64wiki\.com$ -(^|\.)66\.ca$ -(^|\.)666kb\.com$ -(^|\.)6park\.com$ -(^|\.)6parker\.com$ -(^|\.)7capture\.com$ -(^|\.)7cow\.com$ -(^|\.)8-d\.com$ -(^|\.)85cc\.net$ -(^|\.)85cc\.us$ -(^|\.)85st\.com$ -(^|\.)881903\.com$ -(^|\.)888\.com$ -(^|\.)888poker\.com$ -(^|\.)89-64\.org$ -(^|\.)89\.64\.charter\.constitutionalism\.solutions$ -(^|\.)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$ -(^|\.)a-normal-day\.com$ -(^|\.)a248\.e\.akamai\.net$ -(^|\.)a5\.com\.ru$ -(^|\.)aamacau\.com$ -(^|\.)abc\.com$ -(^|\.)abc\.pp\.ru$ -(^|\.)abc\.xyz$ -(^|\.)abchinese\.com$ -(^|\.)abclite\.net$ -(^|\.)abitno\.linpie\.com$ -(^|\.)ablwang\.com$ -(^|\.)aboluowang\.com$ -(^|\.)aboutgfw\.com$ -(^|\.)abs\.edu$ -(^|\.)ac\.jiruan\.net$ -(^|\.)accim\.org$ -(^|\.)aceros-de-hispania\.com$ -(^|\.)acevpn\.com$ -(^|\.)acg18\.me$ -(^|\.)acgkj\.com$ -(^|\.)acmedia365\.com$ -(^|\.)acmetoy\.com$ -(^|\.)acnw\.com\.au$ -(^|\.)actfortibet\.org$ -(^|\.)actimes\.com\.au$ -(^|\.)activpn\.com$ -(^|\.)aculo\.us$ -(^|\.)addictedtocoffee\.de$ -(^|\.)adelaidebbs\.com$ -(^|\.)admob\.com$ -(^|\.)adorama\.com$ -(^|\.)adpl\.org\.hk$ -(^|\.)ads-twitter\.com$ -(^|\.)adsense\.com$ -(^|\.)adult-sex-games\.com$ -(^|\.)adult\.friendfinder\.com$ -(^|\.)adultfriendfinder\.com$ -(^|\.)adultkeep\.net$ -(^|\.)advanscene\.com$ -(^|\.)advertfan\.com$ -(^|\.)ae\.hao123\.com$ -(^|\.)ae\.org$ -(^|\.)aenhancers\.com$ -(^|\.)af\.mil$ -(^|\.)afantibbs\.com$ -(^|\.)agnesb\.fr$ -(^|\.)agoogleaday\.com$ -(^|\.)agro\.hk$ -(^|\.)ahr0chm6ly95zwnslm5lda$ -(^|\.)ai-kan\.net$ -(^|\.)ai-wen\.net$ -(^|\.)ai\.binwang\.me$ -(^|\.)aiph\.net$ -(^|\.)airasia\.com$ -(^|\.)airconsole\.com$ -(^|\.)airvpn\.org$ -(^|\.)aisex\.com$ -(^|\.)ait\.org\.tw$ -(^|\.)aiweiwei\.com$ -(^|\.)aiweiweiblog\.com$ -(^|\.)akademiye\.org$ -(^|\.)akiba-online\.com$ -(^|\.)akiba-web\.com$ -(^|\.)al-islam\.com$ -(^|\.)al-qimmah\.net$ -(^|\.)alabout\.com$ -(^|\.)alanhou\.com$ -(^|\.)alarab\.qa$ -(^|\.)alasbarricadas\.org$ -(^|\.)alexlur\.org$ -(^|\.)alforattv\.net$ -(^|\.)alhayat\.com$ -(^|\.)alicejapan\.co\.jp$ -(^|\.)alien-ufos\.com$ -(^|\.)aliengu\.com$ -(^|\.)alkasir\.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\.com$ -(^|\.)ameblo\.jp$ -(^|\.)americangreencard\.com$ -(^|\.)americanunfinished\.com$ -(^|\.)amiblockedornot\.com$ -(^|\.)amigobbs\.net$ -(^|\.)amitabhafoundation\.us$ -(^|\.)amnesty\.org$ -(^|\.)amnesty\.org\.hk$ -(^|\.)amnesty\.tw$ -(^|\.)amnestyusa\.org$ -(^|\.)amnyemachen\.org$ -(^|\.)amoiist\.com$ -(^|\.)ampproject\.org$ -(^|\.)amtb-taipei\.org$ -(^|\.)anchorfree\.com$ -(^|\.)ancsconf\.org$ -(^|\.)andfaraway\.net$ -(^|\.)android-x86\.org$ -(^|\.)android\.com$ -(^|\.)androidify\.com$ -(^|\.)androidplus\.co$ -(^|\.)andygod\.com$ -(^|\.)angelfire\.com$ -(^|\.)angularjs\.org$ -(^|\.)animecrazy\.net$ -(^|\.)animeshippuuden\.com$ -(^|\.)aniscartujo\.com$ -(^|\.)annatam\.com$ -(^|\.)anobii\.com$ -(^|\.)anontext\.com$ -(^|\.)anonymise\.us$ -(^|\.)anonymitynetwork\.com$ -(^|\.)anonymizer\.com$ -(^|\.)anpopo\.com$ -(^|\.)answering-islam\.org$ -(^|\.)anthonycalzadilla\.com$ -(^|\.)anti1984\.com$ -(^|\.)antichristendom\.com$ -(^|\.)antiwave\.net$ -(^|\.)anyporn\.com$ -(^|\.)anysex\.com$ -(^|\.)aobo\.com\.au$ -(^|\.)aofriend\.com$ -(^|\.)aofriend\.com\.au$ -(^|\.)aojiao\.org$ -(^|\.)aolchannels\.aol\.com$ -(^|\.)aomiwang\.com$ -(^|\.)apetube\.com$ -(^|\.)api-secure\.recaptcha\.net$ -(^|\.)api-verify\.recaptcha\.net$ -(^|\.)api\.ai$ -(^|\.)api\.dropboxapi\.com$ -(^|\.)api\.linksalpha\.com$ -(^|\.)api\.proxlet\.com$ -(^|\.)api\.recaptcha\.net$ -(^|\.)apiary\.io$ -(^|\.)apidocs\.linksalpha\.com$ -(^|\.)apigee\.com$ -(^|\.)apk-dl\.com$ -(^|\.)apkdler\.com$ -(^|\.)apkmirror\.com$ -(^|\.)apkmonk\.com$ -(^|\.)apkplz\.com$ -(^|\.)apkpure\.com$ -(^|\.)aplusvpn\.com$ -(^|\.)app\.box\.com$ -(^|\.)app\.heywire\.com$ -(^|\.)app\.tutanota\.com$ -(^|\.)appdownloader\.net$ -(^|\.)appledaily\.com$ -(^|\.)appshopper\.com$ -(^|\.)appsocks\.net$ -(^|\.)appspot\.com$ -(^|\.)appsto\.re$ -(^|\.)ar\.hao123\.com$ -(^|\.)archive\.fo$ -(^|\.)archive\.is$ -(^|\.)archive\.org$ -(^|\.)archives\.gov$ -(^|\.)archives\.gov\.tw$ -(^|\.)arctosia\.com$ -(^|\.)areca-backup\.org$ -(^|\.)arena\.taipei$ -(^|\.)arethusa\.su$ -(^|\.)arlingtoncemetery\.mil$ -(^|\.)army\.mil$ -(^|\.)art4tibet1998\.org$ -(^|\.)artofpeacefoundation\.org$ -(^|\.)artsy\.net$ -(^|\.)asacp\.org$ -(^|\.)asahichinese\.com$ -(^|\.)asdfg\.jp$ -(^|\.)asg\.to$ -(^|\.)asia-gaming\.com$ -(^|\.)asiaharvest\.org$ -(^|\.)asianews\.it$ -(^|\.)asiansexdiary\.com$ -(^|\.)asianspiss\.com$ -(^|\.)asianwomensfilm\.de$ -(^|\.)asiatgp\.com$ -(^|\.)asiatoday\.us$ -(^|\.)askstudent\.com$ -(^|\.)askynz\.net$ -(^|\.)assembla\.com$ -(^|\.)assimp\.org$ -(^|\.)astrill\.com$ -(^|\.)atc\.org\.au$ -(^|\.)atchinese\.com$ -(^|\.)atdmt\.com$ -(^|\.)atgfw\.org$ -(^|\.)athenaeizou\.com$ -(^|\.)atlanta168\.com$ -(^|\.)atlaspost\.com$ -(^|\.)atnext\.com$ -(^|\.)authorizeddns\.net$ -(^|\.)authorizeddns\.org$ -(^|\.)authorizeddns\.us$ -(^|\.)autodraw\.com$ -(^|\.)av\.com$ -(^|\.)av\.movie$ -(^|\.)av\.nightlife141\.com$ -(^|\.)avaaz\.org$ -(^|\.)avbody\.tv$ -(^|\.)avcity\.tv$ -(^|\.)avcool\.com$ -(^|\.)avdb\.in$ -(^|\.)avdb\.tv$ -(^|\.)avfantasy\.com$ -(^|\.)avidemux\.org$ -(^|\.)avmo\.pw$ -(^|\.)avmoo\.com$ -(^|\.)avmoo\.net$ -(^|\.)avmoo\.pw$ -(^|\.)avoision\.com$ -(^|\.)avyahoo\.com$ -(^|\.)axureformac\.com$ -(^|\.)azerbaycan\.tv$ -(^|\.)azerimix\.com$ -(^|\.)azubu\.tv$ -(^|\.)b0ne\.com$ -(^|\.)babynet\.com\.hk$ -(^|\.)backchina\.com$ -(^|\.)backpackers\.com\.tw$ -(^|\.)backtotiananmen\.com$ -(^|\.)badjojo\.com$ -(^|\.)badoo\.com$ -(^|\.)baidu\.jp$ -(^|\.)bailandaily\.com$ -(^|\.)baixing\.me$ -(^|\.)bakgeekhome\.tk$ -(^|\.)banana-vpn\.com$ -(^|\.)bandwagonhost\.com$ -(^|\.)bangbrosnetwork\.com$ -(^|\.)bangchen\.net$ -(^|\.)bangyoulater\.com$ -(^|\.)bannedbook\.org$ -(^|\.)bannednews\.org$ -(^|\.)banorte\.com$ -(^|\.)baramangaonline\.com$ -(^|\.)barenakedislam\.com$ -(^|\.)barnabu\.co\.uk$ -(^|\.)bartvpn\.com$ -(^|\.)bash-hackers\.org$ -(^|\.)bastillepost\.com$ -(^|\.)bayvoice\.net$ -(^|\.)bb-chat\.tv$ -(^|\.)bb\.ttv\.com\.tw$ -(^|\.)bbc\.co\.uk$ -(^|\.)bbc\.com$ -(^|\.)bbc\.com%2fzhongwen$ -(^|\.)bbc\.in$ -(^|\.)bbcchinese\.com$ -(^|\.)bbchat\.tv$ -(^|\.)bbg\.gov$ -(^|\.)bbkz\.com$ -(^|\.)bbnradio\.org$ -(^|\.)bbs-tw\.com$ -(^|\.)bbs\.brockbbs\.com$ -(^|\.)bbs\.cantonese\.asia$ -(^|\.)bbs\.ecstart\.com$ -(^|\.)bbs\.hanminzu\.org$ -(^|\.)bbs\.hasi\.wang$ -(^|\.)bbs\.huasing\.org$ -(^|\.)bbs\.junglobal\.net$ -(^|\.)bbs\.kimy\.com\.tw$ -(^|\.)bbs\.morbell\.com$ -(^|\.)bbs\.mychat\.to$ -(^|\.)bbs\.netbig\.com$ -(^|\.)bbs\.ozchinese\.com$ -(^|\.)bbs\.qmzdd\.com$ -(^|\.)bbs\.sina\.com$ -(^|\.)bbs\.sina\.com%2f$ -(^|\.)bbs\.skykiwi\.com$ -(^|\.)bbs\.sou-tong\.org$ -(^|\.)bbs\.tuitui\.info$ -(^|\.)bbsdigest\.com$ -(^|\.)bbsfeed\.com$ -(^|\.)bbsland\.com$ -(^|\.)bbsmo\.com$ -(^|\.)bbsone\.com$ -(^|\.)bbtoystore\.com$ -(^|\.)bcast\.co\.nz$ -(^|\.)bcc\.com\.tw$ -(^|\.)bcchinese\.net$ -(^|\.)bcmorning\.com$ -(^|\.)bdsmvideos\.net$ -(^|\.)beaconevents\.com$ -(^|\.)bebo\.com$ -(^|\.)beeg\.com$ -(^|\.)beevpn\.com$ -(^|\.)behindkink\.com$ -(^|\.)beijing1989\.com$ -(^|\.)beijingspring\.com$ -(^|\.)beijingzx\.org$ -(^|\.)belamionline\.com$ -(^|\.)bell\.wiki$ -(^|\.)bemywife\.cc$ -(^|\.)beric\.me$ -(^|\.)berlintwitterwall\.com$ -(^|\.)berm\.co\.nz$ -(^|\.)bestforchina\.org$ -(^|\.)bestgore\.com$ -(^|\.)bestpornstardb\.com$ -(^|\.)bestvpn\.com$ -(^|\.)bestvpnanalysis\.com$ -(^|\.)bestvpnserver\.com$ -(^|\.)bestvpnservice\.com$ -(^|\.)bestvpnusa\.com$ -(^|\.)bet365\.com$ -(^|\.)beta\.usejump\.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$ -(^|\.)bic2011\.org$ -(^|\.)bigfools\.com$ -(^|\.)bigjapanesesex\.com$ -(^|\.)bigmoney\.biz$ -(^|\.)bignews\.org$ -(^|\.)bigsound\.org$ -(^|\.)biliworld\.com$ -(^|\.)billypan\.com$ -(^|\.)binux\.me$ -(^|\.)bipic\.net$ -(^|\.)bit\.do$ -(^|\.)bit\.ly$ -(^|\.)bitc\.bme\.emory\.edu$ -(^|\.)bitcointalk\.org$ -(^|\.)bitmex\.com$ -(^|\.)bitshare\.com$ -(^|\.)bitsnoop\.com$ -(^|\.)bitvise\.com$ -(^|\.)bizhat\.com$ -(^|\.)bjnewlife\.org$ -(^|\.)bjs\.org$ -(^|\.)bjzc\.org$ -(^|\.)bl-doujinsouko\.com$ -(^|\.)blacklogic\.com$ -(^|\.)blackvpn\.com$ -(^|\.)blewpass\.com$ -(^|\.)blinkx\.com$ -(^|\.)blinw\.com$ -(^|\.)blip\.tv$ -(^|\.)blockcn\.com$ -(^|\.)blockless\.com$ -(^|\.)blog\.calibre-ebook\.com$ -(^|\.)blog\.cnyes\.com$ -(^|\.)blog\.daum\.net$ -(^|\.)blog\.de$ -(^|\.)blog\.exblog\.co\.jp$ -(^|\.)blog\.excite\.co\.jp$ -(^|\.)blog\.expofutures\.com$ -(^|\.)blog\.fizzik\.com$ -(^|\.)blog\.foolsmountain\.com$ -(^|\.)blog\.fuckgfw233\.org$ -(^|\.)blog\.goo\.ne\.jp$ -(^|\.)blog\.google$ -(^|\.)blog\.inoreader\.com$ -(^|\.)blog\.istef\.info$ -(^|\.)blog\.jackjia\.com$ -(^|\.)blog\.jp$ -(^|\.)blog\.kangye\.org$ -(^|\.)blog\.lester850\.info$ -(^|\.)blog\.martinoei\.com$ -(^|\.)blog\.pathtosharepoint\.com$ -(^|\.)blog\.pentalogic\.net$ -(^|\.)blog\.qooza\.hk$ -(^|\.)blog\.ranxiang\.com$ -(^|\.)blog\.sina\.com\.tw$ -(^|\.)blog\.sogoo\.org$ -(^|\.)blog\.soylent\.com$ -(^|\.)blog\.syx86\.cn$ -(^|\.)blog\.syx86\.com$ -(^|\.)blog\.taragana\.com$ -(^|\.)blog\.tiney\.com$ -(^|\.)blog\.xuite\.net$ -(^|\.)blog\.youthwant\.com\.tw$ -(^|\.)blog\.youxu\.info$ -(^|\.)blogblog\.com$ -(^|\.)blogcatalog\.com$ -(^|\.)blogcity\.me$ -(^|\.)blogdns\.org$ -(^|\.)blogger\.com$ -(^|\.)blogimg\.jp$ -(^|\.)bloglines\.com$ -(^|\.)bloglovin\.com$ -(^|\.)blogs\.icerocket\.com$ -(^|\.)blogs\.libraryinformationtechnology\.com$ -(^|\.)blogs\.tampabay\.com$ -(^|\.)blogs\.yahoo\.co\.jp$ -(^|\.)blogspot(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)blogtd\.net$ -(^|\.)blogtd\.org$ -(^|\.)bloodshed\.net$ -(^|\.)bloomberg\.cn$ -(^|\.)bloomberg\.com$ -(^|\.)bloomberg\.de$ -(^|\.)bloombergview\.com$ -(^|\.)bloomfortune\.com$ -(^|\.)blueangellive\.com$ -(^|\.)bmfinn\.com$ -(^|\.)bnews\.co$ -(^|\.)bnrmetal\.com$ -(^|\.)boardreader\.com$ -(^|\.)bod\.asia$ -(^|\.)bodog88\.com$ -(^|\.)bolehvpn\.net$ -(^|\.)bolin\.netfirms\.com$ -(^|\.)bonbonme\.com$ -(^|\.)bonbonsex\.com$ -(^|\.)bonfoundation\.org$ -(^|\.)bongacams\.com$ -(^|\.)boobstagram\.com$ -(^|\.)book\.com\.tw$ -(^|\.)book\.zi5\.me$ -(^|\.)bookepub\.com$ -(^|\.)books\.com\.tw$ -(^|\.)boomssr\.com$ -(^|\.)bot\.nu$ -(^|\.)botanwang\.com$ -(^|\.)bowenpress\.com$ -(^|\.)boxpn\.com$ -(^|\.)boxun$ -(^|\.)boxun\.com$ -(^|\.)boxun\.tv$ -(^|\.)boxunblog\.com$ -(^|\.)boxunclub\.com$ -(^|\.)boyangu\.com$ -(^|\.)boyfriendtv\.com$ -(^|\.)boysfood\.com$ -(^|\.)boysmaster\.com$ -(^|\.)br\.hao123\.com$ -(^|\.)br\.st$ -(^|\.)brainyquote\.com$ -(^|\.)brandonhutchinson\.com$ -(^|\.)braumeister\.org$ -(^|\.)bravotube\.net$ -(^|\.)brazzers\.com$ -(^|\.)break\.com$ -(^|\.)breakgfw\.com$ -(^|\.)breaking911\.com$ -(^|\.)breakingtweets\.com$ -(^|\.)breakwall\.net$ -(^|\.)briefdream\.com$ -(^|\.)briian\.com$ -(^|\.)brizzly\.com$ -(^|\.)brkmd\.com$ -(^|\.)broadbook\.com$ -(^|\.)broadpressinc\.com$ -(^|\.)brucewang\.net$ -(^|\.)brutaltgp\.com$ -(^|\.)bt2mag\.com$ -(^|\.)bt95\.com$ -(^|\.)btaia\.com$ -(^|\.)btbtav\.com$ -(^|\.)btdigg\.org$ -(^|\.)btku\.me$ -(^|\.)btku\.org$ -(^|\.)btspread\.com$ -(^|\.)budaedu\.org$ -(^|\.)buddhanet\.com\.tw$ -(^|\.)buddhistchannel\.tv$ -(^|\.)buffered\.com$ -(^|\.)bullog\.org$ -(^|\.)bullogger\.com$ -(^|\.)bunbunhk\.com$ -(^|\.)busayari\.com$ -(^|\.)businessinsider\.com$ -(^|\.)businessweek\.com$ -(^|\.)busu\.org$ -(^|\.)busytrade\.com$ -(^|\.)buugaa\.com$ -(^|\.)buy\.yahoo\.com\.tw$ -(^|\.)buzzhand\.com$ -(^|\.)buzzhand\.net$ -(^|\.)buzzorange\.com$ -(^|\.)bvpn\.com$ -(^|\.)bwsj\.hk$ -(^|\.)bx\.tl$ -(^|\.)bynet\.co\.il$ -(^|\.)c-est-simple\.com$ -(^|\.)c-spanvideo\.org$ -(^|\.)c100tibet\.org$ -(^|\.)c1522\.mooo\.com$ -(^|\.)cablegatesearch\.net$ -(^|\.)cachinese\.com$ -(^|\.)cacnw\.com$ -(^|\.)cactusvpn\.com$ -(^|\.)cafepress\.com$ -(^|\.)cahr\.org\.tw$ -(^|\.)calameo\.com$ -(^|\.)calebelston\.com$ -(^|\.)calgarychinese\.ca$ -(^|\.)calgarychinese\.com$ -(^|\.)calgarychinese\.net$ -(^|\.)cam4\.com$ -(^|\.)cam4\.jp$ -(^|\.)cam4\.sg$ -(^|\.)camfrog\.com$ -(^|\.)cams\.com$ -(^|\.)cams\.org\.sg$ -(^|\.)canadameet\.com$ -(^|\.)canalporno\.com$ -(^|\.)canyu\.org$ -(^|\.)cao\.im$ -(^|\.)caobian\.info$ -(^|\.)caochangqing\.com$ -(^|\.)cap\.org\.hk$ -(^|\.)carabinasypistolas\.com$ -(^|\.)cardinalkungfoundation\.org$ -(^|\.)carfax\.com$ -(^|\.)cari\.com\.my$ -(^|\.)caribbeancom\.com$ -(^|\.)carmotorshow\.com$ -(^|\.)cartoonmovement\.com$ -(^|\.)casadeltibetbcn\.org$ -(^|\.)casatibet\.org\.mx$ -(^|\.)casino\.williamhill\.com$ -(^|\.)casinobellini\.com$ -(^|\.)casinoking\.com$ -(^|\.)casinoriva\.com$ -(^|\.)castbox\.fm$ -(^|\.)catch22\.net$ -(^|\.)catfightpayperview\.xxx$ -(^|\.)catholic\.org\.hk$ -(^|\.)catholic\.org\.tw$ -(^|\.)cathvoice\.org\.tw$ -(^|\.)cattt\.com$ -(^|\.)cbc\.ca$ -(^|\.)cbs\.ntu\.edu\.tw$ -(^|\.)cbsnews\.com$ -(^|\.)cbtc\.org\.hk$ -(^|\.)cccat\.cc$ -(^|\.)cccat\.co$ -(^|\.)ccdtr\.org$ -(^|\.)cchere\.com$ -(^|\.)ccim\.org$ -(^|\.)cclife\.ca$ -(^|\.)cclife\.org$ -(^|\.)cclifefl\.org$ -(^|\.)ccthere\.com$ -(^|\.)cctmweb\.net$ -(^|\.)cctongbao\.com$ -(^|\.)ccue\.ca$ -(^|\.)ccue\.com$ -(^|\.)ccvoice\.ca$ -(^|\.)ccw\.org\.tw$ -(^|\.)cdbook\.org$ -(^|\.)cdcparty\.com$ -(^|\.)cdef\.org$ -(^|\.)cdig\.info$ -(^|\.)cdjp\.org$ -(^|\.)cdn$ -(^|\.)cdn-apple\.com$ -(^|\.)cdn-images\.mailchimp\.com$ -(^|\.)cdn\.assets\.lfpcontent\.com$ -(^|\.)cdn\.helixstudios\.net$ -(^|\.)cdn\.printfriendly\.com$ -(^|\.)cdn\.softlayer\.net$ -(^|\.)cdn1\.lp\.saboom\.com$ -(^|\.)cdnews\.com\.tw$ -(^|\.)cdninstagram\.com$ -(^|\.)cdp1989\.org$ -(^|\.)cdp1998\.org$ -(^|\.)cdp2006\.org$ -(^|\.)cdpa\.url\.tw$ -(^|\.)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$ -(^|\.)certificate\.revocationcheck\.com$ -(^|\.)cfhks\.org\.hk$ -(^|\.)cftfc\.com$ -(^|\.)cgdepot\.org$ -(^|\.)cgst\.edu$ -(^|\.)ch\.shvoong\.com$ -(^|\.)change\.org$ -(^|\.)changeip\.name$ -(^|\.)changeip\.net$ -(^|\.)changeip\.org$ -(^|\.)changp\.com$ -(^|\.)changsa\.net$ -(^|\.)channel8news\.sg$ -(^|\.)chapm25\.com$ -(^|\.)chatnook\.com$ -(^|\.)chaturbate\.com$ -(^|\.)chengmingmag\.com$ -(^|\.)chenguangcheng\.com$ -(^|\.)chenpokong\.com$ -(^|\.)chenpokong\.net$ -(^|\.)chenshan20042005\.wordpress\.com$ -(^|\.)cherrysave\.com$ -(^|\.)chhongbi\.org$ -(^|\.)chicagoncmtv\.com$ -(^|\.)china-mmm\.jp\.net$ -(^|\.)china-mmm\.net$ -(^|\.)china-mmm\.sa\.com$ -(^|\.)china-review\.com\.ua$ -(^|\.)china-week\.com$ -(^|\.)china\.hket\.com$ -(^|\.)china\.ucanews\.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$ -(^|\.)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$ -(^|\.)chinese\.donga\.com$ -(^|\.)chinese\.engadget\.com$ -(^|\.)chinese\.irib\.ir$ -(^|\.)chinese\.soifind\.com$ -(^|\.)chinesedaily\.com$ -(^|\.)chinesedailynews\.com$ -(^|\.)chinesedemocracy\.com$ -(^|\.)chinesegay\.org$ -(^|\.)chinesen\.de$ -(^|\.)chinesepen\.org$ -(^|\.)chinesetalks\.net$ -(^|\.)chineseupress\.com$ -(^|\.)chingcheong\.com$ -(^|\.)chinman\.net$ -(^|\.)chithu\.org$ -(^|\.)chn\.chosun\.com$ -(^|\.)chrdnet\.com$ -(^|\.)christianfreedom\.org$ -(^|\.)christianstudy\.com$ -(^|\.)christiantimes\.org\.hk$ -(^|\.)christusrex\.org$ -(^|\.)chrlawyers\.hk$ -(^|\.)chrome\.com$ -(^|\.)chromecast\.com$ -(^|\.)chromeexperiments\.com$ -(^|\.)chromercise\.com$ -(^|\.)chromestatus\.com$ -(^|\.)chromium\.org$ -(^|\.)chuang-yen\.org$ -(^|\.)chubold\.com$ -(^|\.)chubun\.com$ -(^|\.)chuizi\.net$ -(^|\.)churchinhongkong\.org$ -(^|\.)chushigangdrug\.ch$ -(^|\.)cienen\.com$ -(^|\.)cineastentreff\.de$ -(^|\.)cipfg\.org$ -(^|\.)circlethebayfortibet\.org$ -(^|\.)citizencn\.com$ -(^|\.)citizenlab\.org$ -(^|\.)citizenscommission\.hk$ -(^|\.)citizensradio\.org$ -(^|\.)city365\.ca$ -(^|\.)city9x\.com$ -(^|\.)citypopulation\.de$ -(^|\.)citytalk\.tw$ -(^|\.)civicparty\.hk$ -(^|\.)civildisobediencemovement\.org$ -(^|\.)civilhrfront\.org$ -(^|\.)civiliangunner\.com$ -(^|\.)civilmedia\.tw$ -(^|\.)ck101\.com$ -(^|\.)cl\.d0z\.net$ -(^|\.)clarionproject\.org$ -(^|\.)classicalguitarblog\.net$ -(^|\.)clb\.org\.hk$ -(^|\.)cldr\.unicode\.org$ -(^|\.)cleansite\.biz$ -(^|\.)cleansite\.info$ -(^|\.)cleansite\.us$ -(^|\.)clearharmony\.net$ -(^|\.)clearwisdom\.net$ -(^|\.)clementine-player\.org$ -(^|\.)cling\.omy\.sg$ -(^|\.)clinica-tibet\.ru$ -(^|\.)clipfish\.de$ -(^|\.)cloakpoint\.com$ -(^|\.)cloud\.mail\.ru$ -(^|\.)club1069\.com$ -(^|\.)cmi\.org\.tw$ -(^|\.)cmp\.hku\.hk$ -(^|\.)cms\.gov$ -(^|\.)cmule\.com$ -(^|\.)cmule\.org$ -(^|\.)cn-proxy\.com$ -(^|\.)cn\.calameo\.com$ -(^|\.)cn\.dayabook\.com$ -(^|\.)cn\.fmnnow\.com$ -(^|\.)cn\.freeones\.com$ -(^|\.)cn\.giganews\.com$ -(^|\.)cn\.ibtimes\.com$ -(^|\.)cn\.nytstyle\.com$ -(^|\.)cn\.sandscotaicentral\.com$ -(^|\.)cn\.shafaqna\.com$ -(^|\.)cn\.streetvoice\.com$ -(^|\.)cn\.uncyclopedia\.wikia\.com$ -(^|\.)cn\.uptodown\.com$ -(^|\.)cn\.voa\.mobi$ -(^|\.)cn2\.streetvoice\.com$ -(^|\.)cn6\.eu$ -(^|\.)cna\.com\.tw$ -(^|\.)cnabc\.com$ -(^|\.)cnbbnews\.wordpress\.com$ -(^|\.)cnd\.org$ -(^|\.)cnex\.org\.cn$ -(^|\.)cnineu\.com$ -(^|\.)cnn\.com$ -(^|\.)cnnews\.chosun\.com$ -(^|\.)cnpolitics\.org$ -(^|\.)cnproxy\.com$ -(^|\.)co\.ng\.mil$ -(^|\.)coat\.co\.jp$ -(^|\.)cochina\.co$ -(^|\.)cochina\.org$ -(^|\.)code1984\.com$ -(^|\.)codeshare\.io$ -(^|\.)codeskulptor\.org$ -(^|\.)collateralmurder\.com$ -(^|\.)collateralmurder\.org$ -(^|\.)com\.google$ -(^|\.)comefromchina\.com$ -(^|\.)comic-mega\.me$ -(^|\.)commandarms\.com$ -(^|\.)commentshk\.com$ -(^|\.)communistcrimes\.org$ -(^|\.)community\.windy\.com$ -(^|\.)communitychoicecu\.com$ -(^|\.)compileheart\.com$ -(^|\.)compress\.to$ -(^|\.)connect\.facebook\.net$ -(^|\.)conoha\.jp$ -(^|\.)contactmagazine\.net$ -(^|\.)contests\.twilio\.com$ -(^|\.)convio\.net$ -(^|\.)coobay\.com$ -(^|\.)coolaler\.com$ -(^|\.)coolder\.com$ -(^|\.)coolloud\.org\.tw$ -(^|\.)coolncute\.com$ -(^|\.)corumcollege\.com$ -(^|\.)cos-moe\.com$ -(^|\.)cosmic\.monar\.ch$ -(^|\.)cosplayjav\.pl$ -(^|\.)cotweet\.com$ -(^|\.)coursehero\.com$ -(^|\.)cpj\.org$ -(^|\.)cq99\.us$ -(^|\.)crackle\.com$ -(^|\.)crazys\.cc$ -(^|\.)crchina\.org$ -(^|\.)crd-net\.org$ -(^|\.)creaders\.net$ -(^|\.)creadersnet\.com$ -(^|\.)creativelab5\.com$ -(^|\.)cristyli\.com$ -(^|\.)crocotube\.com$ -(^|\.)crossfire\.co\.kr$ -(^|\.)crossthewall\.net$ -(^|\.)crossvpn\.net$ -(^|\.)crrev\.com$ -(^|\.)crucial\.com$ -(^|\.)csdparty\.com$ -(^|\.)css\.pixnet\.in$ -(^|\.)csuchen\.de$ -(^|\.)csw\.org\.uk$ -(^|\.)ct\.org\.tw$ -(^|\.)ctao\.org$ -(^|\.)ctfriend\.net$ -(^|\.)cthlo\.github\.io$ -(^|\.)ctitv\.com\.tw$ -(^|\.)cts\.com\.tw$ -(^|\.)cuhkacs\.org$ -(^|\.)cuihua\.org$ -(^|\.)cuiweiping\.net$ -(^|\.)culture\.tw$ -(^|\.)cumlouder\.com$ -(^|\.)curvefish\.com$ -(^|\.)cusu\.hk$ -(^|\.)cw\.com\.tw$ -(^|\.)cyberghost\.natado\.com$ -(^|\.)cyberghostvpn\.com$ -(^|\.)cynscribe\.com$ -(^|\.)cytode\.us$ -(^|\.)d-fukyu\.com$ -(^|\.)d100\.net$ -(^|\.)d1b183sg0nvnuh\.cloudfront\.net$ -(^|\.)d1c37gjwa26taa\.cloudfront\.net$ -(^|\.)d2bay\.com$ -(^|\.)d2pass\.com$ -(^|\.)d3c33hcgiwev3\.cloudfront\.net$ -(^|\.)d3rhr7kgmtrq1v\.cloudfront\.net$ -(^|\.)dabr\.co\.uk$ -(^|\.)dabr\.eu$ -(^|\.)dabr\.me$ -(^|\.)dabr\.mobi$ -(^|\.)dadazim\.com$ -(^|\.)dadi360\.com$ -(^|\.)dafagood\.com$ -(^|\.)dafahao\.com$ -(^|\.)dafoh\.org$ -(^|\.)dagelijksestandaard\.nl$ -(^|\.)daidostup\.ru$ -(^|\.)dailidaili\.com$ -(^|\.)dailymotion\.com$ -(^|\.)dailynews\.sina\.com$ -(^|\.)dailynews\.sina\.com%2f$ -(^|\.)daiphapinfo\.net$ -(^|\.)dajiyuan\.com$ -(^|\.)dajiyuan\.de$ -(^|\.)dajiyuan\.eu$ -(^|\.)dajusha\.baywords\.com$ -(^|\.)dalailama-archives\.org$ -(^|\.)dalailama\.com$ -(^|\.)dalailama\.mn$ -(^|\.)dalailama\.ru$ -(^|\.)dalailama\.usc\.edu$ -(^|\.)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$ -(^|\.)danbooru\.donmai\.us$ -(^|\.)danke4china\.net$ -(^|\.)danwei\.org$ -(^|\.)daodu14\.jigsy\.com$ -(^|\.)daolan\.net$ -(^|\.)daozhongxing\.org$ -(^|\.)darktech\.org$ -(^|\.)darktoy\.net$ -(^|\.)darpa\.mil$ -(^|\.)dastrassi\.org$ -(^|\.)data-vocabulary\.org$ -(^|\.)data\.flurry\.com$ -(^|\.)data\.gov\.tw$ -(^|\.)david-kilgour\.com$ -(^|\.)dawangidc\.com$ -(^|\.)daxa\.cn$ -(^|\.)daylife\.com$ -(^|\.)db\.tt$ -(^|\.)dbc\.hk$ -(^|\.)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$ -(^|\.)deaftone\.com$ -(^|\.)debug\.com$ -(^|\.)deck\.ly$ -(^|\.)decodet\.co$ -(^|\.)deepmind\.com$ -(^|\.)deezer\.com$ -(^|\.)definebabe\.com$ -(^|\.)deja\.com$ -(^|\.)delcamp\.net$ -(^|\.)delicious\.com$ -(^|\.)demo\.opera-mini\.net$ -(^|\.)democrats\.org$ -(^|\.)depositphotos\.com$ -(^|\.)derekhsu\.homeip\.net$ -(^|\.)desc\.se$ -(^|\.)design\.google$ -(^|\.)desipro\.de$ -(^|\.)dessci\.com$ -(^|\.)destiny\.xfiles\.to$ -(^|\.)destroy-china\.jp$ -(^|\.)deutsche-welle\.de$ -(^|\.)developers\.box\.net$ -(^|\.)devio\.us$ -(^|\.)devpn\.com$ -(^|\.)dfas\.mil$ -(^|\.)dfn\.org$ -(^|\.)dharamsalanet\.com$ -(^|\.)dharmakara\.net$ -(^|\.)dhcp\.biz$ -(^|\.)diaoyuislands\.org$ -(^|\.)dictionary\.goo\.ne\.jp$ -(^|\.)digiland\.tw$ -(^|\.)digisfera\.com$ -(^|\.)digitalnomadsproject\.org$ -(^|\.)diigo\.com$ -(^|\.)dilber\.se$ -(^|\.)dingchin\.com\.tw$ -(^|\.)dipity\.com$ -(^|\.)directcreative\.com$ -(^|\.)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$ -(^|\.)dl\.box\.net$ -(^|\.)dlsite\.com$ -(^|\.)dlyoutube\.com$ -(^|\.)dm530\.net$ -(^|\.)dmcdn\.net$ -(^|\.)dmm\.co\.jp$ -(^|\.)dns-dns\.com$ -(^|\.)dns-stuff\.com$ -(^|\.)dns04\.com$ -(^|\.)dns05\.com$ -(^|\.)dns1\.us$ -(^|\.)dns2\.us$ -(^|\.)dns2go\.com$ -(^|\.)dnscrypt\.org$ -(^|\.)dnset\.com$ -(^|\.)dnsrd\.com$ -(^|\.)dnssec\.net$ -(^|\.)dnvod\.tv$ -(^|\.)doctorvoice\.org$ -(^|\.)dogfartnetwork\.com$ -(^|\.)dojin\.com$ -(^|\.)dok-forum\.net$ -(^|\.)dolc\.de$ -(^|\.)dolf\.org\.hk$ -(^|\.)dollf\.com$ -(^|\.)domain\.club\.tw$ -(^|\.)domainhelp\.search\.com$ -(^|\.)domains\.google$ -(^|\.)domaintoday\.com\.au$ -(^|\.)dongtaiwang\.com$ -(^|\.)dongtaiwang\.net$ -(^|\.)dongyangjing\.com$ -(^|\.)dontfilter\.us$ -(^|\.)dontmovetochina\.com$ -(^|\.)dorjeshugden\.com$ -(^|\.)dotplane\.com$ -(^|\.)dotsub\.com$ -(^|\.)dotvpn\.com$ -(^|\.)doub\.io$ -(^|\.)dougscripts\.com$ -(^|\.)douhokanko\.net$ -(^|\.)doujincafe\.com$ -(^|\.)dowei\.org$ -(^|\.)download\.aircrack-ng\.org$ -(^|\.)download\.cnet\.com$ -(^|\.)download\.ithome\.com\.tw$ -(^|\.)dphk\.org$ -(^|\.)dpp\.org\.tw$ -(^|\.)dpr\.info$ -(^|\.)dragonsprings\.org$ -(^|\.)dreamamateurs\.com$ -(^|\.)drepung\.org$ -(^|\.)drgan\.net$ -(^|\.)drmingxia\.org$ -(^|\.)dropbooks\.tv$ -(^|\.)dropbox\.com$ -(^|\.)dropboxusercontent\.com$ -(^|\.)drsunacademy\.com$ -(^|\.)drtuber\.com$ -(^|\.)dscn\.info$ -(^|\.)dsmtp\.com$ -(^|\.)dstk\.dk$ -(^|\.)dtdns\.net$ -(^|\.)dtiblog\.com$ -(^|\.)dtic\.mil$ -(^|\.)dtwang\.org$ -(^|\.)duanzhihu\.com$ -(^|\.)duck\.com$ -(^|\.)duckdns\.org$ -(^|\.)duckduckgo-owned-server\.yahoo\.net$ -(^|\.)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$ -(^|\.)dvorak\.org$ -(^|\.)dw-world\.com$ -(^|\.)dw-world\.de$ -(^|\.)dw\.com$ -(^|\.)dw\.de$ -(^|\.)dwnews\.com$ -(^|\.)dwnews\.net$ -(^|\.)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$ -(^|\.)dynupdate\.no-ip\.com$ -(^|\.)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$ -(^|\.)eastturkistancc\.org$ -(^|\.)eastturkistangovernmentinexile\.us$ -(^|\.)easyca\.ca$ -(^|\.)easypic\.com$ -(^|\.)ebony-beauty\.com$ -(^|\.)ebook\.hyread\.com\.tw$ -(^|\.)ebookbrowse\.com$ -(^|\.)ebookee\.com$ -(^|\.)ecfa\.org\.tw$ -(^|\.)echofon\.com$ -(^|\.)ecimg\.tw$ -(^|\.)ecministry\.net$ -(^|\.)economist\.com$ -(^|\.)ecsm\.vs\.com$ -(^|\.)edgecastcdn\.net$ -(^|\.)edicypages\.com$ -(^|\.)edmontonchina\.cn$ -(^|\.)edmontonservice\.com$ -(^|\.)edns\.biz$ -(^|\.)edoors\.com$ -(^|\.)edubridge\.com$ -(^|\.)edupro\.org$ -(^|\.)eeas\.europa\.eu$ -(^|\.)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$ -(^|\.)elpais\.com$ -(^|\.)eltondisney\.com$ -(^|\.)emaga\.com$ -(^|\.)emanna\.com$ -(^|\.)embr\.in$ -(^|\.)emilylau\.org\.hk$ -(^|\.)empfil\.com$ -(^|\.)emule-ed2k\.com$ -(^|\.)emulefans\.com$ -(^|\.)emuparadise\.me$ -(^|\.)en\.favotter\.net$ -(^|\.)en\.hao123\.com$ -(^|\.)enanyang\.my$ -(^|\.)enewstree\.com$ -(^|\.)enfal\.de$ -(^|\.)engagedaily\.org$ -(^|\.)englishforeveryone\.org$ -(^|\.)englishfromengland\.co\.uk$ -(^|\.)englishpen\.org$ -(^|\.)enlighten\.org\.tw$ -(^|\.)entermap\.com$ -(^|\.)entnt\.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$ -(^|\.)etaa\.org\.au$ -(^|\.)etadult\.com$ -(^|\.)etaiwannews\.com$ -(^|\.)etizer\.org$ -(^|\.)etokki\.com$ -(^|\.)etools\.ncol\.com$ -(^|\.)etowns\.net$ -(^|\.)etowns\.org$ -(^|\.)ettoday\.net$ -(^|\.)etvonline\.hk$ -(^|\.)eu\.org$ -(^|\.)eucasino\.com$ -(^|\.)eulam\.com$ -(^|\.)eurekavpt\.com$ -(^|\.)evchk\.wikia\.com$ -(^|\.)evschool\.net$ -(^|\.)exblog\.jp$ -(^|\.)exchristian\.hk$ -(^|\.)exmormon\.org$ -(^|\.)expatshield\.com$ -(^|\.)expecthim\.com$ -(^|\.)expekt\.com$ -(^|\.)experts-univers\.com$ -(^|\.)exploader\.net$ -(^|\.)expressvpn\.com$ -(^|\.)extmatrix\.com$ -(^|\.)extremetube\.com$ -(^|\.)eyevio\.jp$ -(^|\.)eyny\.com$ -(^|\.)ezpc\.tk$ -(^|\.)ezpeer\.com$ -(^|\.)ezua\.com$ -(^|\.)fa\.gov\.tw$ -(^|\.)facebook\.br$ -(^|\.)facebook\.com$ -(^|\.)facebook\.design$ -(^|\.)facebook\.hu$ -(^|\.)facebook\.in$ -(^|\.)facebook\.nl$ -(^|\.)facebook\.se$ -(^|\.)facebookquotes4u\.com$ -(^|\.)faceless\.me$ -(^|\.)facesofnyfw\.com$ -(^|\.)facesoftibetanselfimmolators\.info$ -(^|\.)fail\.hk$ -(^|\.)faith100\.org$ -(^|\.)faithfuleye\.com$ -(^|\.)faiththedog\.info$ -(^|\.)fakku\.net$ -(^|\.)falsefire\.com$ -(^|\.)falun-co\.org$ -(^|\.)falun-ny\.net$ -(^|\.)falun\.caltech\.edu$ -(^|\.)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$ -(^|\.)fangbinxing\.com$ -(^|\.)fangeming\.com$ -(^|\.)fangeqiang\.com$ -(^|\.)fanglizhi\.info$ -(^|\.)fangmincn\.org$ -(^|\.)fangong\.forums-free\.com$ -(^|\.)fangong\.org$ -(^|\.)fangongheike\.com$ -(^|\.)fanhaodang\.com$ -(^|\.)fanqiang\.tk$ -(^|\.)fanqianghou\.com$ -(^|\.)fanqiangyakexi\.net$ -(^|\.)fanqiangzhe\.com$ -(^|\.)fanswong\.com$ -(^|\.)fanyue\.info$ -(^|\.)fapdu\.com$ -(^|\.)faproxy\.com$ -(^|\.)faqserv\.com$ -(^|\.)fartit\.com$ -(^|\.)farwestchina\.com$ -(^|\.)fast\.wistia\.com$ -(^|\.)fastpic\.ru$ -(^|\.)fastssh\.com$ -(^|\.)faststone\.org$ -(^|\.)favstar\.fm$ -(^|\.)fawanghuihui\.org$ -(^|\.)faydao\.com$ -(^|\.)fb\.com$ -(^|\.)fb\.me$ -(^|\.)fbcdn\.net$ -(^|\.)fbsbx\.com$ -(^|\.)fc2\.com$ -(^|\.)fc2blog\.net$ -(^|\.)fc2china\.com$ -(^|\.)fc2cn\.com$ -(^|\.)fda\.gov\.tw$ -(^|\.)fdc64\.de$ -(^|\.)fdc64\.org$ -(^|\.)fdc89\.jp$ -(^|\.)feedburner\.com$ -(^|\.)feeds\.fileforum\.com$ -(^|\.)feelssh\.com$ -(^|\.)feer\.com$ -(^|\.)feifeiss\.com$ -(^|\.)feitian-california\.org$ -(^|\.)feitianacademy\.org$ -(^|\.)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$ -(^|\.)files2me\.com$ -(^|\.)fileserve\.com$ -(^|\.)filesor\.com$ -(^|\.)fillthesquare\.org$ -(^|\.)filmingfortibet\.org$ -(^|\.)filmy\.olabloga\.pl$ -(^|\.)filthdump\.com$ -(^|\.)financetwitter\.com$ -(^|\.)finchvpn\.com$ -(^|\.)findmespot\.com$ -(^|\.)findyoutube\.com$ -(^|\.)fingerdaily\.com$ -(^|\.)finler\.net$ -(^|\.)firearmsworld\.net$ -(^|\.)firebaseio\.com$ -(^|\.)fireofliberty\.org$ -(^|\.)firetweet\.io$ -(^|\.)firstfivefollowers\.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$ -(^|\.)fochk\.org$ -(^|\.)focustaiwan\.tw$ -(^|\.)focusvpn\.com$ -(^|\.)fofg-europe\.net$ -(^|\.)fofg\.org$ -(^|\.)fofldfradio\.org$ -(^|\.)fooooo\.com$ -(^|\.)footwiball\.com$ -(^|\.)forum\.baby-kingdom\.com$ -(^|\.)forum\.cyberctm\.com$ -(^|\.)forum\.idsam\.com$ -(^|\.)forum\.my903\.com$ -(^|\.)forum\.mymaji\.com$ -(^|\.)forum\.omy\.sg$ -(^|\.)forum\.palmislife\.com$ -(^|\.)forum\.setty\.com\.tw$ -(^|\.)forum\.sina\.com\.hk$ -(^|\.)forum\.slime\.com\.tw$ -(^|\.)forum\.tvb\.com$ -(^|\.)forum\.xinbao\.de$ -(^|\.)forum4hk\.com$ -(^|\.)fotile\.me$ -(^|\.)fourface\.nodesnoop\.com$ -(^|\.)fourthinternational\.org$ -(^|\.)foxdie\.us$ -(^|\.)foxgay\.com$ -(^|\.)foxsub\.com$ -(^|\.)foxtang\.com$ -(^|\.)fpmt-osel\.org$ -(^|\.)fpmt\.org$ -(^|\.)fpmt\.tw$ -(^|\.)fpmtmexico\.org$ -(^|\.)fq\.wikia\.com$ -(^|\.)fqok\.org$ -(^|\.)fqrouter\.com$ -(^|\.)franklc\.com$ -(^|\.)freakshare\.com$ -(^|\.)free-gate\.org$ -(^|\.)free-hada-now\.org$ -(^|\.)free-proxy\.cz$ -(^|\.)free-ssh\.com$ -(^|\.)free\.fr$ -(^|\.)free4u\.com\.ar$ -(^|\.)freealim\.com$ -(^|\.)freebrowser\.org$ -(^|\.)freechal\.com$ -(^|\.)freechina\.net$ -(^|\.)freechina\.news$ -(^|\.)freechinaforum\.org$ -(^|\.)freeddns\.com$ -(^|\.)freeddns\.org$ -(^|\.)freedomchina\.info$ -(^|\.)freedomcollection\.org$ -(^|\.)freedomhouse\.org$ -(^|\.)freedominfonetweb\.wordpress\.com$ -(^|\.)freedomsherald\.org$ -(^|\.)freeforums\.org$ -(^|\.)freefq\.com$ -(^|\.)freefuckvids\.com$ -(^|\.)freegao\.com$ -(^|\.)freeilhamtohti\.org$ -(^|\.)freekwonpyong\.org$ -(^|\.)freelotto\.com$ -(^|\.)freeman2\.com$ -(^|\.)freemoren\.com$ -(^|\.)freemorenews\.com$ -(^|\.)freemuse\.org$ -(^|\.)freenet$ -(^|\.)freenet-china\.org$ -(^|\.)freenetproject\.org$ -(^|\.)freenewscn\.com$ -(^|\.)freeopenvpn\.com$ -(^|\.)freeoz\.org$ -(^|\.)freessh\.us$ -(^|\.)freetcp\.com$ -(^|\.)freetibet\.net$ -(^|\.)freetibet\.org$ -(^|\.)freetibetanheroes\.org$ -(^|\.)freeviewmovies\.com$ -(^|\.)freevpn\.me$ -(^|\.)freevpn\.nl$ -(^|\.)freewallpaper4\.me$ -(^|\.)freewebs\.com$ -(^|\.)freewechat\.com$ -(^|\.)freeweibo\.com$ -(^|\.)freewww\.biz$ -(^|\.)freewww\.info$ -(^|\.)freexinwen\.com$ -(^|\.)freeyellow\.com$ -(^|\.)freeyoutubeproxy\.net$ -(^|\.)friendfeed-media\.com$ -(^|\.)friendfeed\.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$ -(^|\.)fucd\.com$ -(^|\.)fuckcnnic\.net$ -(^|\.)fuckgfw\.org$ -(^|\.)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$ -(^|\.)g6hentai\.com$ -(^|\.)gabocorp\.com$ -(^|\.)gaeproxy\.com$ -(^|\.)gaforum\.org$ -(^|\.)galaxymacau\.com$ -(^|\.)galenwu\.com$ -(^|\.)galstars\.net$ -(^|\.)game735\.com$ -(^|\.)gamebase\.com\.tw$ -(^|\.)gamejolt\.com$ -(^|\.)gamer\.com\.tw$ -(^|\.)gamez\.com\.tw$ -(^|\.)gamousa\.com$ -(^|\.)ganges\.com$ -(^|\.)gaoming\.net$ -(^|\.)gaopi\.net$ -(^|\.)gaozhisheng\.net$ -(^|\.)gaozhisheng\.org$ -(^|\.)gardennetworks\.com$ -(^|\.)gardennetworks\.org$ -(^|\.)gartlive\.com$ -(^|\.)gate-project\.com$ -(^|\.)gather\.com$ -(^|\.)gatherproxy\.com$ -(^|\.)gati\.org\.tw$ -(^|\.)gaybubble\.com$ -(^|\.)gaycn\.net$ -(^|\.)gayhub\.com$ -(^|\.)gaymap\.cc$ -(^|\.)gaytube\.com$ -(^|\.)gaywatch\.com$ -(^|\.)gazotube\.com$ -(^|\.)gcc\.org\.hk$ -(^|\.)gclooney\.com$ -(^|\.)gcpnews\.com$ -(^|\.)gcr\.io$ -(^|\.)gdbt\.net$ -(^|\.)gdzf\.org$ -(^|\.)geek-art\.net$ -(^|\.)geekerhome\.com$ -(^|\.)geekheart\.info$ -(^|\.)gekikame\.com$ -(^|\.)gelbooru\.com$ -(^|\.)geocities\.co\.jp$ -(^|\.)geocities\.com$ -(^|\.)geocities\.jp$ -(^|\.)gerefoundation\.org$ -(^|\.)get\.how$ -(^|\.)getastrill\.com$ -(^|\.)getchu\.com$ -(^|\.)getcloak\.com$ -(^|\.)getfoxyproxy\.org$ -(^|\.)getfreedur\.com$ -(^|\.)getgom\.com$ -(^|\.)geti2p\.net$ -(^|\.)getiton\.com$ -(^|\.)getjetso\.com$ -(^|\.)getlantern\.org$ -(^|\.)getmdl\.io$ -(^|\.)getsocialscope\.com$ -(^|\.)getsync\.com$ -(^|\.)gettrials\.com$ -(^|\.)gettyimages\.com$ -(^|\.)getuploader\.com$ -(^|\.)gfbv\.de$ -(^|\.)gfgold\.com\.hk$ -(^|\.)gfsale\.com$ -(^|\.)gfw\.org\.ua$ -(^|\.)gfw\.press$ -(^|\.)ggpht\.com$ -(^|\.)ggssl\.com$ -(^|\.)ghost\.org$ -(^|\.)ghostpath\.com$ -(^|\.)ghut\.org$ -(^|\.)giantessnight\.com$ -(^|\.)gifree\.com$ -(^|\.)giga-web\.jp$ -(^|\.)gigporno\.ru$ -(^|\.)girlbanker\.com$ -(^|\.)git\.io$ -(^|\.)gizlen\.net$ -(^|\.)gjczz\.com$ -(^|\.)glass8\.eu$ -(^|\.)global\.bing\.com$ -(^|\.)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$ -(^|\.)gmbd\.cn$ -(^|\.)gmhz\.org$ -(^|\.)gmll\.org$ -(^|\.)gmodules\.com$ -(^|\.)gmozomg\.izihost\.org$ -(^|\.)gnci\.org\.hk$ -(^|\.)go-pki\.com$ -(^|\.)go\.nesnode\.com$ -(^|\.)go141\.com$ -(^|\.)goagent\.biz$ -(^|\.)goagent\.codeplex\.com$ -(^|\.)goagentplus\.com$ -(^|\.)gobet\.cc$ -(^|\.)godfootsteps\.org$ -(^|\.)godns\.work$ -(^|\.)godoc\.org$ -(^|\.)godsdirectcontact\.co\.uk$ -(^|\.)godsdirectcontact\.org$ -(^|\.)godsdirectcontact\.org\.tw$ -(^|\.)godsimmediatecontact\.com$ -(^|\.)gogotunnel\.com$ -(^|\.)gohappy\.com\.tw$ -(^|\.)gojet\.krtco\.com\.tw$ -(^|\.)gokbayrak\.com$ -(^|\.)golang\.org$ -(^|\.)goldbet\.com$ -(^|\.)goldbetsports\.com$ -(^|\.)goldeneyevault\.com$ -(^|\.)goldenfrog\.com$ -(^|\.)goldjizz\.com$ -(^|\.)goldstep\.net$ -(^|\.)goldwave\.com$ -(^|\.)gongm\.in$ -(^|\.)gongmeng\.info$ -(^|\.)gongminliliang\.com$ -(^|\.)gongwt\.com$ -(^|\.)goo\.gl$ -(^|\.)gooday\.xyz$ -(^|\.)gooddns\.info$ -(^|\.)goodreaders\.com$ -(^|\.)goodreads\.com$ -(^|\.)goodtv\.com\.tw$ -(^|\.)goodtv\.tv$ -(^|\.)goofind\.com$ -(^|\.)google(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapis(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}$ -(^|\.)googleapps\.com$ -(^|\.)googlearth\.com$ -(^|\.)googleartproject\.com$ -(^|\.)googleblog\.com$ -(^|\.)googlebot\.com$ -(^|\.)googlechinawebmaster\.com$ -(^|\.)googlecode\.com$ -(^|\.)googlecommerce\.com$ -(^|\.)googledomains\.com$ -(^|\.)googledrive\.com$ -(^|\.)googleearth\.com$ -(^|\.)googlegroups\.com$ -(^|\.)googlehosted\.com$ -(^|\.)googleideas\.com$ -(^|\.)googleinsidesearch\.com$ -(^|\.)googlelabs\.com$ -(^|\.)googlemail\.com$ -(^|\.)googlemashups\.com$ -(^|\.)googlepagecreator\.com$ -(^|\.)googleplay\.com$ -(^|\.)googleplus\.com$ -(^|\.)googlescholar\.com$ -(^|\.)googlesile\.com$ -(^|\.)googlesource\.com$ -(^|\.)googleusercontent\.com$ -(^|\.)googlevideo\.com$ -(^|\.)googleweblight\.com$ -(^|\.)googlezip\.net$ -(^|\.)gopetition\.com$ -(^|\.)goproxing\.net$ -(^|\.)gospelherald\.com$ -(^|\.)got-game\.org$ -(^|\.)gotdns\.ch$ -(^|\.)gotgeeks\.com$ -(^|\.)gotrusted\.com$ -(^|\.)gotw\.ca$ -(^|\.)gov\.taipei$ -(^|\.)gov\.tw$ -(^|\.)gr8domain\.biz$ -(^|\.)gr8name\.biz$ -(^|\.)grammaly\.com$ -(^|\.)grandtrial\.org$ -(^|\.)grangorz\.org$ -(^|\.)graphis\.ne\.jp$ -(^|\.)graphql\.org$ -(^|\.)greasespot\.net$ -(^|\.)great-firewall\.com$ -(^|\.)great-roc\.org$ -(^|\.)greatfire\.org$ -(^|\.)greatfire\.us7\.list-manage\.com$ -(^|\.)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$ -(^|\.)groups\.google\.cn$ -(^|\.)gs-discuss\.com$ -(^|\.)gstatic\.com$ -(^|\.)gtricks\.com$ -(^|\.)gts-vpn\.com$ -(^|\.)gu-chu-sum\.org$ -(^|\.)guaguass\.com$ -(^|\.)guaguass\.org$ -(^|\.)guancha\.org$ -(^|\.)guangming\.com\.my$ -(^|\.)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$ -(^|\.)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$ -(^|\.)hackthatphone\.net$ -(^|\.)hahlo\.com$ -(^|\.)hakkatv\.org\.tw$ -(^|\.)handcraftedsoftware\.org$ -(^|\.)hanunyi\.com$ -(^|\.)hao\.news$ -(^|\.)haoel\.github\.io$ -(^|\.)happy-vpn\.com$ -(^|\.)haproxy\.org$ -(^|\.)hardsextube\.com$ -(^|\.)harunyahya\.com$ -(^|\.)hautelook\.com$ -(^|\.)hautelookcdn\.com$ -(^|\.)have8\.com$ -(^|\.)hclips\.com$ -(^|\.)hd\.stheadline\.com$ -(^|\.)hdlt\.me$ -(^|\.)hdtvb\.net$ -(^|\.)hdzog\.com$ -(^|\.)heartyit\.com$ -(^|\.)hec\.su$ -(^|\.)hecaitou\.net$ -(^|\.)hechaji\.com$ -(^|\.)heeact\.edu\.tw$ -(^|\.)hegre-art\.com$ -(^|\.)heix\.pp\.ru$ -(^|\.)helloandroid\.com$ -(^|\.)helloqueer\.com$ -(^|\.)helloss\.pw$ -(^|\.)hellotxt\.com$ -(^|\.)hellouk\.org$ -(^|\.)help\.linksalpha\.com$ -(^|\.)helpeachpeople\.com$ -(^|\.)helplinfen\.com$ -(^|\.)helpster\.de$ -(^|\.)helpzhuling\.org$ -(^|\.)hentai\.to$ -(^|\.)hentaitube\.tv$ -(^|\.)hentaivideoworld\.com$ -(^|\.)heqinglian\.net$ -(^|\.)heungkongdiscuss\.com$ -(^|\.)hexieshe\.com$ -(^|\.)hexieshe\.xyz$ -(^|\.)hexxeh\.net$ -(^|\.)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$ -(^|\.)hihiforum\.com$ -(^|\.)hihistory\.net$ -(^|\.)hiitch\.com$ -(^|\.)hikinggfw\.org$ -(^|\.)hilive\.tv$ -(^|\.)himalayan-foundation\.org$ -(^|\.)himalayanglacier\.com$ -(^|\.)himemix\.com$ -(^|\.)himemix\.net$ -(^|\.)hitomi\.la$ -(^|\.)hiwifi\.com$ -(^|\.)hizb-ut-tahrir\.info$ -(^|\.)hizb-ut-tahrir\.org$ -(^|\.)hizbuttahrir\.org$ -(^|\.)hjclub\.info$ -(^|\.)hk-pub\.com$ -(^|\.)hk\.frienddy\.com$ -(^|\.)hk\.geocities\.com$ -(^|\.)hk\.gradconnection\.com$ -(^|\.)hk\.hao123img\.com$ -(^|\.)hk\.jiepang\.com$ -(^|\.)hk\.knowledge\.yahoo\.com$ -(^|\.)hk\.myblog\.yahoo\.com$ -(^|\.)hk\.news\.yahoo\.com$ -(^|\.)hk\.rd\.yahoo\.com$ -(^|\.)hk\.search\.yahoo\.com$ -(^|\.)hk\.video\.news\.yahoo\.com$ -(^|\.)hk\.yahoo\.com$ -(^|\.)hk01\.com$ -(^|\.)hk32168\.com$ -(^|\.)hka8964\.wordpress\.com$ -(^|\.)hkacg\.com$ -(^|\.)hkacg\.net$ -(^|\.)hkanews\.wordpress\.com$ -(^|\.)hkatvnews\.com$ -(^|\.)hkbc\.net$ -(^|\.)hkbf\.org$ -(^|\.)hkbookcity\.com$ -(^|\.)hkchurch\.org$ -(^|\.)hkci\.org\.hk$ -(^|\.)hkcmi\.edu$ -(^|\.)hkcnews\.com$ -(^|\.)hkcoc\.com$ -(^|\.)hkcoc\.weather\.com\.hk$ -(^|\.)hkdailynews\.com\.hk$ -(^|\.)hkday\.net$ -(^|\.)hkdf\.org$ -(^|\.)hkej\.com$ -(^|\.)hkepc\.com$ -(^|\.)hkfaa\.com$ -(^|\.)hkfreezone\.com$ -(^|\.)hkfront\.org$ -(^|\.)hkgolden\.com$ -(^|\.)hkgreenradio\.org$ -(^|\.)hkheadline\.com$ -(^|\.)hkhkhk\.com$ -(^|\.)hkhrc\.org\.hk$ -(^|\.)hkhrm\.org\.hk$ -(^|\.)hkip\.org\.uk$ -(^|\.)hkjc\.com$ -(^|\.)hkjp\.org$ -(^|\.)hklft\.com$ -(^|\.)hklts\.org\.hk$ -(^|\.)hkptu\.org$ -(^|\.)hkreporter\.com$ -(^|\.)hkreporter\.loved\.hk$ -(^|\.)hkupop\.hku\.hk$ -(^|\.)hkusu\.net$ -(^|\.)hkvwet\.com$ -(^|\.)hkwcc\.org\.hk$ -(^|\.)hkzone\.org$ -(^|\.)hmonghot\.com$ -(^|\.)hmvdigital\.ca$ -(^|\.)hmvdigital\.com$ -(^|\.)hnjhj\.com$ -(^|\.)hnntube\.com$ -(^|\.)hola\.com$ -(^|\.)hola\.org$ -(^|\.)holymountaincn\.com$ -(^|\.)holyspiritspeaks\.org$ -(^|\.)home\.sina\.com$ -(^|\.)home\.so-net\.net\.tw$ -(^|\.)homedepot\.com$ -(^|\.)homeperversion\.com$ -(^|\.)homeservershow\.com$ -(^|\.)hongkongfp\.com$ -(^|\.)hongmeimei\.com$ -(^|\.)hongzhi\.li$ -(^|\.)hootsuite\.com$ -(^|\.)hoovers\.com$ -(^|\.)hopedialogue\.org$ -(^|\.)hopto\.org$ -(^|\.)hornygamer\.com$ -(^|\.)hornytrip\.com$ -(^|\.)hotav\.tv$ -(^|\.)hotels\.cn$ -(^|\.)hotfrog\.com\.tw$ -(^|\.)hotgoo\.com$ -(^|\.)hotpornshow\.com$ -(^|\.)hotpot\.hk$ -(^|\.)hotshame\.com$ -(^|\.)hotspotshield\.com$ -(^|\.)hotvpn\.com$ -(^|\.)hougaige\.com$ -(^|\.)howtoforge\.com$ -(^|\.)hpa\.gov\.tw$ -(^|\.)hqcdp\.org$ -(^|\.)hqjapanesesex\.com$ -(^|\.)hqmovies\.com$ -(^|\.)hqsbnet\.wordpress\.com$ -(^|\.)hqsbonline\.wordpress\.com$ -(^|\.)hrcchina\.org$ -(^|\.)hrcir\.com$ -(^|\.)hrea\.org$ -(^|\.)hrichina\.org$ -(^|\.)hrw\.org$ -(^|\.)hrweb\.org$ -(^|\.)hsjp\.net$ -(^|\.)hsselite\.com$ -(^|\.)hst\.net\.tw$ -(^|\.)hstern\.net$ -(^|\.)hstt\.net$ -(^|\.)ht\.ly$ -(^|\.)htkou\.net$ -(^|\.)htl\.li$ -(^|\.)html5rocks\.com$ -(^|\.)https$ -(^|\.)https443\.net$ -(^|\.)https443\.org$ -(^|\.)hua-yue\.net$ -(^|\.)huaglad\.com$ -(^|\.)huanghuagang\.org$ -(^|\.)huangyiyu\.com$ -(^|\.)huaren\.us$ -(^|\.)huaren4us\.com$ -(^|\.)huashangnews\.com$ -(^|\.)huaxia-news\.com$ -(^|\.)huaxiabao\.org$ -(^|\.)huaxin\.ph$ -(^|\.)huayuworld\.org$ -(^|\.)hudatoriq\.web\.id$ -(^|\.)huffingtonpost\.com$ -(^|\.)hugoroy\.eu$ -(^|\.)huhaitai\.com$ -(^|\.)huhamhire\.com$ -(^|\.)huiyi\.in$ -(^|\.)hulkshare\.com$ -(^|\.)hulu\.com$ -(^|\.)huluim\.com$ -(^|\.)hum$ -(^|\.)humanrightsbriefing\.org$ -(^|\.)hung-ya\.com$ -(^|\.)hungerstrikeforaids\.org$ -(^|\.)huobi\.com$ -(^|\.)huobi\.pro$ -(^|\.)huobipro\.com$ -(^|\.)huping\.net$ -(^|\.)hurgokbayrak\.com$ -(^|\.)hurriyet\.com\.tr$ -(^|\.)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$ -(^|\.)i-cable\.com$ -(^|\.)i-part\.com\.tw$ -(^|\.)i\.lithium\.com$ -(^|\.)i1\.hk$ -(^|\.)i2p2\.de$ -(^|\.)i2runner\.com$ -(^|\.)i818hk\.com$ -(^|\.)iam\.soy$ -(^|\.)iamtopone\.com$ -(^|\.)iask\.bz$ -(^|\.)iask\.ca$ -(^|\.)iav19\.com$ -(^|\.)ibiblio\.org$ -(^|\.)iblist\.com$ -(^|\.)iblogserv-f\.net$ -(^|\.)ibros\.org$ -(^|\.)ibvpn\.com$ -(^|\.)icams\.com$ -(^|\.)ice\.audionow\.com$ -(^|\.)icij\.org$ -(^|\.)icl-fi\.org$ -(^|\.)icoco\.com$ -(^|\.)iconpaper\.org$ -(^|\.)icu-project\.org$ -(^|\.)id\.hao123\.com$ -(^|\.)id\.heroku\.com$ -(^|\.)iddddg\.com$ -(^|\.)idemocracy\.asia$ -(^|\.)identi\.ca$ -(^|\.)idiomconnection\.com$ -(^|\.)idouga\.com$ -(^|\.)idreamx\.com$ -(^|\.)idv\.tw$ -(^|\.)ieasy5\.com$ -(^|\.)ied2k\.net$ -(^|\.)ienergy1\.com$ -(^|\.)if\.ttt$ -(^|\.)ifan\.cz\.cc$ -(^|\.)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$ -(^|\.)illusionfactory\.com$ -(^|\.)ilove80\.be$ -(^|\.)ilovelongtoes\.com$ -(^|\.)im\.tv$ -(^|\.)im88\.tw$ -(^|\.)imageab\.com$ -(^|\.)imagefap\.com$ -(^|\.)imageflea\.com$ -(^|\.)images-gaytube\.com$ -(^|\.)images\.comico\.tw$ -(^|\.)imageshack\.us$ -(^|\.)imagevenue\.com$ -(^|\.)imagezilla\.net$ -(^|\.)imb\.org$ -(^|\.)imdb\.com$ -(^|\.)img$ -(^|\.)img\.dlsite\.jp$ -(^|\.)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$ -(^|\.)in99\.org$ -(^|\.)incapdns\.net$ -(^|\.)incloak\.com$ -(^|\.)incredibox\.fr$ -(^|\.)indiandefensenews\.in$ -(^|\.)indiemerch\.com$ -(^|\.)info-graf\.fr$ -(^|\.)initiativesforchina\.org$ -(^|\.)inkui\.com$ -(^|\.)inmediahk\.net$ -(^|\.)innermongolia\.org$ -(^|\.)inote\.tw$ -(^|\.)insecam\.org$ -(^|\.)insidevoa\.com$ -(^|\.)instagram\.com$ -(^|\.)instanthq\.com$ -(^|\.)institut-tibetain\.org$ -(^|\.)internet\.org$ -(^|\.)internetdefenseleague\.org$ -(^|\.)internetfreedom\.org$ -(^|\.)internetpopculture\.com$ -(^|\.)investigating\.wordpress\.com$ -(^|\.)inxian\.com$ -(^|\.)iownyour\.biz$ -(^|\.)iownyour\.org$ -(^|\.)ipalter\.com$ -(^|\.)ipfire\.org$ -(^|\.)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$ -(^|\.)iredmail\.org$ -(^|\.)ironbigfools\.compython\.net$ -(^|\.)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$ -(^|\.)istiqlalhewer\.com$ -(^|\.)istockphoto\.com$ -(^|\.)isunaffairs\.com$ -(^|\.)isuntv\.com$ -(^|\.)itaboo\.info$ -(^|\.)itaiwan\.gov\.tw$ -(^|\.)italiatibet\.org$ -(^|\.)itasoftware\.com$ -(^|\.)itemdb\.com$ -(^|\.)ithelp\.ithome\.com\.tw$ -(^|\.)its\.caltech\.edu$ -(^|\.)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$ -(^|\.)izaobao\.us$ -(^|\.)izles\.net$ -(^|\.)izlesem\.org$ -(^|\.)j\.mp$ -(^|\.)ja\.wikipedia\.org$ -(^|\.)jamaat\.org$ -(^|\.)jamyangnorbu\.com$ -(^|\.)jandyx\.com$ -(^|\.)janwongphoto\.com$ -(^|\.)japan-whores\.com$ -(^|\.)japanfirst\.asianfreeforum\.com$ -(^|\.)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$ -(^|\.)jfqu36\.club$ -(^|\.)jfqu37\.xyz$ -(^|\.)jgoodies\.com$ -(^|\.)jiangweiping\.com$ -(^|\.)jiaoyou8\.com$ -(^|\.)jiehua\.cz$ -(^|\.)jieshibaobao\.com$ -(^|\.)jigglegifs\.com$ -(^|\.)jigong1024\.com$ -(^|\.)jihadintel\.meforum\.org$ -(^|\.)jihadology\.net$ -(^|\.)jiji\.com$ -(^|\.)jims\.net$ -(^|\.)jinbushe\.org$ -(^|\.)jingpin\.org$ -(^|\.)jingsim\.org$ -(^|\.)jinpianwang\.com$ -(^|\.)jinroukong\.com$ -(^|\.)jitouch\.com$ -(^|\.)jizzthis\.com$ -(^|\.)jjgirls\.com$ -(^|\.)jkb\.cc$ -(^|\.)jkforum\.net$ -(^|\.)jkub\.com$ -(^|\.)jma\.go\.jp$ -(^|\.)jmscult\.com$ -(^|\.)joachims\.org$ -(^|\.)jobnewera\.wordpress\.com$ -(^|\.)jobso\.tv$ -(^|\.)journalchretien\.net$ -(^|\.)journalofdemocracy\.org$ -(^|\.)joymiihub\.com$ -(^|\.)joyourself\.com$ -(^|\.)jp\.hao123\.com$ -(^|\.)jpl\.nasa\.gov$ -(^|\.)jpopforum\.net$ -(^|\.)jubushoushen\.com$ -(^|\.)juhuaren\.com$ -(^|\.)jukujo-club\.com$ -(^|\.)juliepost\.com$ -(^|\.)juliereyc\.com$ -(^|\.)junauza\.com$ -(^|\.)june4commemoration\.org$ -(^|\.)junefourth-20\.net$ -(^|\.)jungleheart\.com$ -(^|\.)juoaa\.com$ -(^|\.)justdied\.com$ -(^|\.)justfreevpn\.com$ -(^|\.)justicefortenzin\.org$ -(^|\.)justpaste\.it$ -(^|\.)justtristan\.com$ -(^|\.)juyuange\.org$ -(^|\.)juziyue\.com$ -(^|\.)jwmusic\.org$ -(^|\.)jyxf\.net$ -(^|\.)k-doujin\.net$ -(^|\.)ka-wai\.com$ -(^|\.)kagyu\.org$ -(^|\.)kagyu\.org\.za$ -(^|\.)kagyumonlam\.org$ -(^|\.)kagyunews\.com\.hk$ -(^|\.)kagyuoffice\.org$ -(^|\.)kagyuoffice\.org\.tw$ -(^|\.)kaiyuan\.de$ -(^|\.)kakao\.com$ -(^|\.)kalachakralugano\.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$ -(^|\.)kb\.monitorware\.com$ -(^|\.)kba-tx\.org$ -(^|\.)kcoolonline\.com$ -(^|\.)kebrum\.com$ -(^|\.)kechara\.com$ -(^|\.)keepandshare\.com$ -(^|\.)keezmovies\.com$ -(^|\.)kendatire\.com$ -(^|\.)kendincos\.net$ -(^|\.)kenengba\.com$ -(^|\.)keontech\.net$ -(^|\.)kepard\.com$ -(^|\.)keycdn\.com$ -(^|\.)khabdha\.org$ -(^|\.)khatrimaza\.org$ -(^|\.)khmusic\.com\.tw$ -(^|\.)kichiku-doujinko\.com$ -(^|\.)kik\.com$ -(^|\.)killwall\.com$ -(^|\.)kindleren\.com$ -(^|\.)kineox\.free\.fr$ -(^|\.)kingdomsalvation\.org$ -(^|\.)kinghost\.com$ -(^|\.)kingstone\.com\.tw$ -(^|\.)kink\.com$ -(^|\.)kinmen\.org\.tw$ -(^|\.)kinmen\.travel$ -(^|\.)kir\.jp$ -(^|\.)kissbbao\.cn$ -(^|\.)kiwi\.kz$ -(^|\.)kk-whys\.co\.jp$ -(^|\.)kkbox\.com$ -(^|\.)kknews\.cc$ -(^|\.)kmuh\.org\.tw$ -(^|\.)knowledgerush\.com$ -(^|\.)kobo\.com$ -(^|\.)kobobooks\.com$ -(^|\.)kodingen\.com$ -(^|\.)kompozer\.net$ -(^|\.)konachan\.com$ -(^|\.)kone\.com$ -(^|\.)koolsolutions\.com$ -(^|\.)koornk\.com$ -(^|\.)koranmandarin\.com$ -(^|\.)korenan2\.com$ -(^|\.)ksdl\.org$ -(^|\.)ksnews\.com\.tw$ -(^|\.)ktzhk\.com$ -(^|\.)kui\.name$ -(^|\.)kun\.im$ -(^|\.)kurashsultan\.com$ -(^|\.)kurtmunger\.com$ -(^|\.)kusocity\.com$ -(^|\.)kwcg\.ca$ -(^|\.)kwongwah\.com\.my$ -(^|\.)kxsw\.life$ -(^|\.)kyofun\.com$ -(^|\.)kyohk\.net$ -(^|\.)kyoyue\.com$ -(^|\.)kyzyhello\.com$ -(^|\.)kzeng\.info$ -(^|\.)la-forum\.org$ -(^|\.)labiennale\.org$ -(^|\.)ladbrokes\.com$ -(^|\.)lagranepoca\.com$ -(^|\.)lalulalu\.com$ -(^|\.)lama\.com\.tw$ -(^|\.)lamayeshe\.com$ -(^|\.)lamnia\.co\.uk$ -(^|\.)lamrim\.com$ -(^|\.)lanterncn\.cn$ -(^|\.)lantosfoundation\.org$ -(^|\.)laod\.cn$ -(^|\.)laogai\.org$ -(^|\.)laomiu\.com$ -(^|\.)laoyang\.info$ -(^|\.)laptoplockdown\.com$ -(^|\.)laqingdan\.net$ -(^|\.)larsgeorge\.com$ -(^|\.)lastcombat\.com$ -(^|\.)lastfm\.es$ -(^|\.)latelinenews\.com$ -(^|\.)latibet\.org$ -(^|\.)ld\.hao123img\.com$ -(^|\.)le-vpn\.com$ -(^|\.)leafyvpn\.net$ -(^|\.)lecloud\.net$ -(^|\.)leeao\.com\.cn$ -(^|\.)lefora\.com$ -(^|\.)left21\.hk$ -(^|\.)legalporno\.com$ -(^|\.)legaltech\.law\.com$ -(^|\.)legsjapan\.com$ -(^|\.)leirentv\.ca$ -(^|\.)leisurecafe\.ca$ -(^|\.)leisurepro\.com$ -(^|\.)lematin\.ch$ -(^|\.)lemonde\.fr$ -(^|\.)lenwhite\.com$ -(^|\.)lerosua\.org$ -(^|\.)lers\.google$ -(^|\.)lesoir\.be$ -(^|\.)letou\.com$ -(^|\.)letscorp\.net$ -(^|\.)lflink\.com$ -(^|\.)lflinkup\.com$ -(^|\.)lflinkup\.net$ -(^|\.)lflinkup\.org$ -(^|\.)lhakar\.org$ -(^|\.)lhasocialwork\.org$ -(^|\.)liangyou\.net$ -(^|\.)lianyue\.net$ -(^|\.)liaowangxizang\.net$ -(^|\.)liberal\.org\.hk$ -(^|\.)libertytimes\.com\.tw$ -(^|\.)library\.usc\.cuhk\.edu\.hk$ -(^|\.)lidecheng\.com$ -(^|\.)lifemiles\.com$ -(^|\.)lighten\.org\.tw$ -(^|\.)lightnovel\.cn$ -(^|\.)like\.com$ -(^|\.)limiao\.net$ -(^|\.)line-apps\.com$ -(^|\.)line-scdn\.net$ -(^|\.)line\.me$ -(^|\.)line\.naver\.jp$ -(^|\.)linglingfa\.com$ -(^|\.)lingvodics\.com$ -(^|\.)link-o-rama\.com$ -(^|\.)linkideo\.com$ -(^|\.)linkuswell\.com$ -(^|\.)linux\.org\.hk$ -(^|\.)linuxtoy\.org$ -(^|\.)lionsroar\.com$ -(^|\.)lipuman\.com$ -(^|\.)liquidvpn\.com$ -(^|\.)listentoyoutube\.com$ -(^|\.)listorious\.com$ -(^|\.)lists\.w3\.org$ -(^|\.)liudejun\.com$ -(^|\.)liuhanyu\.com$ -(^|\.)liujianshu\.com$ -(^|\.)liuxiaobo\.net$ -(^|\.)liuxiaotong\.com$ -(^|\.)livedoor\.jp$ -(^|\.)liveleak\.com$ -(^|\.)livestation\.com$ -(^|\.)livestream\.com$ -(^|\.)livevideo\.com$ -(^|\.)livingonline\.us$ -(^|\.)livingstream\.com$ -(^|\.)liwangyang\.com$ -(^|\.)lizhizhuangbi\.com$ -(^|\.)lkcn\.net$ -(^|\.)llss\.me$ -(^|\.)load\.to$ -(^|\.)lobsangwangyal\.com$ -(^|\.)localdomain\.ws$ -(^|\.)localpresshk\.com$ -(^|\.)lockestek\.com$ -(^|\.)logbot\.net$ -(^|\.)logiqx\.com$ -(^|\.)londonchinese\.ca$ -(^|\.)longhair\.hk$ -(^|\.)longmusic\.com$ -(^|\.)longtermly\.net$ -(^|\.)longtoes\.com$ -(^|\.)lookpic\.com$ -(^|\.)looktoronto\.com$ -(^|\.)lotsawahouse\.org$ -(^|\.)lotuslight\.org\.hk$ -(^|\.)lotuslight\.org\.tw$ -(^|\.)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$ -(^|\.)luke54\.com$ -(^|\.)luke54\.org$ -(^|\.)lupm\.org$ -(^|\.)lushstories\.com$ -(^|\.)luxebc\.com$ -(^|\.)lvhai\.org$ -(^|\.)lvv2\.com$ -(^|\.)lyfhk\.net$ -(^|\.)lzmtnews\.org$ -(^|\.)m\.hkgalden\.com$ -(^|\.)m\.me$ -(^|\.)m\.plixi\.com$ -(^|\.)m\.slandr\.net$ -(^|\.)ma\.hao123\.com$ -(^|\.)macgamestore\.com$ -(^|\.)macrovpn\.com$ -(^|\.)macts\.com\.tw$ -(^|\.)mad-ar\.ch$ -(^|\.)madewithcode\.com$ -(^|\.)madonna-av\.com$ -(^|\.)madthumbs\.com$ -(^|\.)magazines\.sina\.com\.tw$ -(^|\.)magic-net\.info$ -(^|\.)mahabodhi\.org$ -(^|\.)maiio\.net$ -(^|\.)mail-archive\.com$ -(^|\.)maildns\.xyz$ -(^|\.)maiplus\.com$ -(^|\.)maizhong\.org$ -(^|\.)makemymood\.com$ -(^|\.)makkahnewspaper\.com$ -(^|\.)makzhou\.warehouse333\.com$ -(^|\.)malaysiakini\.com$ -(^|\.)mamingzhe\.com$ -(^|\.)manchukuo\.net$ -(^|\.)mangafox\.com$ -(^|\.)mangafox\.me$ -(^|\.)maniash\.com$ -(^|\.)manicur4ik\.ru$ -(^|\.)mansion\.com$ -(^|\.)mansionpoker\.com$ -(^|\.)manta\.com$ -(^|\.)maplew\.com$ -(^|\.)marc\.info$ -(^|\.)marguerite\.su$ -(^|\.)martau\.com$ -(^|\.)martincartoons\.com$ -(^|\.)martsangkagyuofficial\.org$ -(^|\.)maruta\.be$ -(^|\.)marxist\.com$ -(^|\.)marxist\.net$ -(^|\.)marxists\.org$ -(^|\.)mash\.to$ -(^|\.)maskedip\.com$ -(^|\.)matainja\.com$ -(^|\.)material\.io$ -(^|\.)mathable\.io$ -(^|\.)mathiew-badimon\.com$ -(^|\.)matome-plus\.com$ -(^|\.)matome-plus\.net$ -(^|\.)matsushimakaede\.com$ -(^|\.)mattwilcox\.net$ -(^|\.)maturejp\.com$ -(^|\.)maxing\.jp$ -(^|\.)mayimayi\.com$ -(^|\.)mcadforums\.com$ -(^|\.)mcaf\.ee$ -(^|\.)mcfog\.com$ -(^|\.)mcreasite\.com$ -(^|\.)md-t\.org$ -(^|\.)me\.youthwant\.com\.tw$ -(^|\.)meansys\.com$ -(^|\.)media\.nu\.nl$ -(^|\.)media\.org\.hk$ -(^|\.)mediachinese\.com$ -(^|\.)mediafire\.com$ -(^|\.)mediafreakcity\.com$ -(^|\.)medium\.com$ -(^|\.)meetav\.com$ -(^|\.)meetup\.com$ -(^|\.)mefeedia\.com$ -(^|\.)mefound\.com$ -(^|\.)mega\.nz$ -(^|\.)megaproxy\.com$ -(^|\.)megarotic\.com$ -(^|\.)megavideo\.com$ -(^|\.)megurineluka\.com$ -(^|\.)meirixiaochao\.com$ -(^|\.)melon-peach\.com$ -(^|\.)meltoday\.com$ -(^|\.)meme\.yahoo\.com$ -(^|\.)memehk\.com$ -(^|\.)memorybbs\.com$ -(^|\.)memri\.org$ -(^|\.)memrijttm\.org$ -(^|\.)mercyprophet\.org$ -(^|\.)meridian-trust\.org$ -(^|\.)meripet\.biz$ -(^|\.)meripet\.com$ -(^|\.)merit-times\.com\.tw$ -(^|\.)meshrep\.com$ -(^|\.)mesotw\.com$ -(^|\.)messenger\.com$ -(^|\.)metacafe\.com$ -(^|\.)metarthunter\.com$ -(^|\.)meteorshowersonline\.com$ -(^|\.)metrohk\.com\.hk$ -(^|\.)metrolife\.ca$ -(^|\.)metroradio\.com\.hk$ -(^|\.)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$ -(^|\.)mike\.cz\.cc$ -(^|\.)mikesoltys\.com$ -(^|\.)milph\.net$ -(^|\.)milsurps\.com$ -(^|\.)mimiai\.net$ -(^|\.)mimivip\.com$ -(^|\.)mimivv\.com$ -(^|\.)mindrolling\.org$ -(^|\.)minghui-a\.org$ -(^|\.)minghui-b\.org$ -(^|\.)minghui-school\.org$ -(^|\.)minghui\.or\.kr$ -(^|\.)minghui\.org$ -(^|\.)minghuiyw\.wordpress\.com$ -(^|\.)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$ -(^|\.)mist\.vip$ -(^|\.)mitao\.com\.tw$ -(^|\.)mitbbs\.com$ -(^|\.)mitbbsau\.com$ -(^|\.)mixero\.com$ -(^|\.)mixpod\.com$ -(^|\.)mixx\.com$ -(^|\.)mizzmona\.com$ -(^|\.)mjib\.gov\.tw$ -(^|\.)mjlsh\.usc\.cuhk\.edu\.hk$ -(^|\.)mk5000\.com$ -(^|\.)mlcool\.com$ -(^|\.)mm-cg\.com$ -(^|\.)mmaaxx\.com$ -(^|\.)mmmca\.com$ -(^|\.)mnewstv\.com$ -(^|\.)mo\.nightlife141\.com$ -(^|\.)mobatek\.net$ -(^|\.)mobile01\.com$ -(^|\.)mobileways\.de$ -(^|\.)moby\.to$ -(^|\.)mobypicture\.com$ -(^|\.)moeaic\.gov\.tw$ -(^|\.)moeerolibrary\.com$ -(^|\.)mofaxiehui\.com$ -(^|\.)mofos\.com$ -(^|\.)mog\.com$ -(^|\.)mol\.gov\.tw$ -(^|\.)molihua\.org$ -(^|\.)mondex\.org$ -(^|\.)money-link\.com\.tw$ -(^|\.)moneyhome\.biz$ -(^|\.)monitorchina\.org$ -(^|\.)monster\.com$ -(^|\.)moodyz\.com$ -(^|\.)moonbbs\.com$ -(^|\.)morningsun\.org$ -(^|\.)moroneta\.com$ -(^|\.)mos\.ru$ -(^|\.)motherless\.com$ -(^|\.)motor4ik\.ru$ -(^|\.)mousebreaker\.com$ -(^|\.)movements\.org$ -(^|\.)moviefap\.com$ -(^|\.)mp3buscador\.com$ -(^|\.)mp3ye\.eu$ -(^|\.)mpettis\.com$ -(^|\.)mpfinance\.com$ -(^|\.)mpinews\.com$ -(^|\.)mponline\.hk$ -(^|\.)mqxd\.org$ -(^|\.)mrbasic\.com$ -(^|\.)mrbonus\.com$ -(^|\.)mrface\.com$ -(^|\.)mrslove\.com$ -(^|\.)mrtweet\.com$ -(^|\.)msguancha\.com$ -(^|\.)msha\.gov$ -(^|\.)mswe1\.org$ -(^|\.)mthruf\.com$ -(^|\.)mtw\.tl$ -(^|\.)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$ -(^|\.)mx\.hao123\.com$ -(^|\.)mx981\.com$ -(^|\.)my-formosa\.com$ -(^|\.)my-private-network\.co\.uk$ -(^|\.)my-proxy\.com$ -(^|\.)my\.mail\.ru$ -(^|\.)my\.opera\.com$ -(^|\.)my\.pcloud\.com$ -(^|\.)my03\.com$ -(^|\.)myactimes\.com$ -(^|\.)myanniu\.com$ -(^|\.)myaudiocast\.com$ -(^|\.)myav\.com\.tw$ -(^|\.)mybbs\.us$ -(^|\.)mybet\.com$ -(^|\.)myca168\.com$ -(^|\.)mycanadanow\.com$ -(^|\.)mychinamyhome\.com$ -(^|\.)mychinanet\.com$ -(^|\.)mychinanews\.com$ -(^|\.)mychinese\.news$ -(^|\.)mycnnews\.com$ -(^|\.)mycould\.com$ -(^|\.)mydad\.info$ -(^|\.)myddns\.com$ -(^|\.)myeasytv\.com$ -(^|\.)myeclipseide\.com$ -(^|\.)myforum\.com\.hk$ -(^|\.)myforum\.com\.uk$ -(^|\.)myfreecams\.com$ -(^|\.)myfreepaysite\.com$ -(^|\.)myfreshnet\.com$ -(^|\.)myftp\.info$ -(^|\.)myftp\.name$ -(^|\.)myiphide\.com$ -(^|\.)mykomica\.org$ -(^|\.)mylftv\.com$ -(^|\.)mymediarom\.com$ -(^|\.)mymoe\.moe$ -(^|\.)mymom\.info$ -(^|\.)mymusic\.net\.tw$ -(^|\.)mynetav\.net$ -(^|\.)mynetav\.org$ -(^|\.)mynumber\.org$ -(^|\.)myparagliding\.com$ -(^|\.)mypicture\.info$ -(^|\.)mypop3\.net$ -(^|\.)mypop3\.org$ -(^|\.)mypopescu\.com$ -(^|\.)myradio\.hk$ -(^|\.)myreadingmanga\.info$ -(^|\.)mysecondarydns\.com$ -(^|\.)myshare\.url\.com\.tw$ -(^|\.)mysinablog\.com$ -(^|\.)mysite\.verizon\.net$ -(^|\.)myspace\.com$ -(^|\.)myspacecdn\.com$ -(^|\.)mytalkbox\.com$ -(^|\.)mytizi\.com$ -(^|\.)mywww\.biz$ -(^|\.)myz\.info$ -(^|\.)naacoalition\.org$ -(^|\.)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$ -(^|\.)nat\.gov\.tw$ -(^|\.)nat\.moe$ -(^|\.)national-lottery\.co\.uk$ -(^|\.)nationsonline\.org$ -(^|\.)nationwide\.com$ -(^|\.)naughtyamerica\.com$ -(^|\.)navyfamily\.navy\.mil$ -(^|\.)navyreserve\.navy\.mil$ -(^|\.)naweeklytimes\.com$ -(^|\.)nbtvpn\.com$ -(^|\.)nccwatch\.org\.tw$ -(^|\.)nch\.com\.tw$ -(^|\.)ncn\.org$ -(^|\.)nde\.de$ -(^|\.)ndr\.de$ -(^|\.)ned\.org$ -(^|\.)nekoslovakia\.net$ -(^|\.)nemesis2\.qx\.net$ -(^|\.)neo-miracle\.com$ -(^|\.)nepusoku\.com$ -(^|\.)net-fits\.pro$ -(^|\.)netbirds\.com$ -(^|\.)netcolony\.com$ -(^|\.)netflix\.com$ -(^|\.)netme\.cc$ -(^|\.)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$ -(^|\.)newipnow\.com$ -(^|\.)newlandmagazine\.com\.au$ -(^|\.)newnews\.ca$ -(^|\.)news\.bbc\.co\.uk$ -(^|\.)news\.cnyes\.com$ -(^|\.)news\.hk\.msn\.com$ -(^|\.)news\.hkpeanut\.com$ -(^|\.)news\.msn\.com\.tw$ -(^|\.)news\.nationalgeographic\.com$ -(^|\.)news\.now\.com$ -(^|\.)news\.now\.com%2fhome$ -(^|\.)news\.omy\.sg$ -(^|\.)news\.seehua\.com$ -(^|\.)news\.sina\.com\.hk$ -(^|\.)news\.sina\.com\.tw$ -(^|\.)news\.sinchew\.com\.my$ -(^|\.)news\.singtao\.ca$ -(^|\.)news\.tvb\.com$ -(^|\.)news\.tvbs\.com\.tw$ -(^|\.)news\.yahoo\.com$ -(^|\.)news100\.com\.tw$ -(^|\.)newsancai\.com$ -(^|\.)newschinacomment\.org$ -(^|\.)newscn\.org$ -(^|\.)newsdetox\.ca$ -(^|\.)newsdh\.com$ -(^|\.)newsforums\.bbc\.co\.uk$ -(^|\.)newspeak\.cc$ -(^|\.)newstamago\.com$ -(^|\.)newstapa\.org$ -(^|\.)newstarnet\.com$ -(^|\.)newtaiwan\.com\.tw$ -(^|\.)newtalk\.tw$ -(^|\.)newyorktimes\.com$ -(^|\.)nexon\.com$ -(^|\.)next11\.co\.jp$ -(^|\.)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$ -(^|\.)nga\.mil$ -(^|\.)ngensis\.com$ -(^|\.)nhentai\.net$ -(^|\.)nhi\.gov\.tw$ -(^|\.)nhk-ondemand\.jp$ -(^|\.)nic\.cz\.cc$ -(^|\.)nic\.google$ -(^|\.)nic\.gov$ -(^|\.)nicovideo\.jp$ -(^|\.)nighost\.org$ -(^|\.)nikkei\.com$ -(^|\.)ninecommentaries\.com$ -(^|\.)ninjacloak\.com$ -(^|\.)ninjaproxy\.ninja$ -(^|\.)nintendium\.com$ -(^|\.)ninth\.biz$ -(^|\.)niusnews\.com$ -(^|\.)njactb\.org$ -(^|\.)njuice\.com$ -(^|\.)nko\.navy\.mil$ -(^|\.)nlfreevpn\.com$ -(^|\.)no-ip\.org$ -(^|\.)nobel\.se$ -(^|\.)nobelprize\.org$ -(^|\.)nobodycanstop\.us$ -(^|\.)nokogiri\.org$ -(^|\.)nokola\.com$ -(^|\.)noodlevpn\.com$ -(^|\.)norbulingka\.org$ -(^|\.)nordstrom\.com$ -(^|\.)nordstromimage\.com$ -(^|\.)nordstromrack\.com$ -(^|\.)nordvpn\.com$ -(^|\.)nottinghampost\.com$ -(^|\.)novelasia\.com$ -(^|\.)now\.im$ -(^|\.)nownews\.com$ -(^|\.)nowtorrents\.com$ -(^|\.)noypf\.com$ -(^|\.)npa\.go\.jp$ -(^|\.)npa\.gov\.tw$ -(^|\.)npnt\.me$ -(^|\.)nps\.gov$ -(^|\.)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\.cz$ -(^|\.)ntdtv\.org$ -(^|\.)ntdtv\.ru$ -(^|\.)ntdtvla\.com$ -(^|\.)ntrfun\.com$ -(^|\.)ntsna\.gov\.tw$ -(^|\.)nubiles\.net$ -(^|\.)nuexpo\.com$ -(^|\.)nukistream\.com$ -(^|\.)nurgo-software\.com$ -(^|\.)nusatrip\.com$ -(^|\.)nutaku\.net$ -(^|\.)nuuvem\.com$ -(^|\.)nuvid\.com$ -(^|\.)nuzcom\.com$ -(^|\.)nvdst\.com$ -(^|\.)nvquan\.org$ -(^|\.)nvtongzhisheng\.org$ -(^|\.)nwtca\.org$ -(^|\.)ny\.stgloballink\.com$ -(^|\.)ny\.visiontimes\.com$ -(^|\.)nyaa\.eu$ -(^|\.)nyaa\.si$ -(^|\.)nydus\.ca$ -(^|\.)nylon-angel\.com$ -(^|\.)nylonstockingsonline\.com$ -(^|\.)nyt\.com$ -(^|\.)nytchina\.com$ -(^|\.)nytcn\.me$ -(^|\.)nytco\.com$ -(^|\.)nyti\.ms$ -(^|\.)nytimes\.com$ -(^|\.)nytimes\.map\.fastly\.net$ -(^|\.)nytimg\.com$ -(^|\.)nytstyle\.com$ -(^|\.)nzchinese\.com$ -(^|\.)nzchinese\.net\.nz$ -(^|\.)observechina\.net$ -(^|\.)obutu\.com$ -(^|\.)ocaspro\.com$ -(^|\.)occupytiananmen\.com$ -(^|\.)oclp\.hk$ -(^|\.)ocreampies\.com$ -(^|\.)ocry\.com$ -(^|\.)october-review\.org$ -(^|\.)oculus\.com$ -(^|\.)oculuscdn\.com$ -(^|\.)offbeatchina\.com$ -(^|\.)officeoftibet\.com$ -(^|\.)ofile\.org$ -(^|\.)ogaoga\.org$ -(^|\.)ogate\.org$ -(^|\.)oikos\.com\.tw$ -(^|\.)oiktv\.com$ -(^|\.)oizoblog\.com$ -(^|\.)ok\.ru$ -(^|\.)okayfreedom\.com$ -(^|\.)okk\.tw$ -(^|\.)old-cat\.net$ -(^|\.)old\.honeynet\.org$ -(^|\.)old\.nabble\.com$ -(^|\.)olumpo\.com$ -(^|\.)olympicwatch\.org$ -(^|\.)omgili\.com$ -(^|\.)omni7\.jp$ -(^|\.)omnitalk\.com$ -(^|\.)omnitalk\.org$ -(^|\.)on\.cc$ -(^|\.)on2\.com$ -(^|\.)onapp\.com$ -(^|\.)onedrive\.live\.com$ -(^|\.)onedumb\.com$ -(^|\.)onion\.city$ -(^|\.)online\.recoveryversion\.org$ -(^|\.)onlinecha\.com$ -(^|\.)onlineyoutube\.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$ -(^|\.)openvpn\.net$ -(^|\.)openwebster\.com$ -(^|\.)openwrt\.org\.cn$ -(^|\.)opml\.radiotime\.com$ -(^|\.)organcare\.org\.tw$ -(^|\.)organharvestinvestigation\.net$ -(^|\.)organiccrap\.com$ -(^|\.)orgasm\.com$ -(^|\.)orgfree\.com$ -(^|\.)orient-doll\.com$ -(^|\.)orientaldaily\.com\.my$ -(^|\.)orn\.jp$ -(^|\.)orzistic\.org$ -(^|\.)osfoora\.com$ -(^|\.)otnd\.org$ -(^|\.)otto\.de$ -(^|\.)otzo\.com$ -(^|\.)ourdearamy\.com$ -(^|\.)ourhobby\.com$ -(^|\.)oursogo\.com$ -(^|\.)oursteps\.com\.au$ -(^|\.)oursweb\.net$ -(^|\.)ourtv\.hk$ -(^|\.)overplay\.net$ -(^|\.)oversea\.istarshine\.com$ -(^|\.)ow\.ly$ -(^|\.)owl\.li$ -(^|\.)oyax\.com$ -(^|\.)oyghan\.com$ -(^|\.)ozchinese\.com$ -(^|\.)ozvoice\.org$ -(^|\.)ozxw\.com$ -(^|\.)ozyoyo\.com$ -(^|\.)pachosting\.com$ -(^|\.)pacificpoker\.com$ -(^|\.)packages\.debian\.org$ -(^|\.)packetix\.net$ -(^|\.)pacopacomama\.com$ -(^|\.)padmanet\.com$ -(^|\.)page\.bid\.yahoo\.com$ -(^|\.)page2rss\.com$ -(^|\.)pagodabox\.com$ -(^|\.)palacemoon\.com$ -(^|\.)paldengyal\.com$ -(^|\.)paljorpublications\.com$ -(^|\.)paltalk\.com$ -(^|\.)panacom\.co\.jp$ -(^|\.)panamapapers\.sueddeutsche\.de$ -(^|\.)pandapow\.co$ -(^|\.)pandapow\.net$ -(^|\.)pandavpn-jp\.com$ -(^|\.)pandora\.com$ -(^|\.)pandora\.tv$ -(^|\.)pangci\.net$ -(^|\.)panluan\.net$ -(^|\.)panoramio\.com$ -(^|\.)pao-pao\.net$ -(^|\.)paper\.li$ -(^|\.)paperb\.us$ -(^|\.)paradisehill\.cc$ -(^|\.)paradisepoker\.com$ -(^|\.)parkansky\.com$ -(^|\.)partycasino\.com$ -(^|\.)partypoker\.com$ -(^|\.)passion\.com$ -(^|\.)passiontimes\.hk$ -(^|\.)pastebin\.com$ -(^|\.)pastie\.org$ -(^|\.)pbs\.org$ -(^|\.)pbwiki\.com$ -(^|\.)pbworks\.com$ -(^|\.)pbxes\.com$ -(^|\.)pbxes\.org$ -(^|\.)pcanywhere\.net$ -(^|\.)pcc\.gov\.tw$ -(^|\.)pcdvd\.com\.tw$ -(^|\.)pchome\.com\.tw$ -(^|\.)pcij\.org$ -(^|\.)pcstore\.com\.tw$ -(^|\.)pct\.org\.tw$ -(^|\.)pdetails\.com$ -(^|\.)pdproxy\.com$ -(^|\.)pds\.nasa\.gov$ -(^|\.)peace\.ca$ -(^|\.)peacefire\.org$ -(^|\.)peacehall\.com$ -(^|\.)pearlher\.org$ -(^|\.)peeasian\.com$ -(^|\.)pekingduck\.org$ -(^|\.)pemulihan\.or\.id$ -(^|\.)pen\.io$ -(^|\.)penchinese\.com$ -(^|\.)penchinese\.net$ -(^|\.)pengyulong\.com$ -(^|\.)penisbot\.com$ -(^|\.)penthouse\.com$ -(^|\.)pentoy\.hk$ -(^|\.)peoplebookcafe\.com$ -(^|\.)peoplenews\.tw$ -(^|\.)peopo\.org$ -(^|\.)percy\.in$ -(^|\.)perfectgirls\.net$ -(^|\.)perfectvpn\.net$ -(^|\.)periscope\.tv$ -(^|\.)persecutionblog\.com$ -(^|\.)persiankitty\.com$ -(^|\.)pfd\.org\.hk$ -(^|\.)phapluan\.org$ -(^|\.)phayul\.com$ -(^|\.)philborges\.com$ -(^|\.)philly\.com$ -(^|\.)phmsociety\.org$ -(^|\.)phncdn\.com$ -(^|\.)phobos\.apple\.com$ -(^|\.)phosphation13\.rssing\.com$ -(^|\.)photodharma\.net$ -(^|\.)photofocus\.com$ -(^|\.)phuquocservices\.com$ -(^|\.)picacomic\.com$ -(^|\.)picacomiccn\.com$ -(^|\.)picasaweb\.com$ -(^|\.)picidae\.net$ -(^|\.)pictures\.playboy\.com$ -(^|\.)picturesocial\.com$ -(^|\.)pin-cong\.com$ -(^|\.)pin6\.com$ -(^|\.)ping\.fm$ -(^|\.)pinimg\.com$ -(^|\.)pinkrod\.com$ -(^|\.)pinoy-n\.com$ -(^|\.)pinterest\.at$ -(^|\.)pinterest\.co\.kr$ -(^|\.)pinterest\.co\.uk$ -(^|\.)pinterest\.com$ -(^|\.)pinterest\.de$ -(^|\.)pinterest\.dk$ -(^|\.)pinterest\.fr$ -(^|\.)pinterest\.jp$ -(^|\.)pinterest\.nl$ -(^|\.)pinterest\.se$ -(^|\.)pioneer-worker\.forums-free\.com$ -(^|\.)pipii\.tv$ -(^|\.)piposay\.com$ -(^|\.)piraattilahti\.org$ -(^|\.)piring\.com$ -(^|\.)pixelqi\.com$ -(^|\.)pixiv\.net$ -(^|\.)pixnet\.net$ -(^|\.)pk\.com$ -(^|\.)placemix\.com$ -(^|\.)playboy\.com$ -(^|\.)playboyplus\.com$ -(^|\.)player\.fm$ -(^|\.)playno1\.com$ -(^|\.)playpcesor\.com$ -(^|\.)plays\.com\.tw$ -(^|\.)plm\.org\.hk$ -(^|\.)plunder\.com$ -(^|\.)plus28\.com$ -(^|\.)plusbb\.com$ -(^|\.)pmatehunter\.com$ -(^|\.)pmates\.com$ -(^|\.)po2b\.com$ -(^|\.)pobieramy\.top$ -(^|\.)podictionary\.com$ -(^|\.)pokerstars\.net$ -(^|\.)politicalchina\.org$ -(^|\.)politicalconsultation\.org$ -(^|\.)poloniex\.com$ -(^|\.)polymer-project\.org$ -(^|\.)polymerhk\.com$ -(^|\.)popo\.tw$ -(^|\.)popvote\.hk$ -(^|\.)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$ -(^|\.)potvpn\.com$ -(^|\.)power\.com$ -(^|\.)powerapple\.com$ -(^|\.)powercx\.com$ -(^|\.)powerphoto\.org$ -(^|\.)prayforchina\.net$ -(^|\.)premeforwindows7\.com$ -(^|\.)presentationzen\.com$ -(^|\.)presidentlee\.tw$ -(^|\.)prestige-av\.com$ -(^|\.)prisoner-state-secret-journal-premier$ -(^|\.)prisoneralert\.com$ -(^|\.)pritunl\.com$ -(^|\.)privacybox\.de$ -(^|\.)private\.com$ -(^|\.)privateinternetaccess\.com$ -(^|\.)privatepaste\.com$ -(^|\.)privatetunnel\.com$ -(^|\.)privatevpn\.com$ -(^|\.)procopytips\.com$ -(^|\.)prosiben\.de$ -(^|\.)provideocoalition\.com$ -(^|\.)provpnaccounts\.com$ -(^|\.)proxfree\.com$ -(^|\.)proxifier\.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$ -(^|\.)psiphon\.ca$ -(^|\.)psiphon\.civisec\.org$ -(^|\.)psiphon3\.com$ -(^|\.)psiphontoday\.com$ -(^|\.)pts\.org\.tw$ -(^|\.)ptt\.cc$ -(^|\.)pttvan\.org$ -(^|\.)pubu\.com\.tw$ -(^|\.)puffinbrowser\.com$ -(^|\.)puffstore\.com$ -(^|\.)pullfolio\.com$ -(^|\.)pulse\.yahoo\.com$ -(^|\.)punyu\.com$ -(^|\.)pure18\.com$ -(^|\.)pureconcepts\.net$ -(^|\.)pureinsight\.org$ -(^|\.)purepdf\.com$ -(^|\.)purevpn\.com$ -(^|\.)purplelotus\.org$ -(^|\.)pursuestar\.com$ -(^|\.)pushchinawall\.com$ -(^|\.)pussyspace\.com$ -(^|\.)putihome\.org$ -(^|\.)putlocker\.com$ -(^|\.)putty\.org$ -(^|\.)puuko\.com$ -(^|\.)pwned\.com$ -(^|\.)python\.com$ -(^|\.)python\.com\.tw$ -(^|\.)pythonhackers\.com$ -(^|\.)q%3dfreedom$ -(^|\.)q%3dtriangle$ -(^|\.)q=freedom$ -(^|\.)q=triangle$ -(^|\.)qanote\.com$ -(^|\.)qgirl\.com\.tw$ -(^|\.)qhigh\.com$ -(^|\.)qi-gong\.me$ -(^|\.)qiandao\.today$ -(^|\.)qiangyou\.org$ -(^|\.)qidian\.ca$ -(^|\.)qienkuen\.org$ -(^|\.)qiwen\.lu$ -(^|\.)qixianglu\.cn$ -(^|\.)qkshare\.com$ -(^|\.)qoos\.com$ -(^|\.)qpoe\.com$ -(^|\.)qq\.co\.za$ -(^|\.)qstatus\.com$ -(^|\.)qtrac\.eu$ -(^|\.)qtweeter\.com$ -(^|\.)quannengshen\.org$ -(^|\.)quantumbooter\.net$ -(^|\.)questvisual\.com$ -(^|\.)quitccp\.net$ -(^|\.)quitccp\.org$ -(^|\.)quora\.com$ -(^|\.)quran\.com$ -(^|\.)quranexplorer\.com$ -(^|\.)qusi8\.net$ -(^|\.)qvodzy\.org$ -(^|\.)qxbbs\.org$ -(^|\.)r18\.com$ -(^|\.)ra\.gg$ -(^|\.)radicalparty\.org$ -(^|\.)radiko\.jp$ -(^|\.)radioaustralia\.net\.au$ -(^|\.)radiohilight\.net$ -(^|\.)radiovaticana\.org$ -(^|\.)radiovncr\.com$ -(^|\.)rael\.org$ -(^|\.)raggedbanner\.com$ -(^|\.)raidcall\.com\.tw$ -(^|\.)raidtalk\.com\.tw$ -(^|\.)rainbowplan\.org$ -(^|\.)raizoji\.or\.jp$ -(^|\.)ramcity\.com\.au$ -(^|\.)rangwang\.biz$ -(^|\.)rangzen\.com$ -(^|\.)rangzen\.net$ -(^|\.)rangzen\.org$ -(^|\.)ranyunfei\.com$ -(^|\.)rapbull\.net$ -(^|\.)rapidgator\.net$ -(^|\.)rapidmoviez\.com$ -(^|\.)rapidvpn\.com$ -(^|\.)raremovie\.cc$ -(^|\.)raremovie\.net$ -(^|\.)rawgit\.com$ -(^|\.)rawgithub\.com$ -(^|\.)razyboard\.com$ -(^|\.)rcinet\.ca$ -(^|\.)rconversation\.blogs\.com$ -(^|\.)rd\.com$ -(^|\.)rdio\.com$ -(^|\.)read01\.com$ -(^|\.)read100\.com$ -(^|\.)readingtimes\.com\.tw$ -(^|\.)readmoo\.com$ -(^|\.)readydown\.com$ -(^|\.)realcourage\.org$ -(^|\.)realforum\.zkiz\.com$ -(^|\.)realitykings\.com$ -(^|\.)realraptalk\.com$ -(^|\.)realsexpass\.com$ -(^|\.)rebatesrule\.net$ -(^|\.)recordhistory\.org$ -(^|\.)recovery\.org\.tw$ -(^|\.)recoveryversion\.com\.tw$ -(^|\.)red-lang\.org$ -(^|\.)redballoonsolidarity\.org$ -(^|\.)redchinacn\.net$ -(^|\.)redchinacn\.org$ -(^|\.)redhotlabs\.com$ -(^|\.)redtube\.com$ -(^|\.)referer\.us$ -(^|\.)reflectivecode\.com$ -(^|\.)registry\.google$ -(^|\.)relaxbbs\.com$ -(^|\.)relay\.com\.tw$ -(^|\.)releaseinternational\.org$ -(^|\.)religioustolerance\.org$ -(^|\.)remembering_tiananmen_20_years$ -(^|\.)renminbao\.com$ -(^|\.)renyurenquan\.org$ -(^|\.)research\.jmsc\.hku\.hk$ -(^|\.)resilio\.com$ -(^|\.)retweeteffect\.com$ -(^|\.)retweetist\.com$ -(^|\.)retweetrank\.com$ -(^|\.)reuters\.com$ -(^|\.)reutersmedia\.net$ -(^|\.)revleft\.com$ -(^|\.)revver\.com$ -(^|\.)rfa\.org$ -(^|\.)rfachina\.com$ -(^|\.)rfamobile\.org$ -(^|\.)rfaweb\.org$ -(^|\.)rferl\.org$ -(^|\.)rfi\.fr$ -(^|\.)rfi\.my$ -(^|\.)rigpa\.org$ -(^|\.)riku\.me$ -(^|\.)rileyguide\.com$ -(^|\.)ritouki\.jp$ -(^|\.)ritter\.vg$ -(^|\.)rlwlw\.com$ -(^|\.)rmjdw\.com$ -(^|\.)rmjdw132\.info$ -(^|\.)roadshow\.hk$ -(^|\.)roboforex\.com$ -(^|\.)robustnessiskey\.com$ -(^|\.)rocket-inc\.net$ -(^|\.)rocksdb\.org$ -(^|\.)rojo\.com$ -(^|\.)rolia\.net$ -(^|\.)ronjoneswriter\.com$ -(^|\.)roodo\.com$ -(^|\.)rosechina\.net$ -(^|\.)rotten\.com$ -(^|\.)rsf-chinese\.org$ -(^|\.)rsf\.org$ -(^|\.)rsgamen\.org$ -(^|\.)rssmeme\.com$ -(^|\.)rtalabel\.org$ -(^|\.)rthk\.hk$ -(^|\.)rthk\.org\.hk$ -(^|\.)rti\.org\.tw$ -(^|\.)rtycminnesota\.org$ -(^|\.)ruanyifeng\.com$ -(^|\.)rukor\.org$ -(^|\.)rushbee\.com$ -(^|\.)ruten\.com\.tw$ -(^|\.)rutube\.ru$ -(^|\.)ruyiseek\.com$ -(^|\.)rxhj\.net$ -(^|\.)s-cute\.com$ -(^|\.)s-dragon\.org$ -(^|\.)s1\.nudezz\.com$ -(^|\.)s1heng\.com$ -(^|\.)s1s1s1\.com$ -(^|\.)s3-ap-northeast-1\.amazonaws\.com$ -(^|\.)s3-ap-southeast-2\.amazonaws\.com$ -(^|\.)s8forum\.com$ -(^|\.)sa\.hao123\.com$ -(^|\.)sacks\.com$ -(^|\.)sacom\.hk$ -(^|\.)sadistic-v\.com$ -(^|\.)sadpanda\.us$ -(^|\.)safervpn\.com$ -(^|\.)saintyculture\.com$ -(^|\.)saiq\.me$ -(^|\.)sakuralive\.com$ -(^|\.)sakya\.org$ -(^|\.)salvation\.org\.hk$ -(^|\.)samair\.ru$ -(^|\.)sambhota\.org$ -(^|\.)sanmin\.com\.tw$ -(^|\.)sapikachu\.net$ -(^|\.)saveliuxiaobo\.com$ -(^|\.)savemedia\.com$ -(^|\.)savethedate\.foo$ -(^|\.)savetibet\.de$ -(^|\.)savetibet\.fr$ -(^|\.)savetibet\.nl$ -(^|\.)savetibet\.org$ -(^|\.)savetibet\.ru$ -(^|\.)savetibetstore\.org$ -(^|\.)savevid\.com$ -(^|\.)say2\.info$ -(^|\.)sbme\.me$ -(^|\.)sbs\.com\.au$ -(^|\.)scasino\.com$ -(^|\.)schema\.org$ -(^|\.)sciencenets\.com$ -(^|\.)scieron\.com$ -(^|\.)scmp\.com$ -(^|\.)scmpchinese\.com$ -(^|\.)scramble\.io$ -(^|\.)scribd\.com$ -(^|\.)scriptspot\.com$ -(^|\.)seapuff\.com$ -(^|\.)search$ -(^|\.)search\.aol\.com$ -(^|\.)search\.yahoo\.co\.jp$ -(^|\.)searchtruth\.com$ -(^|\.)secretchina\.com$ -(^|\.)secretgarden\.no$ -(^|\.)secretsline\.biz$ -(^|\.)secure\.hustler\.com$ -(^|\.)secure\.logmein\.com$ -(^|\.)secure\.raxcdn\.com$ -(^|\.)securetunnel\.com$ -(^|\.)securitykiss\.com$ -(^|\.)seed4\.me$ -(^|\.)seesmic\.com$ -(^|\.)seevpn\.com$ -(^|\.)seezone\.net$ -(^|\.)sejie\.com$ -(^|\.)sellclassics\.com$ -(^|\.)sendsmtp\.com$ -(^|\.)sendspace\.com$ -(^|\.)servehttp\.com$ -(^|\.)serveuser\.com$ -(^|\.)serveusers\.com$ -(^|\.)sesawe\.net$ -(^|\.)sesawe\.org$ -(^|\.)sethwklein\.net$ -(^|\.)setn\.com$ -(^|\.)settv\.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$ -(^|\.)sfileydy\.com$ -(^|\.)sfshibao\.com$ -(^|\.)sftindia\.org$ -(^|\.)sftuk\.org$ -(^|\.)shadeyouvpn\.com$ -(^|\.)shadow\.ma$ -(^|\.)shadowsky\.xyz$ -(^|\.)shadowsocks-r\.com$ -(^|\.)shadowsocks\.asia$ -(^|\.)shadowsocks\.com$ -(^|\.)shadowsocks\.com\.hk$ -(^|\.)shadowsocks\.org$ -(^|\.)shadowsocks9\.com$ -(^|\.)shambalapost\.com$ -(^|\.)shambhalasun\.com$ -(^|\.)shangfang\.org$ -(^|\.)shapeservices\.com$ -(^|\.)share\.dmhy\.org$ -(^|\.)share\.ovi\.com$ -(^|\.)share\.youthwant\.com\.tw$ -(^|\.)sharebee\.com$ -(^|\.)sharecool\.org$ -(^|\.)sharpdaily\.com\.hk$ -(^|\.)sharpdaily\.hk$ -(^|\.)sharpdaily\.tw$ -(^|\.)shat-tibet\.com$ -(^|\.)shattered\.io$ -(^|\.)sheikyermami\.com$ -(^|\.)shellfire\.de$ -(^|\.)shenshou\.org$ -(^|\.)shenyun\.com$ -(^|\.)shenyunperformingarts\.org$ -(^|\.)shenzhoufilm\.com$ -(^|\.)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$ -(^|\.)shopping\.com$ -(^|\.)showbiz\.omy\.sg$ -(^|\.)showhaotu\.com$ -(^|\.)showtime\.jp$ -(^|\.)shutterstock\.com$ -(^|\.)shwchurch\.org$ -(^|\.)shwchurch3\.com$ -(^|\.)siddharthasintent\.org$ -(^|\.)sidelinesnews\.com$ -(^|\.)sidelinessportseatery\.com$ -(^|\.)sierrafriendsoftibet\.org$ -(^|\.)sijihuisuo\.club$ -(^|\.)sijihuisuo\.com$ -(^|\.)silkbook\.com$ -(^|\.)simbolostwitter\.com$ -(^|\.)simplecd\.org$ -(^|\.)simpleproductivityblog\.com$ -(^|\.)sinchew\.com\.my$ -(^|\.)singaporepools\.com\.sg$ -(^|\.)singfortibet\.com$ -(^|\.)singpao\.com\.hk$ -(^|\.)singtao\.com$ -(^|\.)singtaousa\.com$ -(^|\.)sino-monthly\.com$ -(^|\.)sinoants\.com$ -(^|\.)sinocast\.com$ -(^|\.)sinocism\.com$ -(^|\.)sinomontreal\.ca$ -(^|\.)sinonet\.ca$ -(^|\.)sinopitt\.info$ -(^|\.)sinoquebec\.com$ -(^|\.)sipml5\.org$ -(^|\.)sis\.xxx$ -(^|\.)sis001\.com$ -(^|\.)sis001\.us$ -(^|\.)site90\.net$ -(^|\.)sitebro\.tw$ -(^|\.)sitekreator\.com$ -(^|\.)siteks\.uk\.to$ -(^|\.)sitemaps\.org$ -(^|\.)sixth\.biz$ -(^|\.)sjrt\.org$ -(^|\.)sjum\.cn$ -(^|\.)sketchappsources\.com$ -(^|\.)skimtube\.com$ -(^|\.)skybet\.com$ -(^|\.)skyking\.com\.tw$ -(^|\.)skyvegas\.com$ -(^|\.)skyxvpn\.com$ -(^|\.)slacker\.com$ -(^|\.)slaytizle\.com$ -(^|\.)sleazydream\.com$ -(^|\.)slheng\.com$ -(^|\.)slickvpn\.com$ -(^|\.)slideshare\.net$ -(^|\.)slinkset\.com$ -(^|\.)slutload\.com$ -(^|\.)slutmoonbeam\.com$ -(^|\.)slyip\.com$ -(^|\.)slyip\.net$ -(^|\.)sm-miracle\.com$ -(^|\.)smartdnsproxy\.com$ -(^|\.)smarthide\.com$ -(^|\.)smchbooks\.com$ -(^|\.)smh\.com\.au$ -(^|\.)smhric\.org$ -(^|\.)smith\.edu$ -(^|\.)smyxy\.org$ -(^|\.)snapchat\.com$ -(^|\.)snaptu\.com$ -(^|\.)sndcdn\.com$ -(^|\.)sneakme\.net$ -(^|\.)snowlionpub\.com$ -(^|\.)sobees\.com$ -(^|\.)soc\.mil$ -(^|\.)socialwhale\.com$ -(^|\.)sockscap64\.com$ -(^|\.)sockslist\.net$ -(^|\.)socrec\.org$ -(^|\.)sod\.co\.jp$ -(^|\.)sodatea\.github\.io$ -(^|\.)softether-download\.com$ -(^|\.)softether\.co\.jp$ -(^|\.)softether\.org$ -(^|\.)softwarebychuck\.com$ -(^|\.)softwaredownload\.gitbooks\.io$ -(^|\.)sogclub\.com$ -(^|\.)sogrady\.me$ -(^|\.)soh\.tw$ -(^|\.)sohcradio\.com$ -(^|\.)sohfrance\.org$ -(^|\.)sokamonline\.com$ -(^|\.)sokmil\.com$ -(^|\.)solarsystem\.nasa\.gov$ -(^|\.)solidaritetibet\.org$ -(^|\.)solidfiles\.com$ -(^|\.)somee\.com$ -(^|\.)songjianjun\.com$ -(^|\.)sonicbbs\.cc$ -(^|\.)sonidodelaesperanza\.org$ -(^|\.)sopcast\.com$ -(^|\.)sopcast\.org$ -(^|\.)sorazone\.net$ -(^|\.)sorting-algorithms\.com$ -(^|\.)sos\.org$ -(^|\.)sosreader\.com$ -(^|\.)sostibet\.org$ -(^|\.)soubory\.com$ -(^|\.)soul-plus\.net$ -(^|\.)soulcaliburhentai\.net$ -(^|\.)soumo\.info$ -(^|\.)soundcloud\.com$ -(^|\.)soundofhope\.kr$ -(^|\.)soundofhope\.org$ -(^|\.)soup\.io$ -(^|\.)soupofmedia\.com$ -(^|\.)sourceforge\.net$ -(^|\.)sourcewadio\.com$ -(^|\.)southnews\.com\.tw$ -(^|\.)sowers\.org\.hk$ -(^|\.)spankbang\.com$ -(^|\.)spankingtube\.com$ -(^|\.)spankwire\.com$ -(^|\.)spb\.com$ -(^|\.)speakerdeck\.com$ -(^|\.)specxinzl\.jigsy\.com$ -(^|\.)speedify\.com$ -(^|\.)spem\.at$ -(^|\.)spencertipping\.com$ -(^|\.)spicevpn\.com$ -(^|\.)spideroak\.com$ -(^|\.)spike\.com$ -(^|\.)sports\.williamhill\.com$ -(^|\.)spotflux\.com$ -(^|\.)spotify\.com$ -(^|\.)spreadshirt\.es$ -(^|\.)spring4u\.info$ -(^|\.)springboardplatform\.com$ -(^|\.)sprite\.org$ -(^|\.)sproutcore\.com$ -(^|\.)sproxy\.info$ -(^|\.)squirly\.info$ -(^|\.)srcf\.ucam\.org$ -(^|\.)srocket\.us$ -(^|\.)ss-link\.com$ -(^|\.)ss\.carryzhou\.com$ -(^|\.)ss\.levyhsu\.com$ -(^|\.)ssglobal\.co$ -(^|\.)ssglobal\.me$ -(^|\.)ssh91\.com$ -(^|\.)ssl\.webpack\.de$ -(^|\.)ssl443\.org$ -(^|\.)sspro\.ml$ -(^|\.)sss\.camp$ -(^|\.)sstmlt\.moe$ -(^|\.)sstmlt\.net$ -(^|\.)stackoverflow\.com$ -(^|\.)stage64\.hk$ -(^|\.)standupfortibet\.org$ -(^|\.)stanford\.edu$ -(^|\.)starfishfx\.com$ -(^|\.)starp2p\.com$ -(^|\.)startpage\.com$ -(^|\.)startuplivingchina\.com$ -(^|\.)stat\.gov\.tw$ -(^|\.)static-economist\.com$ -(^|\.)static\.comico\.tw$ -(^|\.)static01\.nyt\.com$ -(^|\.)staticflickr\.com$ -(^|\.)statueofdemocracy\.org$ -(^|\.)stc\.com\.sa$ -(^|\.)steamcommunity\.com$ -(^|\.)steel-storm\.com$ -(^|\.)steganos\.com$ -(^|\.)steganos\.net$ -(^|\.)stepchina\.com$ -(^|\.)stephaniered\.com$ -(^|\.)sthoo\.com$ -(^|\.)stickam\.com$ -(^|\.)stickeraction\.com$ -(^|\.)stileproject\.com$ -(^|\.)sto\.cc$ -(^|\.)stoporganharvesting\.org$ -(^|\.)stoptibetcrisis\.net$ -(^|\.)storagenewsletter\.com$ -(^|\.)store\.steampowered\.com$ -(^|\.)stories\.google$ -(^|\.)storify\.com$ -(^|\.)storm\.mg$ -(^|\.)stormmediagroup\.com$ -(^|\.)stoweboyd\.com$ -(^|\.)stranabg\.com$ -(^|\.)straplessdildo\.com$ -(^|\.)streamingthe\.net$ -(^|\.)streema\.com$ -(^|\.)strikingly\.com$ -(^|\.)strongvpn\.com$ -(^|\.)strongwindpress\.com$ -(^|\.)student\.tw$ -(^|\.)studentsforafreetibet\.org$ -(^|\.)stumbleupon\.com$ -(^|\.)stupidvideos\.com$ -(^|\.)subacme\.rerouted\.org$ -(^|\.)successfn\.com$ -(^|\.)sugarsync\.com$ -(^|\.)sugobbs\.com$ -(^|\.)sugumiru18\.com$ -(^|\.)suissl\.com$ -(^|\.)sujiatun\.wordpress\.com$ -(^|\.)sulian\.me$ -(^|\.)summify\.com$ -(^|\.)sumrando\.com$ -(^|\.)sun1911\.com$ -(^|\.)sunmedia\.ca$ -(^|\.)sunporno\.com$ -(^|\.)sunskyforum\.com$ -(^|\.)sunta\.com\.tw$ -(^|\.)sunvpn\.net$ -(^|\.)sunwinism\.joinbbs\.net$ -(^|\.)suoluo\.org$ -(^|\.)superfreevpn\.com$ -(^|\.)superokayama\.com$ -(^|\.)superpages\.com$ -(^|\.)supervpn\.net$ -(^|\.)suppig\.net$ -(^|\.)suprememastertv\.com$ -(^|\.)surfeasy\.com$ -(^|\.)surfeasy\.com\.au$ -(^|\.)suroot\.com$ -(^|\.)surrenderat20\.net$ -(^|\.)suyangg\.com$ -(^|\.)svsfx\.com$ -(^|\.)swagbucks\.com$ -(^|\.)swissvpn\.net$ -(^|\.)switch1\.jp$ -(^|\.)switchvpn\.net$ -(^|\.)sydneytoday\.com$ -(^|\.)sylfoundation\.org$ -(^|\.)syncback\.com$ -(^|\.)synergyse\.com$ -(^|\.)sysresccd\.org$ -(^|\.)sytes\.net$ -(^|\.)szbbs\.net$ -(^|\.)szetowah\.org\.hk$ -(^|\.)t-g\.com$ -(^|\.)t\.co$ -(^|\.)t\.me$ -(^|\.)t\.orzdream\.com$ -(^|\.)t35\.com$ -(^|\.)t66y\.com$ -(^|\.)taa-usa\.org$ -(^|\.)taaze\.tw$ -(^|\.)tabtter\.jp$ -(^|\.)tacc\.cwb\.gov\.tw$ -(^|\.)tacem\.org$ -(^|\.)taconet\.com\.tw$ -(^|\.)taedp\.org\.tw$ -(^|\.)tafm\.org$ -(^|\.)tagwa\.org\.au$ -(^|\.)tagwalk\.com$ -(^|\.)tahr\.org\.tw$ -(^|\.)taipei\.gov\.tw$ -(^|\.)taipeisociety\.org$ -(^|\.)taiwan-sex\.com$ -(^|\.)taiwanbible\.com$ -(^|\.)taiwancon\.com$ -(^|\.)taiwandaily\.net$ -(^|\.)taiwandc\.org$ -(^|\.)taiwanjobs\.gov\.tw$ -(^|\.)taiwanjustice\.com$ -(^|\.)taiwankiss\.com$ -(^|\.)taiwannation\.50webs\.com$ -(^|\.)taiwannation\.com$ -(^|\.)taiwannation\.com\.tw$ -(^|\.)taiwanncf\.org\.tw$ -(^|\.)taiwannews\.com\.tw$ -(^|\.)taiwantp\.net$ -(^|\.)taiwantt\.org\.tw$ -(^|\.)taiwanus\.net$ -(^|\.)taiwanyes\.com$ -(^|\.)taiwanyes\.ning\.com$ -(^|\.)talk853\.com$ -(^|\.)talkboxapp\.com$ -(^|\.)talkonly\.net$ -(^|\.)tamiaode\.tk$ -(^|\.)tanc\.org$ -(^|\.)tangben\.com$ -(^|\.)tangren\.us$ -(^|\.)taoism\.net$ -(^|\.)taolun\.info$ -(^|\.)tapanwap\.com$ -(^|\.)tapatalk\.com$ -(^|\.)tarr\.uspto\.gov$ -(^|\.)tascn\.com\.au$ -(^|\.)taup\.net$ -(^|\.)taweet\.com$ -(^|\.)tbcollege\.org$ -(^|\.)tbi\.org\.hk$ -(^|\.)tbicn\.org$ -(^|\.)tbjyt\.org$ -(^|\.)tbpic\.info$ -(^|\.)tbrc\.org$ -(^|\.)tbs-rainbow\.org$ -(^|\.)tbsec\.org$ -(^|\.)tbskkinabalu\.page\.tl$ -(^|\.)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$ -(^|\.)teachparentstech\.org$ -(^|\.)teamamericany\.com$ -(^|\.)tech2\.in\.com$ -(^|\.)teck\.in$ -(^|\.)teeniefuck\.net$ -(^|\.)teensinasia\.com$ -(^|\.)telecomspace\.com$ -(^|\.)telegram\.dog$ -(^|\.)telegram\.me$ -(^|\.)telegram\.org$ -(^|\.)telegramdownload\.com$ -(^|\.)telegraph\.co\.uk$ -(^|\.)telesco\.pe$ -(^|\.)tellme\.pw$ -(^|\.)tenacy\.com$ -(^|\.)tensorflow\.org$ -(^|\.)tenzinpalmo\.com$ -(^|\.)tew\.org$ -(^|\.)th\.hao123\.com$ -(^|\.)thaicn\.com$ -(^|\.)thb\.gov\.tw$ -(^|\.)theatrum-belli\.com$ -(^|\.)thebcomplex\.com$ -(^|\.)theblemish\.com$ -(^|\.)thebobs\.com$ -(^|\.)thebodyshop-usa\.com$ -(^|\.)thecenter\.mit\.edu$ -(^|\.)thechinabeat\.org$ -(^|\.)thedalailamamovie\.com$ -(^|\.)thedw\.us$ -(^|\.)thefacebook\.com$ -(^|\.)thefrontier\.hk$ -(^|\.)thegioitinhoc\.vn$ -(^|\.)thegly\.com$ -(^|\.)thehots\.info$ -(^|\.)thehousenews\.com$ -(^|\.)thehun\.net$ -(^|\.)theinitium\.com$ -(^|\.)thenewslens\.com$ -(^|\.)thepiratebay\.org$ -(^|\.)theportalwiki\.com$ -(^|\.)thereallove\.kr$ -(^|\.)therock\.net\.nz$ -(^|\.)thespeeder\.com$ -(^|\.)thestandnews\.com$ -(^|\.)thetibetcenter\.org$ -(^|\.)thetibetconnection\.org$ -(^|\.)thetibetmuseum\.org$ -(^|\.)thetibetpost\.com$ -(^|\.)thetinhat\.com$ -(^|\.)thetrotskymovie\.com$ -(^|\.)thevivekspot\.com$ -(^|\.)thewgo\.org$ -(^|\.)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-info\.net$ -(^|\.)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$ -(^|\.)tibetanfeministcollective\.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$ -(^|\.)tibetlibre\.free\.fr$ -(^|\.)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$ -(^|\.)tiltbrush\.com$ -(^|\.)timdir\.com$ -(^|\.)time\.com$ -(^|\.)times\.hinet\.net$ -(^|\.)timesofindia\.indiatimes\.com$ -(^|\.)timsah\.com$ -(^|\.)tintuc101\.com$ -(^|\.)tiny\.cc$ -(^|\.)tinychat\.com$ -(^|\.)tinypaste\.com$ -(^|\.)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$ -(^|\.)tongil\.or\.kr$ -(^|\.)tono-oka\.jp$ -(^|\.)tonyyan\.net$ -(^|\.)toodoc\.com$ -(^|\.)toonel\.net$ -(^|\.)top\.tv$ -(^|\.)top81\.ws$ -(^|\.)topic\.youthwant\.com\.tw$ -(^|\.)topnews\.in$ -(^|\.)toppornsites\.com$ -(^|\.)topshareware\.com$ -(^|\.)topsy\.com$ -(^|\.)toptip\.ca$ -(^|\.)tor\.blingblingsquad\.net$ -(^|\.)tor\.cn\.uptodown\.com$ -(^|\.)tor\.updatestar\.com$ -(^|\.)tora\.to$ -(^|\.)torcn\.com$ -(^|\.)torguard\.net$ -(^|\.)torproject\.org$ -(^|\.)torrentprivacy\.com$ -(^|\.)torrentproject\.se$ -(^|\.)torrenty\.org$ -(^|\.)torrentz\.eu$ -(^|\.)torvpn\.com$ -(^|\.)tosh\.comedycentral\.com$ -(^|\.)totalvpn\.com$ -(^|\.)toutiaoabc\.com$ -(^|\.)towngain\.com$ -(^|\.)toypark\.in$ -(^|\.)toythieves\.com$ -(^|\.)toytractorshow\.com$ -(^|\.)tparents\.org$ -(^|\.)tpi\.org\.tw$ -(^|\.)tracfone\.com$ -(^|\.)traffichaus\.com$ -(^|\.)trans\.wenweipo\.com$ -(^|\.)transparency\.org$ -(^|\.)treemall\.com\.tw$ -(^|\.)trendsmap\.com$ -(^|\.)trialofccp\.org$ -(^|\.)trickip\.net$ -(^|\.)trickip\.org$ -(^|\.)trimondi\.de$ -(^|\.)trouw\.nl$ -(^|\.)trt\.net\.tr$ -(^|\.)trtc\.com\.tw$ -(^|\.)truebuddha-md\.org$ -(^|\.)trulyergonomic\.com$ -(^|\.)truth101\.co\.tv$ -(^|\.)truthontour\.org$ -(^|\.)truveo\.com$ -(^|\.)tryheart\.jp$ -(^|\.)tsctv\.net$ -(^|\.)tsdr\.uspto\.gov$ -(^|\.)tsemtulku\.com$ -(^|\.)tsquare\.tv$ -(^|\.)tsu\.org\.tw$ -(^|\.)tsunagarumon\.com$ -(^|\.)tt-rss\.org$ -(^|\.)tt1069\.com$ -(^|\.)tttan\.com$ -(^|\.)tu8964\.com$ -(^|\.)tubaholic\.com$ -(^|\.)tube\.com$ -(^|\.)tube8\.com$ -(^|\.)tube911\.com$ -(^|\.)tubecup\.com$ -(^|\.)tubegals\.com$ -(^|\.)tubeislam\.com$ -(^|\.)tubestack\.com$ -(^|\.)tubewolf\.com$ -(^|\.)tui\.orzdream\.com$ -(^|\.)tuibeitu\.net$ -(^|\.)tuidang\.net$ -(^|\.)tuidang\.org$ -(^|\.)tuidang\.se$ -(^|\.)tuitwit\.com$ -(^|\.)tumblr\.com$ -(^|\.)tumutanzi\.com$ -(^|\.)tumview\.com$ -(^|\.)tunein\.com$ -(^|\.)tunnelbear\.com$ -(^|\.)tunnelr\.com$ -(^|\.)tuo8\.blue$ -(^|\.)tuo8\.cc$ -(^|\.)tuo8\.club$ -(^|\.)tuo8\.fit$ -(^|\.)tuo8\.hk$ -(^|\.)tuo8\.in$ -(^|\.)tuo8\.ninja$ -(^|\.)tuo8\.org$ -(^|\.)tuo8\.pw$ -(^|\.)tuo8\.red$ -(^|\.)tuo8\.space$ -(^|\.)turansam\.org$ -(^|\.)turbobit\.net$ -(^|\.)turbohide\.com$ -(^|\.)turbotwitter\.com$ -(^|\.)turntable\.fm$ -(^|\.)tushycash\.com$ -(^|\.)tuvpn\.com$ -(^|\.)tuzaijidi\.com$ -(^|\.)tv\.com$ -(^|\.)tvants\.com$ -(^|\.)tvboxnow\.com$ -(^|\.)tvider\.com$ -(^|\.)tvmost\.com\.hk$ -(^|\.)tvplayvideos\.com$ -(^|\.)tvunetworks\.com$ -(^|\.)tw-blog\.com$ -(^|\.)tw-npo\.org$ -(^|\.)tw\.answers\.yahoo\.com$ -(^|\.)tw\.bid\.yahoo\.com$ -(^|\.)tw\.gigacircle\.com$ -(^|\.)tw\.hao123\.com$ -(^|\.)tw\.jiepang\.com$ -(^|\.)tw\.knowledge\.yahoo\.com$ -(^|\.)tw\.mall\.yahoo\.com$ -(^|\.)tw\.mobi\.yahoo\.com$ -(^|\.)tw\.money\.yahoo\.com$ -(^|\.)tw\.myblog\.yahoo\.com$ -(^|\.)tw\.news\.yahoo\.com$ -(^|\.)tw\.streetvoice\.com$ -(^|\.)tw\.tomonews\.net$ -(^|\.)tw\.voa\.mobi$ -(^|\.)tw\.yahoo\.com$ -(^|\.)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$ -(^|\.)tweets\.seraph\.me$ -(^|\.)tweettunnel\.com$ -(^|\.)tweetwally\.com$ -(^|\.)tweetymail\.com$ -(^|\.)tweez\.net$ -(^|\.)twelve\.today$ -(^|\.)twerkingbutt\.com$ -(^|\.)twftp\.org$ -(^|\.)twgreatdaily\.com$ -(^|\.)twibase\.com$ -(^|\.)twibble\.de$ -(^|\.)twibbon\.com$ -(^|\.)twibs\.com$ -(^|\.)twicsy\.com$ -(^|\.)twiends\.com$ -(^|\.)twifan\.com$ -(^|\.)twiffo\.com$ -(^|\.)twiggit\.org$ -(^|\.)twilightsex\.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$ -(^|\.)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$ -(^|\.)twskype\.com$ -(^|\.)twstar\.net$ -(^|\.)twt\.tl$ -(^|\.)twtkr\.com$ -(^|\.)twtr2src\.ogaoga\.org$ -(^|\.)twtrland\.com$ -(^|\.)twttr\.com$ -(^|\.)twurl\.nl$ -(^|\.)twyac\.org$ -(^|\.)txxx\.com$ -(^|\.)tycool\.com$ -(^|\.)typepad\.com$ -(^|\.)u9un\.com$ -(^|\.)ub0\.cc$ -(^|\.)ubddns\.org$ -(^|\.)uberproxy\.net$ -(^|\.)uc-japan\.org$ -(^|\.)ucdc1998\.org$ -(^|\.)uderzo\.it$ -(^|\.)udn\.com$ -(^|\.)udn\.com\.tw$ -(^|\.)udnbkk\.com$ -(^|\.)uforadio\.com\.tw$ -(^|\.)ufreevpn\.com$ -(^|\.)ugo\.com$ -(^|\.)uhdwallpapers\.org$ -(^|\.)uhrp\.org$ -(^|\.)uighur\.narod\.ru$ -(^|\.)uighur\.nl$ -(^|\.)uighurbiz\.net$ -(^|\.)ukcdp\.co\.uk$ -(^|\.)ukliferadio\.co\.uk$ -(^|\.)ulike\.net$ -(^|\.)ulop\.net$ -(^|\.)ultrareach$ -(^|\.)ultrasurf$ -(^|\.)ultravpn\.fr$ -(^|\.)ultraxs\.com$ -(^|\.)umich\.edu$ -(^|\.)unblock-us\.com$ -(^|\.)unblock\.cn\.com$ -(^|\.)unblockdmm\.com$ -(^|\.)unblocker\.yt$ -(^|\.)unblocksit\.es$ -(^|\.)uncyclomedia\.org$ -(^|\.)uncyclopedia\.hk$ -(^|\.)uncyclopedia\.tw$ -(^|\.)underwoodammo\.com$ -(^|\.)unholyknight\.com$ -(^|\.)uni\.cc$ -(^|\.)unification\.net$ -(^|\.)unification\.org\.tw$ -(^|\.)unitedsocialpress\.com$ -(^|\.)unix100\.com$ -(^|\.)unknownspace\.org$ -(^|\.)unodedos\.com$ -(^|\.)unpo\.org$ -(^|\.)unseen\.is$ -(^|\.)untraceable\.us$ -(^|\.)uocn\.org$ -(^|\.)upcoming\.yahoo\.com$ -(^|\.)updates\.tdesktop\.com$ -(^|\.)upholdjustice\.org$ -(^|\.)upload4u\.info$ -(^|\.)uploaded\.net$ -(^|\.)uploaded\.to$ -(^|\.)uploadstation\.com$ -(^|\.)upmedia\.mg$ -(^|\.)upornia\.com$ -(^|\.)uproxy\.org$ -(^|\.)upwill\.org$ -(^|\.)ur7s\.com$ -(^|\.)urbansurvival\.com$ -(^|\.)urchin\.com$ -(^|\.)urlborg\.com$ -(^|\.)urlparser\.com$ -(^|\.)us\.to$ -(^|\.)usacn\.com$ -(^|\.)usaip\.eu$ -(^|\.)userapi\.nytlog\.com$ -(^|\.)users\.skynet\.be$ -(^|\.)usfk\.mil$ -(^|\.)ushuarencity\.echainhost\.com$ -(^|\.)usinfo\.state\.gov$ -(^|\.)usma\.edu$ -(^|\.)usmc\.mil$ -(^|\.)usmgtcg\.ning\.com$ -(^|\.)usno\.navy\.mil$ -(^|\.)usocctn\.com$ -(^|\.)ustream\.tv$ -(^|\.)usunitednews\.com$ -(^|\.)usus\.cc$ -(^|\.)utopianpal\.com$ -(^|\.)uu-gg\.com$ -(^|\.)uvwxyz\.xyz$ -(^|\.)uwants\.com$ -(^|\.)uwants\.net$ -(^|\.)uyghur-j\.org$ -(^|\.)uyghur\.co\.uk$ -(^|\.)uyghuramerican\.org$ -(^|\.)uyghurcanadiansociety\.org$ -(^|\.)uyghurcongress\.org$ -(^|\.)uyghurensemble\.co\.uk$ -(^|\.)uyghurpen\.org$ -(^|\.)uyghurpress\.com$ -(^|\.)uyghurstudies\.org$ -(^|\.)uygur\.fc2web\.com$ -(^|\.)uygur\.org$ -(^|\.)uymaarip\.com$ -(^|\.)v2ex\.com$ -(^|\.)v2ray\.com$ -(^|\.)van001\.com$ -(^|\.)van698\.com$ -(^|\.)vanemu\.cn$ -(^|\.)vanilla-jp\.com$ -(^|\.)vanpeople\.com$ -(^|\.)vansky\.com$ -(^|\.)vatn\.org$ -(^|\.)vcf-online\.org$ -(^|\.)vcfbuilder\.org$ -(^|\.)vds\.rightster\.com$ -(^|\.)vegas\.williamhill\.com$ -(^|\.)vegasred\.com$ -(^|\.)velkaepocha\.sk$ -(^|\.)venbbs\.com$ -(^|\.)venchina\.com$ -(^|\.)venetianmacao\.com$ -(^|\.)ventureswell\.com$ -(^|\.)veoh\.com$ -(^|\.)vermonttibet\.org$ -(^|\.)versavpn\.com$ -(^|\.)verybs\.com$ -(^|\.)vevo\.com$ -(^|\.)vft\.com\.tw$ -(^|\.)viber\.com$ -(^|\.)vica\.info$ -(^|\.)victimsofcommunism\.org$ -(^|\.)vid\.me$ -(^|\.)vidble\.com$ -(^|\.)video\.aol\.ca$ -(^|\.)video\.aol\.co\.uk$ -(^|\.)video\.aol\.com$ -(^|\.)video\.ap\.org$ -(^|\.)video\.fdbox\.com$ -(^|\.)video\.foxbusiness\.com$ -(^|\.)video\.pbs\.org$ -(^|\.)video\.yahoo\.com$ -(^|\.)videobam\.com$ -(^|\.)videodetective\.com$ -(^|\.)videomega\.tv$ -(^|\.)videomo\.com$ -(^|\.)videopediaworld\.com$ -(^|\.)videopress\.com$ -(^|\.)vidinfo\.org$ -(^|\.)vietdaikynguyen\.com$ -(^|\.)vijayatemple\.org$ -(^|\.)vimeo\.com$ -(^|\.)vimperator\.org$ -(^|\.)vincnd\.com$ -(^|\.)vine\.co$ -(^|\.)vinniev\.com$ -(^|\.)vip-enterprise\.com$ -(^|\.)visibletweets\.com$ -(^|\.)vital247\.org$ -(^|\.)viu\.com$ -(^|\.)viu\.tv$ -(^|\.)vivahentai4u\.net$ -(^|\.)vivatube\.com$ -(^|\.)vivthomas\.com$ -(^|\.)vizvaz\.com$ -(^|\.)vjmedia\.com\.hk$ -(^|\.)vllcs\.org$ -(^|\.)vlog\.xuite\.net$ -(^|\.)vmixcore\.com$ -(^|\.)vn\.hao123\.com$ -(^|\.)vnet\.link$ -(^|\.)voa-11\.akacast\.akamaistream\.net$ -(^|\.)voacantonese\.com$ -(^|\.)voachinese\.com$ -(^|\.)voachineseblog\.com$ -(^|\.)voagd\.com$ -(^|\.)voanews\.com$ -(^|\.)voatibetan\.com$ -(^|\.)voatibetanenglish\.com$ -(^|\.)vocativ\.com$ -(^|\.)vocn\.tv$ -(^|\.)vod\.wwe\.com$ -(^|\.)vot\.org$ -(^|\.)vovo2000\.com$ -(^|\.)voxer\.com$ -(^|\.)voy\.com$ -(^|\.)vpn\.ac$ -(^|\.)vpn\.cjb\.net$ -(^|\.)vpn\.cmu\.edu$ -(^|\.)vpn\.sv\.cmu\.edu$ -(^|\.)vpn4all\.com$ -(^|\.)vpnaccount\.org$ -(^|\.)vpnaccounts\.com$ -(^|\.)vpnbook\.com$ -(^|\.)vpncomparison\.org$ -(^|\.)vpncoupons\.com$ -(^|\.)vpncup\.com$ -(^|\.)vpndada\.com$ -(^|\.)vpnfan\.com$ -(^|\.)vpnfire\.com$ -(^|\.)vpnforgame\.net$ -(^|\.)vpngate\.jp$ -(^|\.)vpngate\.net$ -(^|\.)vpngratis\.net$ -(^|\.)vpnhq\.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$ -(^|\.)vtunnel\.com$ -(^|\.)vuku\.cc$ -(^|\.)w\.idaiwan\.com$ -(^|\.)w3schools\.com$ -(^|\.)waffle1999\.com$ -(^|\.)wahas\.com$ -(^|\.)waigaobu\.com$ -(^|\.)waikeung\.org$ -(^|\.)wailaike\.net$ -(^|\.)waiwaier\.com$ -(^|\.)wallmama\.com$ -(^|\.)wallornot\.org$ -(^|\.)wallpapercasa\.com$ -(^|\.)wallproxy\.com$ -(^|\.)waltermartin\.com$ -(^|\.)waltermartin\.org$ -(^|\.)wanderinghorse\.net$ -(^|\.)wangafu\.net$ -(^|\.)wangjinbo\.org$ -(^|\.)wanglixiong\.com$ -(^|\.)wango\.org$ -(^|\.)wangruoshui\.net$ -(^|\.)want-daily\.com$ -(^|\.)wanz-factory\.com$ -(^|\.)wapedia\.mobi$ -(^|\.)warbler\.iconfactory\.net$ -(^|\.)waselpro\.com$ -(^|\.)washeng\.net$ -(^|\.)watch8x\.com$ -(^|\.)watchinese\.com$ -(^|\.)watchmygf\.net$ -(^|\.)wattpad\.com$ -(^|\.)wav\.tv$ -(^|\.)waveprotocol\.org$ -(^|\.)waymo\.com$ -(^|\.)wda\.gov\.tw$ -(^|\.)wdf5\.com$ -(^|\.)wearehairy\.com$ -(^|\.)wearn\.com$ -(^|\.)web2project\.net$ -(^|\.)webbang\.net$ -(^|\.)webevader\.org$ -(^|\.)webfreer\.com$ -(^|\.)webjb\.org$ -(^|\.)weblagu\.com$ -(^|\.)webmproject\.org$ -(^|\.)webrtc\.org$ -(^|\.)webrush\.net$ -(^|\.)webs-tv\.net$ -(^|\.)website\.informer\.com$ -(^|\.)websitepulse\.com$ -(^|\.)webwarper\.net$ -(^|\.)webworkerdaily\.com$ -(^|\.)weekmag\.info$ -(^|\.)wefightcensorship\.org$ -(^|\.)wefong\.com$ -(^|\.)weiboleak\.com$ -(^|\.)weiboscope\.jmsc\.hku\.hk$ -(^|\.)weihuo\.org$ -(^|\.)weijingsheng\.org$ -(^|\.)weiming\.info$ -(^|\.)weiquanwang\.org$ -(^|\.)weisuo\.ws$ -(^|\.)welovecock\.com$ -(^|\.)wemigrate\.org$ -(^|\.)wengewang\.com$ -(^|\.)wengewang\.org$ -(^|\.)wenhui\.ch$ -(^|\.)wenxuecity\.com$ -(^|\.)wenyunchao\.com$ -(^|\.)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\.net$ -(^|\.)wheatseeds\.org$ -(^|\.)wheelockslatin\.com$ -(^|\.)whereiswerner\.com$ -(^|\.)wheretowatch\.com$ -(^|\.)whippedass\.com$ -(^|\.)whitebear\.freebearblog\.org$ -(^|\.)whodns\.xyz$ -(^|\.)whoer\.net$ -(^|\.)whotalking\.com$ -(^|\.)whylover\.com$ -(^|\.)whyx\.org$ -(^|\.)widevine\.com$ -(^|\.)wikaba\.com$ -(^|\.)wiki\.cnitter\.com$ -(^|\.)wiki\.esu\.im$ -(^|\.)wiki\.gamerp\.jp$ -(^|\.)wiki\.jqueryui\.com$ -(^|\.)wiki\.keso\.cn$ -(^|\.)wiki\.moegirl\.org$ -(^|\.)wiki\.oauth\.net$ -(^|\.)wiki\.phonegap\.com$ -(^|\.)wikileaks-forum\.com$ -(^|\.)wikileaks\.ch$ -(^|\.)wikileaks\.com$ -(^|\.)wikileaks\.de$ -(^|\.)wikileaks\.eu$ -(^|\.)wikileaks\.lu$ -(^|\.)wikileaks\.org$ -(^|\.)wikileaks\.pl$ -(^|\.)wikilivres\.info$ -(^|\.)wikimapia\.org$ -(^|\.)wikiwiki\.jp$ -(^|\.)wildammo\.com$ -(^|\.)willw\.net$ -(^|\.)windowsphoneme\.com$ -(^|\.)windscribe\.com$ -(^|\.)wingamestore\.com$ -(^|\.)wingy\.site$ -(^|\.)winning11\.com$ -(^|\.)winwhispers\.info$ -(^|\.)wire\.com$ -(^|\.)wiredbytes\.com$ -(^|\.)wiredpen\.com$ -(^|\.)wisdompubs\.org$ -(^|\.)wisevid\.com$ -(^|\.)withgoogle\.com$ -(^|\.)withyoutube\.com$ -(^|\.)witnessleeteaching\.com$ -(^|\.)witopia\.net$ -(^|\.)wizcrafts\.net$ -(^|\.)wjbk\.org$ -(^|\.)wlcnew\.jigsy\.com$ -(^|\.)wlx\.sowiki\.net$ -(^|\.)wn\.com$ -(^|\.)wnacg\.com$ -(^|\.)wnacg\.org$ -(^|\.)wo\.tc$ -(^|\.)wo3ttt\.wordpress\.com$ -(^|\.)woeser\.com$ -(^|\.)woesermiddle-way\.net$ -(^|\.)wokar\.org$ -(^|\.)wolfax\.com$ -(^|\.)woolyss\.com$ -(^|\.)woopie\.jp$ -(^|\.)woopie\.tv$ -(^|\.)wordpress\.com$ -(^|\.)workatruna\.com$ -(^|\.)workerdemo\.org\.hk$ -(^|\.)workersthebig\.net$ -(^|\.)worldcat\.org$ -(^|\.)worldjournal\.com$ -(^|\.)worldvpn\.net$ -(^|\.)wow-life\.net$ -(^|\.)wow\.com$ -(^|\.)wowgirls\.com$ -(^|\.)wowlegacy\.ml$ -(^|\.)wowporn\.com$ -(^|\.)wowrk\.com$ -(^|\.)woxinghuiguo\.com$ -(^|\.)woyaolian\.org$ -(^|\.)wozy\.in$ -(^|\.)wp\.com$ -(^|\.)wpoforum\.com$ -(^|\.)wqyd\.org$ -(^|\.)wrchina\.org$ -(^|\.)wretch\.cc$ -(^|\.)writer\.zoho\.com$ -(^|\.)wsgzao\.github\.io$ -(^|\.)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$ -(^|\.)wuu\.wikipedia\.org$ -(^|\.)wuw\.red$ -(^|\.)wuyanblog\.com$ -(^|\.)wwitv\.com$ -(^|\.)www\.ajsands\.com$ -(^|\.)www\.americorps\.gov$ -(^|\.)www\.antd\.org$ -(^|\.)www\.aolnews\.com$ -(^|\.)www\.businessinsider\.com\.au$ -(^|\.)www\.citizenlab\.org$ -(^|\.)www\.cmoinc\.org$ -(^|\.)www\.cool18\.com$ -(^|\.)www\.dmm\.com$ -(^|\.)www\.dwheeler\.com$ -(^|\.)www\.eastturkistan\.net$ -(^|\.)www\.ftchinese\.com$ -(^|\.)www\.gmiddle\.com$ -(^|\.)www\.gmiddle\.net$ -(^|\.)www\.hustlercash\.com$ -(^|\.)www\.idlcoyote\.com$ -(^|\.)www\.imdb\.com$ -(^|\.)www\.kindleren\.com$ -(^|\.)www\.klip\.me$ -(^|\.)www\.lamenhu\.com$ -(^|\.)www\.lib\.virginia\.edu$ -(^|\.)www\.linksalpha\.com$ -(^|\.)www\.m-sport\.co\.uk$ -(^|\.)www\.metro\.taipei$ -(^|\.)www\.monlamit\.org$ -(^|\.)www\.moztw\.org$ -(^|\.)www\.nbc\.com$ -(^|\.)www\.orchidbbs\.com$ -(^|\.)www\.owind\.com$ -(^|\.)www\.oxid\.it$ -(^|\.)www\.powerpointninja\.com$ -(^|\.)www\.s4miniarchive\.com$ -(^|\.)www\.sciencemag\.org$ -(^|\.)www\.shadowsocks\.com$ -(^|\.)www\.shwchurch\.org$ -(^|\.)www\.skype\.com$ -(^|\.)www\.tablesgenerator\.com$ -(^|\.)www\.taiwanonline\.cc$ -(^|\.)www\.taup\.org\.tw$ -(^|\.)www\.thechinastory\.org$ -(^|\.)www\.wan-press\.org$ -(^|\.)www\.wangruowang\.org$ -(^|\.)www\.websnapr\.com$ -(^|\.)www\.zensur\.freerk\.com$ -(^|\.)www1\.american\.edu$ -(^|\.)www1\.biz$ -(^|\.)www2\.ohchr\.org$ -(^|\.)www2\.rocketbbs\.com$ -(^|\.)wwwhost\.biz$ -(^|\.)wzyboy\.im$ -(^|\.)x-art\.com$ -(^|\.)x-berry\.com$ -(^|\.)x-wall\.org$ -(^|\.)x\.company$ -(^|\.)x1949x\.com$ -(^|\.)x24hr\.com$ -(^|\.)x365x\.com$ -(^|\.)xa\.yimg\.com$ -(^|\.)xanga\.com$ -(^|\.)xbabe\.com$ -(^|\.)xbookcn\.com$ -(^|\.)xcafe\.in$ -(^|\.)xcity\.jp$ -(^|\.)xcritic\.com$ -(^|\.)xerotica\.com$ -(^|\.)xfinity\.com$ -(^|\.)xfm\.pp\.ru$ -(^|\.)xgmyd\.com$ -(^|\.)xhamster\.com$ -(^|\.)xianchawang\.net$ -(^|\.)xianjian\.tw$ -(^|\.)xianqiao\.net$ -(^|\.)xiaobaiwu\.com$ -(^|\.)xiaochuncnjp\.com$ -(^|\.)xiaod\.in$ -(^|\.)xiaohexie\.com$ -(^|\.)xiaolan\.me$ -(^|\.)xiaoma\.org$ -(^|\.)xiezhua\.com$ -(^|\.)xihua\.es$ -(^|\.)xing\.com$ -(^|\.)xinhuanet\.org$ -(^|\.)xinmiao\.com\.hk$ -(^|\.)xinqimeng\.over-blog\.com$ -(^|\.)xinsheng\.net$ -(^|\.)xinshijue\.com$ -(^|\.)xinyubbs\.net$ -(^|\.)xiongpian\.com$ -(^|\.)xiuren\.org$ -(^|\.)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--czq75pvv1aj5c\.org$ -(^|\.)xn--i2ru8q2qg\.com$ -(^|\.)xn--ngstr-lra8j\.com$ -(^|\.)xn--p8j9a0d9c9a\.xn--q9jyb4c$ -(^|\.)xnxx\.com$ -(^|\.)xpdo\.net$ -(^|\.)xpud\.org$ -(^|\.)xrentdvd\.com$ -(^|\.)xskywalker\.com$ -(^|\.)xskywalker\.net$ -(^|\.)xtube\.com$ -(^|\.)xuchao\.net$ -(^|\.)xuchao\.org$ -(^|\.)xuehua\.us$ -(^|\.)xuzhiyong\.net$ -(^|\.)xvideo\.cc$ -(^|\.)xvideos\.com$ -(^|\.)xvideos\.es$ -(^|\.)xxbbx\.com$ -(^|\.)xxlmovies\.com$ -(^|\.)xxuz\.com$ -(^|\.)xxx\.com$ -(^|\.)xxx\.xxx$ -(^|\.)xxxfuckmom\.com$ -(^|\.)xxxx\.com\.au$ -(^|\.)xxxy\.biz$ -(^|\.)xxxy\.info$ -(^|\.)xxxymovies\.com$ -(^|\.)xys\.dxiong\.com$ -(^|\.)xys\.org$ -(^|\.)xysblogs\.org$ -(^|\.)xyy69\.com$ -(^|\.)xyy69\.info$ -(^|\.)yahoo\.com\.hk$ -(^|\.)yakbutterblues\.com$ -(^|\.)yam\.com$ -(^|\.)yam\.org\.tw$ -(^|\.)yanghengjun\.com$ -(^|\.)yangjianli\.com$ -(^|\.)yasni\.co\.uk$ -(^|\.)yayabay\.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$ -(^|\.)yilubbs\.com$ -(^|\.)yingsuoss\.com$ -(^|\.)yinlei\.org$ -(^|\.)yipub\.com$ -(^|\.)yizhihongxing\.com$ -(^|\.)yobt\.com$ -(^|\.)yobt\.tv$ -(^|\.)yogichen\.org$ -(^|\.)yong\.hu$ -(^|\.)yorkbbs\.ca$ -(^|\.)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$ -(^|\.)youthnetradio\.org$ -(^|\.)youtu\.be$ -(^|\.)youtube-nocookie\.com$ -(^|\.)youtube\.com$ -(^|\.)youtubecn\.com$ -(^|\.)youtubeeducation\.com$ -(^|\.)youtubegaming\.com$ -(^|\.)youversion\.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$ -(^|\.)yzzk\.com$ -(^|\.)zacebook\.com$ -(^|\.)zalmos\.com$ -(^|\.)zannel\.com$ -(^|\.)zaobao\.com\.sg$ -(^|\.)zaozon\.com$ -(^|\.)zapto\.org$ -(^|\.)zattoo\.com$ -(^|\.)zdnet\.com\.tw$ -(^|\.)zello\.com$ -(^|\.)zengjinyan\.org$ -(^|\.)zenmate\.com$ -(^|\.)zenmate\.com\.ru$ -(^|\.)zeronet\.io$ -(^|\.)zeutch\.com$ -(^|\.)zfreet\.com$ -(^|\.)zgsddh\.com$ -(^|\.)zgzcjj\.net$ -(^|\.)zh-yue\.wikipedia\.org$ -(^|\.)zh\.ecdm\.wikia\.com$ -(^|\.)zh\.m\.wikipedia\.org$ -(^|\.)zh\.pokerstrategy\.com$ -(^|\.)zh\.uncyclopedia\.wikia\.com$ -(^|\.)zh\.wikinews\.org$ -(^|\.)zh\.wikipedia\.org$ -(^|\.)zh\.wikisource\.org$ -(^|\.)zhanbin\.net$ -(^|\.)zhangboli\.net$ -(^|\.)zhangtianliang\.com$ -(^|\.)zhanlve\.org$ -(^|\.)zhao\.1984\.city$ -(^|\.)zhao\.jinhai\.de$ -(^|\.)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$ -(^|\.)ziddu\.com$ -(^|\.)zillionk\.com$ -(^|\.)zim\.vn$ -(^|\.)zinio\.com$ -(^|\.)ziporn\.com$ -(^|\.)zippyshare\.com$ -(^|\.)zkaip\.com$ -(^|\.)zmw\.cn$ -(^|\.)zodgame\.us$ -(^|\.)zomobo\.net$ -(^|\.)zonaeuropa\.com$ -(^|\.)zonghexinwen\.com$ -(^|\.)zonghexinwen\.net$ -(^|\.)zoogvpn\.com$ -(^|\.)zootool\.com$ -(^|\.)zoozle\.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$ -(^|\.)zyzc9\.com$ -(^|\.)zzcartoon\.com$ -(^|\.)zzux\.com$ diff --git a/client/android/shadowsocks/src/main/assets/acl/bypass-lan.acl b/client/android/shadowsocks/src/main/assets/acl/bypass-lan.acl deleted file mode 100644 index df9a21da0..000000000 --- a/client/android/shadowsocks/src/main/assets/acl/bypass-lan.acl +++ /dev/null @@ -1,17 +0,0 @@ -[proxy_all] - -[bypass_list] -0.0.0.0/8 -10.0.0.0/8 -100.64.0.0/10 -127.0.0.0/8 -169.254.0.0/16 -172.16.0.0/12 -192.0.0.0/29 -192.0.2.0/24 -192.88.99.0/24 -192.168.0.0/16 -198.18.0.0/15 -198.51.100.0/24 -203.0.113.0/24 -224.0.0.0/3 diff --git a/client/android/shadowsocks/src/main/assets/acl/china-list.acl b/client/android/shadowsocks/src/main/assets/acl/china-list.acl deleted file mode 100644 index 4d76a47ca..000000000 --- a/client/android/shadowsocks/src/main/assets/acl/china-list.acl +++ /dev/null @@ -1,5245 +0,0 @@ -[bypass_all] - -[proxy_list] -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.32.0/19 -8.208.64.0/18 -8.208.128.0/17 -8.209.0.0/16 -8.210.0.0/15 -8.212.0.0/14 -8.216.0.0/13 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.60.0/22 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.251.240.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -65.55.60.184/30 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.119.200.0/22 -103.119.224.0/22 -103.120.52.0/22 -103.120.72.0/22 -103.120.76.0/24 -103.120.88.0/22 -103.120.96.0/21 -103.120.140.0/22 -103.120.196.0/22 -103.120.224.0/22 -103.121.52.0/22 -103.121.92.0/22 -103.121.160.0/21 -103.121.250.0/24 -103.121.252.0/22 -103.129.52.0/22 -103.129.148.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.197.104.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -130.214.218.0/23 -131.228.96.0/24 -131.253.12.0/29 -131.253.12.80/28 -131.253.12.240/29 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -147.243.13.32/27 -147.243.13.64/27 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.158.0.0/16 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.32.136.0/21 -152.32.144.0/20 -152.32.160.0/19 -152.32.192.0/18 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -188.65.16.0/22 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.1.0/24 -202.95.2.0/23 -202.95.4.0/22 -202.95.8.0/21 -202.95.16.0/20 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 diff --git a/client/android/shadowsocks/src/main/assets/acl/gfwlist.acl b/client/android/shadowsocks/src/main/assets/acl/gfwlist.acl deleted file mode 100644 index 2567a2642..000000000 --- a/client/android/shadowsocks/src/main/assets/acl/gfwlist.acl +++ /dev/null @@ -1,5492 +0,0 @@ -# -# GFW list from https://github.com/gfwlist/gfwlist/blob/master/gfwlist.txt -# updated on 2019-02-21 -# - -[bypass_all] - -[proxy_list] -# Telegram IPs$ -91.108.4.0/22 -91.108.8.0/21 -91.108.16.0/21 -91.108.36.0/22 -91.108.56.0/22 -109.239.140.0/24 -149.154.160.0/20 - -1.1.1.1 -14.102.250.18 -14.102.250.19 -174.142.105.153 -50.7.31.230 -67.220.91.15 -67.220.91.18 -67.220.91.23 -69.65.19.160 -72.52.81.22 -85.17.73.31 -(^|\.)030buy\.com$ -(^|\.)0rz\.tw$ -(^|\.)1-apple\.com\.tw$ -(^|\.)10\.tt$ -(^|\.)1000giri\.net$ -(^|\.)100ke\.org$ -(^|\.)10conditionsoflove\.com$ -(^|\.)10musume\.com$ -(^|\.)123rf\.com$ -(^|\.)12bet\.com$ -(^|\.)12vpn\.com$ -(^|\.)12vpn\.net$ -(^|\.)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$ -(^|\.)1984bbs\.com$ -(^|\.)1984bbs\.org$ -(^|\.)1989report\.hkja\.org\.hk$ -(^|\.)1991way\.com$ -(^|\.)1998cdp\.org$ -(^|\.)1bao\.org$ -(^|\.)1dumb\.com$ -(^|\.)1e100\.net$ -(^|\.)1eew\.com$ -(^|\.)1mobile\.com$ -(^|\.)1pondo\.tv$ -(^|\.)2-hand\.info$ -(^|\.)2000fun\.com$ -(^|\.)2008xianzhang\.info$ -(^|\.)2017\.hk$ -(^|\.)21andy\.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$ -(^|\.)43110\.cf$ -(^|\.)466453\.com$ -(^|\.)4bluestones\.biz$ -(^|\.)4chan\.com$ -(^|\.)4dq\.com$ -(^|\.)4everproxy\.com$ -(^|\.)4irc\.com$ -(^|\.)4mydomain\.com$ -(^|\.)4pu\.com$ -(^|\.)4rbtv\.com$ -(^|\.)4shared\.com$ -(^|\.)51\.ca$ -(^|\.)51jav\.org$ -(^|\.)51luoben\.com$ -(^|\.)5278\.cc$ -(^|\.)5299\.tv$ -(^|\.)56cun04\.jigsy\.com$ -(^|\.)5aimiku\.com$ -(^|\.)5i01\.com$ -(^|\.)5isotoi5\.org$ -(^|\.)5maodang\.com$ -(^|\.)63i\.com$ -(^|\.)64memo$ -(^|\.)64museum\.org$ -(^|\.)64tianwang\.com$ -(^|\.)64wiki\.com$ -(^|\.)66\.ca$ -(^|\.)666kb\.com$ -(^|\.)6park\.com$ -(^|\.)6parker\.com$ -(^|\.)7capture\.com$ -(^|\.)7cow\.com$ -(^|\.)8-d\.com$ -(^|\.)85cc\.net$ -(^|\.)85cc\.us$ -(^|\.)85st\.com$ -(^|\.)881903\.com$ -(^|\.)888\.com$ -(^|\.)888poker\.com$ -(^|\.)89-64\.org$ -(^|\.)89\.64\.charter\.constitutionalism\.solutions$ -(^|\.)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$ -(^|\.)a-normal-day\.com$ -(^|\.)a248\.e\.akamai\.net$ -(^|\.)a5\.com\.ru$ -(^|\.)aamacau\.com$ -(^|\.)abc\.com$ -(^|\.)abc\.net\.au$ -(^|\.)abc\.pp\.ru$ -(^|\.)abc\.xyz$ -(^|\.)abchinese\.com$ -(^|\.)abclite\.net$ -(^|\.)abebooks\.com$ -(^|\.)abematv\.akamaized\.net$ -(^|\.)abitno\.linpie\.com$ -(^|\.)ablwang\.com$ -(^|\.)aboluowang\.com$ -(^|\.)aboutgfw\.com$ -(^|\.)abs\.edu$ -(^|\.)ac\.jiruan\.net$ -(^|\.)accim\.org$ -(^|\.)aceros-de-hispania\.com$ -(^|\.)acevpn\.com$ -(^|\.)acg18\.me$ -(^|\.)acgkj\.com$ -(^|\.)acmedia365\.com$ -(^|\.)acmetoy\.com$ -(^|\.)acnw\.com\.au$ -(^|\.)actfortibet\.org$ -(^|\.)actimes\.com\.au$ -(^|\.)activpn\.com$ -(^|\.)aculo\.us$ -(^|\.)adcex\.com$ -(^|\.)addictedtocoffee\.de$ -(^|\.)adelaidebbs\.com$ -(^|\.)admin\.recaptcha\.net$ -(^|\.)admob\.com$ -(^|\.)adpl\.org\.hk$ -(^|\.)ads-twitter\.com$ -(^|\.)adsense\.com$ -(^|\.)adult-sex-games\.com$ -(^|\.)adult\.friendfinder\.com$ -(^|\.)adultfriendfinder\.com$ -(^|\.)adultkeep\.net$ -(^|\.)advanscene\.com$ -(^|\.)advertfan\.com$ -(^|\.)ae\.hao123\.com$ -(^|\.)ae\.org$ -(^|\.)aenhancers\.com$ -(^|\.)aex\.com$ -(^|\.)af\.mil$ -(^|\.)afantibbs\.com$ -(^|\.)agnesb\.fr$ -(^|\.)agoogleaday\.com$ -(^|\.)agro\.hk$ -(^|\.)ahr0chm6ly95zwnslm5lda$ -(^|\.)ai-kan\.net$ -(^|\.)ai-wen\.net$ -(^|\.)ai\.binwang\.me$ -(^|\.)ai\.google$ -(^|\.)aiph\.net$ -(^|\.)airasia\.com$ -(^|\.)airconsole\.com$ -(^|\.)airvpn\.org$ -(^|\.)aisex\.com$ -(^|\.)ait\.org\.tw$ -(^|\.)aiweiwei\.com$ -(^|\.)aiweiweiblog\.com$ -(^|\.)akademiye\.org$ -(^|\.)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$ -(^|\.)alkasir\.com$ -(^|\.)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$ -(^|\.)ameblo\.jp$ -(^|\.)americangreencard\.com$ -(^|\.)americanunfinished\.com$ -(^|\.)amiblockedornot\.com$ -(^|\.)amigobbs\.net$ -(^|\.)amitabhafoundation\.us$ -(^|\.)amnesty\.org$ -(^|\.)amnesty\.org\.hk$ -(^|\.)amnesty\.tw$ -(^|\.)amnestyusa\.org$ -(^|\.)amnyemachen\.org$ -(^|\.)amoiist\.com$ -(^|\.)ampproject\.org$ -(^|\.)amtb-taipei\.org$ -(^|\.)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$ -(^|\.)animeshippuuden\.com$ -(^|\.)aniscartujo\.com$ -(^|\.)annatam\.com$ -(^|\.)anobii\.com$ -(^|\.)anontext\.com$ -(^|\.)anonymise\.us$ -(^|\.)anonymitynetwork\.com$ -(^|\.)anonymizer\.com$ -(^|\.)anpopo\.com$ -(^|\.)answering-islam\.org$ -(^|\.)anthonycalzadilla\.com$ -(^|\.)anti1984\.com$ -(^|\.)antichristendom\.com$ -(^|\.)antiwave\.net$ -(^|\.)anyporn\.com$ -(^|\.)anysex\.com$ -(^|\.)aobo\.com\.au$ -(^|\.)aofriend\.com$ -(^|\.)aofriend\.com\.au$ -(^|\.)aojiao\.org$ -(^|\.)aolchannels\.aol\.com$ -(^|\.)aomiwang\.com$ -(^|\.)apartmentratings\.com$ -(^|\.)apartments\.com$ -(^|\.)apetube\.com$ -(^|\.)api-secure\.recaptcha\.net$ -(^|\.)api-verify\.recaptcha\.net$ -(^|\.)api\.ai$ -(^|\.)api\.dropboxapi\.com$ -(^|\.)api\.linksalpha\.com$ -(^|\.)api\.proxlet\.com$ -(^|\.)api\.pureapk\.com$ -(^|\.)api\.recaptcha\.net$ -(^|\.)apiary\.io$ -(^|\.)apidocs\.linksalpha\.com$ -(^|\.)apigee\.com$ -(^|\.)apk-dl\.com$ -(^|\.)apkdler\.com$ -(^|\.)apkmirror\.com$ -(^|\.)apkmonk\.com$ -(^|\.)apkplz\.com$ -(^|\.)apkpure\.com$ -(^|\.)aplusvpn\.com$ -(^|\.)app\.box\.com$ -(^|\.)app\.heywire\.com$ -(^|\.)app\.smartmailcloud\.com$ -(^|\.)app\.tutanota\.com$ -(^|\.)appdownloader\.net$ -(^|\.)appledaily\.com$ -(^|\.)appledaily\.com\.hk$ -(^|\.)appledaily\.com\.tw$ -(^|\.)appshopper\.com$ -(^|\.)appsocks\.net$ -(^|\.)appspot\.com$ -(^|\.)appsto\.re$ -(^|\.)aptoide\.com$ -(^|\.)ar\.hao123\.com$ -(^|\.)archive\.fo$ -(^|\.)archive\.is$ -(^|\.)archive\.li$ -(^|\.)archive\.org$ -(^|\.)archive\.today$ -(^|\.)archives\.gov$ -(^|\.)archives\.gov\.tw$ -(^|\.)arctosia\.com$ -(^|\.)areca-backup\.org$ -(^|\.)arena\.taipei$ -(^|\.)arethusa\.su$ -(^|\.)arlingtoncemetery\.mil$ -(^|\.)army\.mil$ -(^|\.)art4tibet1998\.org$ -(^|\.)arte\.tv$ -(^|\.)artofpeacefoundation\.org$ -(^|\.)artsy\.net$ -(^|\.)asacp\.org$ -(^|\.)asdfg\.jp$ -(^|\.)asg\.to$ -(^|\.)asia-gaming\.com$ -(^|\.)asiaharvest\.org$ -(^|\.)asianews\.it$ -(^|\.)asiansexdiary\.com$ -(^|\.)asianspiss\.com$ -(^|\.)asianwomensfilm\.de$ -(^|\.)asiatgp\.com$ -(^|\.)asiatoday\.us$ -(^|\.)askstudent\.com$ -(^|\.)askynz\.net$ -(^|\.)assembla\.com$ -(^|\.)assets\.bwbx\.io$ -(^|\.)assimp\.org$ -(^|\.)astrill\.com$ -(^|\.)atc\.org\.au$ -(^|\.)atchinese\.com$ -(^|\.)atdmt\.com$ -(^|\.)atgfw\.org$ -(^|\.)athenaeizou\.com$ -(^|\.)atlanta168\.com$ -(^|\.)atlaspost\.com$ -(^|\.)atnext\.com$ -(^|\.)authorizeddns\.net$ -(^|\.)authorizeddns\.org$ -(^|\.)authorizeddns\.us$ -(^|\.)autodraw\.com$ -(^|\.)av-e-body\.com$ -(^|\.)av\.com$ -(^|\.)av\.movie$ -(^|\.)av\.nightlife141\.com$ -(^|\.)avaaz\.org$ -(^|\.)avbody\.tv$ -(^|\.)avcity\.tv$ -(^|\.)avcool\.com$ -(^|\.)avdb\.in$ -(^|\.)avdb\.tv$ -(^|\.)avfantasy\.com$ -(^|\.)avgle\.com$ -(^|\.)avidemux\.org$ -(^|\.)avmo\.pw$ -(^|\.)avmoo\.com$ -(^|\.)avmoo\.net$ -(^|\.)avmoo\.pw$ -(^|\.)avoision\.com$ -(^|\.)avyahoo\.com$ -(^|\.)axureformac\.com$ -(^|\.)azerbaycan\.tv$ -(^|\.)azerimix\.com$ -(^|\.)azubu\.tv$ -(^|\.)b0ne\.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$ -(^|\.)bandwagonhost\.com$ -(^|\.)bangbrosnetwork\.com$ -(^|\.)bangchen\.net$ -(^|\.)bangdream\.space$ -(^|\.)bangyoulater\.com$ -(^|\.)bankmobilevibe\.com$ -(^|\.)bannedbook\.org$ -(^|\.)bannednews\.org$ -(^|\.)banorte\.com$ -(^|\.)baramangaonline\.com$ -(^|\.)barenakedislam\.com$ -(^|\.)barnabu\.co\.uk$ -(^|\.)bartvpn\.com$ -(^|\.)bash-hackers\.org$ -(^|\.)bastillepost\.com$ -(^|\.)bayvoice\.net$ -(^|\.)bb-chat\.tv$ -(^|\.)bb\.ttv\.com\.tw$ -(^|\.)bbc\.co\.uk$ -(^|\.)bbc\.com$ -(^|\.)bbc\.in$ -(^|\.)bbcchinese\.com$ -(^|\.)bbchat\.tv$ -(^|\.)bbci\.co\.uk$ -(^|\.)bbg\.gov$ -(^|\.)bbkz\.com$ -(^|\.)bbnradio\.org$ -(^|\.)bbs-tw\.com$ -(^|\.)bbs\.brockbbs\.com$ -(^|\.)bbs\.cantonese\.asia$ -(^|\.)bbs\.ecstart\.com$ -(^|\.)bbs\.hanminzu\.org$ -(^|\.)bbs\.hasi\.wang$ -(^|\.)bbs\.huasing\.org$ -(^|\.)bbs\.junglobal\.net$ -(^|\.)bbs\.kimy\.com\.tw$ -(^|\.)bbs\.mikocon\.com$ -(^|\.)bbs\.morbell\.com$ -(^|\.)bbs\.mychat\.to$ -(^|\.)bbs\.netbig\.com$ -(^|\.)bbs\.ozchinese\.com$ -(^|\.)bbs\.qmzdd\.com$ -(^|\.)bbs\.sina\.com$ -(^|\.)bbs\.sina\.com%2f$ -(^|\.)bbs\.skykiwi\.com$ -(^|\.)bbs\.sou-tong\.org$ -(^|\.)bbs\.tuitui\.info$ -(^|\.)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$ -(^|\.)beijingspring\.com$ -(^|\.)beijingzx\.org$ -(^|\.)belamionline\.com$ -(^|\.)bell\.wiki$ -(^|\.)bemywife\.cc$ -(^|\.)beric\.me$ -(^|\.)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$ -(^|\.)big\.one$ -(^|\.)bigfools\.com$ -(^|\.)bigjapanesesex\.com$ -(^|\.)bigmoney\.biz$ -(^|\.)bignews\.org$ -(^|\.)bigsound\.org$ -(^|\.)biliworld\.com$ -(^|\.)billypan\.com$ -(^|\.)binance\.com$ -(^|\.)binux\.me$ -(^|\.)bipic\.net$ -(^|\.)bird\.so$ -(^|\.)bit-z\.com$ -(^|\.)bit\.do$ -(^|\.)bit\.ly$ -(^|\.)bitc\.bme\.emory\.edu$ -(^|\.)bitcointalk\.org$ -(^|\.)bitcoinworld\.com$ -(^|\.)bitfinex\.com$ -(^|\.)bithumb\.com$ -(^|\.)bitinka\.com\.ar$ -(^|\.)bitmex\.com$ -(^|\.)bitshare\.com$ -(^|\.)bitsnoop\.com$ -(^|\.)bitvise\.com$ -(^|\.)bizhat\.com$ -(^|\.)bjnewlife\.org$ -(^|\.)bjs\.org$ -(^|\.)bjzc\.org$ -(^|\.)bl-doujinsouko\.com$ -(^|\.)blacklogic\.com$ -(^|\.)blackvpn\.com$ -(^|\.)blewpass\.com$ -(^|\.)blinkx\.com$ -(^|\.)blinw\.com$ -(^|\.)blip\.tv$ -(^|\.)blockcn\.com$ -(^|\.)blockless\.com$ -(^|\.)blog\.calibre-ebook\.com$ -(^|\.)blog\.cnyes\.com$ -(^|\.)blog\.daum\.net$ -(^|\.)blog\.de$ -(^|\.)blog\.exblog\.co\.jp$ -(^|\.)blog\.excite\.co\.jp$ -(^|\.)blog\.expofutures\.com$ -(^|\.)blog\.fizzik\.com$ -(^|\.)blog\.foolsmountain\.com$ -(^|\.)blog\.fuckgfw233\.org$ -(^|\.)blog\.goo\.ne\.jp$ -(^|\.)blog\.google$ -(^|\.)blog\.inoreader\.com$ -(^|\.)blog\.istef\.info$ -(^|\.)blog\.jackjia\.com$ -(^|\.)blog\.jp$ -(^|\.)blog\.kangye\.org$ -(^|\.)blog\.lester850\.info$ -(^|\.)blog\.martinoei\.com$ -(^|\.)blog\.pathtosharepoint\.com$ -(^|\.)blog\.pentalogic\.net$ -(^|\.)blog\.qooza\.hk$ -(^|\.)blog\.ranxiang\.com$ -(^|\.)blog\.sina\.com\.tw$ -(^|\.)blog\.sogoo\.org$ -(^|\.)blog\.soylent\.com$ -(^|\.)blog\.syx86\.cn$ -(^|\.)blog\.syx86\.com$ -(^|\.)blog\.taragana\.com$ -(^|\.)blog\.tiney\.com$ -(^|\.)blog\.xuite\.net$ -(^|\.)blog\.youthwant\.com\.tw$ -(^|\.)blog\.youxu\.info$ -(^|\.)blogblog\.com$ -(^|\.)blogcatalog\.com$ -(^|\.)blogcity\.me$ -(^|\.)blogdns\.org$ -(^|\.)blogger\.com$ -(^|\.)blogimg\.jp$ -(^|\.)bloglines\.com$ -(^|\.)bloglovin\.com$ -(^|\.)blogs\.icerocket\.com$ -(^|\.)blogs\.libraryinformationtechnology\.com$ -(^|\.)blogs\.tampabay\.com$ -(^|\.)blogs\.yahoo\.co\.jp$ -(^|\.)blogspot\.com$ -(^|\.)blogspot\.hk$ -(^|\.)blogspot\.jp$ -(^|\.)blogspot\.tw$ -(^|\.)blogtd\.net$ -(^|\.)blogtd\.org$ -(^|\.)bloodshed\.net$ -(^|\.)bloomberg\.cn$ -(^|\.)bloomberg\.com$ -(^|\.)bloomberg\.de$ -(^|\.)bloombergview\.com$ -(^|\.)bloomfortune\.com$ -(^|\.)blueangellive\.com$ -(^|\.)bmfinn\.com$ -(^|\.)bnews\.co$ -(^|\.)bnn\.co$ -(^|\.)bnrmetal\.com$ -(^|\.)boardreader\.com$ -(^|\.)bod\.asia$ -(^|\.)bodog88\.com$ -(^|\.)bolehvpn\.net$ -(^|\.)bolin\.netfirms\.com$ -(^|\.)bonbonme\.com$ -(^|\.)bonbonsex\.com$ -(^|\.)bonfoundation\.org$ -(^|\.)bongacams\.com$ -(^|\.)boobstagram\.com$ -(^|\.)book\.com\.tw$ -(^|\.)book\.zi5\.me$ -(^|\.)bookepub\.com$ -(^|\.)books\.com\.tw$ -(^|\.)booktopia\.com\.au$ -(^|\.)boomssr\.com$ -(^|\.)bot\.nu$ -(^|\.)botanwang\.com$ -(^|\.)bowenpress\.com$ -(^|\.)boxpn\.com$ -(^|\.)boxun$ -(^|\.)boxun\.com$ -(^|\.)boxun\.tv$ -(^|\.)boxunblog\.com$ -(^|\.)boxunclub\.com$ -(^|\.)boyangu\.com$ -(^|\.)boyfriendtv\.com$ -(^|\.)boysfood\.com$ -(^|\.)boysmaster\.com$ -(^|\.)br\.hao123\.com$ -(^|\.)br\.st$ -(^|\.)brainyquote\.com$ -(^|\.)brandonhutchinson\.com$ -(^|\.)braumeister\.org$ -(^|\.)bravotube\.net$ -(^|\.)brazzers\.com$ -(^|\.)break\.com$ -(^|\.)breakgfw\.com$ -(^|\.)breaking911\.com$ -(^|\.)breakingtweets\.com$ -(^|\.)breakwall\.net$ -(^|\.)briefdream\.com$ -(^|\.)briian\.com$ -(^|\.)brizzly\.com$ -(^|\.)brkmd\.com$ -(^|\.)broadbook\.com$ -(^|\.)broadpressinc\.com$ -(^|\.)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$ -(^|\.)bullog\.org$ -(^|\.)bullogger\.com$ -(^|\.)bunbunhk\.com$ -(^|\.)busayari\.com$ -(^|\.)businessinsider\.com$ -(^|\.)businessweek\.com$ -(^|\.)busu\.org$ -(^|\.)busytrade\.com$ -(^|\.)buugaa\.com$ -(^|\.)buy\.yahoo\.com\.tw$ -(^|\.)buzzhand\.com$ -(^|\.)buzzhand\.net$ -(^|\.)buzzorange\.com$ -(^|\.)bvpn\.com$ -(^|\.)bwgyhw\.com$ -(^|\.)bwh1\.net$ -(^|\.)bwsj\.hk$ -(^|\.)bx\.in\.th$ -(^|\.)bx\.tl$ -(^|\.)bynet\.co\.il$ -(^|\.)c-est-simple\.com$ -(^|\.)c-spanvideo\.org$ -(^|\.)c100tibet\.org$ -(^|\.)c1522\.mooo\.com$ -(^|\.)c2cx\.com$ -(^|\.)cablegatesearch\.net$ -(^|\.)cachinese\.com$ -(^|\.)cacnw\.com$ -(^|\.)cactusvpn\.com$ -(^|\.)cafepress\.com$ -(^|\.)cahr\.org\.tw$ -(^|\.)calameo\.com$ -(^|\.)calebelston\.com$ -(^|\.)calgarychinese\.ca$ -(^|\.)calgarychinese\.com$ -(^|\.)calgarychinese\.net$ -(^|\.)cam4\.com$ -(^|\.)cam4\.jp$ -(^|\.)cam4\.sg$ -(^|\.)camfrog\.com$ -(^|\.)cams\.com$ -(^|\.)cams\.org\.sg$ -(^|\.)canadameet\.com$ -(^|\.)canalporno\.com$ -(^|\.)canyu\.org$ -(^|\.)cao\.im$ -(^|\.)caobian\.info$ -(^|\.)caochangqing\.com$ -(^|\.)cap\.org\.hk$ -(^|\.)carabinasypistolas\.com$ -(^|\.)cardinalkungfoundation\.org$ -(^|\.)carfax\.com$ -(^|\.)cari\.com\.my$ -(^|\.)caribbeancom\.com$ -(^|\.)carmotorshow\.com$ -(^|\.)cartoonmovement\.com$ -(^|\.)casadeltibetbcn\.org$ -(^|\.)casatibet\.org\.mx$ -(^|\.)casino\.williamhill\.com$ -(^|\.)casinobellini\.com$ -(^|\.)casinoking\.com$ -(^|\.)casinoriva\.com$ -(^|\.)castbox\.fm$ -(^|\.)catch22\.net$ -(^|\.)catchgod\.com$ -(^|\.)catfightpayperview\.xxx$ -(^|\.)catholic\.org\.hk$ -(^|\.)catholic\.org\.tw$ -(^|\.)cathvoice\.org\.tw$ -(^|\.)cattt\.com$ -(^|\.)cbc\.ca$ -(^|\.)cbs\.ntu\.edu\.tw$ -(^|\.)cbsnews\.com$ -(^|\.)cbtc\.org\.hk$ -(^|\.)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$ -(^|\.)cdn$ -(^|\.)cdn-apple\.com$ -(^|\.)cdn-images\.mailchimp\.com$ -(^|\.)cdn\.assets\.lfpcontent\.com$ -(^|\.)cdn\.helixstudios\.net$ -(^|\.)cdn\.printfriendly\.com$ -(^|\.)cdn\.seatguru\.com$ -(^|\.)cdn\.softlayer\.net$ -(^|\.)cdn1\.lp\.saboom\.com$ -(^|\.)cdnews\.com\.tw$ -(^|\.)cdninstagram\.com$ -(^|\.)cdp1989\.org$ -(^|\.)cdp1998\.org$ -(^|\.)cdp2006\.org$ -(^|\.)cdpa\.url\.tw$ -(^|\.)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$ -(^|\.)certificate\.revocationcheck\.com$ -(^|\.)cfhks\.org\.hk$ -(^|\.)cfos\.de$ -(^|\.)cftfc\.com$ -(^|\.)cgdepot\.org$ -(^|\.)cgst\.edu$ -(^|\.)ch\.shvoong\.com$ -(^|\.)change\.org$ -(^|\.)changeip\.name$ -(^|\.)changeip\.net$ -(^|\.)changeip\.org$ -(^|\.)changp\.com$ -(^|\.)changsa\.net$ -(^|\.)channel8news\.sg$ -(^|\.)chaoex\.com$ -(^|\.)chapm25\.com$ -(^|\.)chatnook\.com$ -(^|\.)chaturbate\.com$ -(^|\.)chengmingmag\.com$ -(^|\.)chenguangcheng\.com$ -(^|\.)chenpokong\.com$ -(^|\.)chenpokong\.net$ -(^|\.)chenshan20042005\.wordpress\.com$ -(^|\.)cherrysave\.com$ -(^|\.)chhongbi\.org$ -(^|\.)chicagoncmtv\.com$ -(^|\.)china-mmm\.jp\.net$ -(^|\.)china-mmm\.net$ -(^|\.)china-mmm\.sa\.com$ -(^|\.)china-review\.com\.ua$ -(^|\.)china-week\.com$ -(^|\.)china\.hket\.com$ -(^|\.)china\.ucanews\.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$ -(^|\.)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$ -(^|\.)chinaview\.wordpress\.com$ -(^|\.)chinaway\.org$ -(^|\.)chinaworker\.info$ -(^|\.)chinaxchina\.com$ -(^|\.)chinayouth\.org\.hk$ -(^|\.)chinayuanmin\.org$ -(^|\.)chinese-hermit\.net$ -(^|\.)chinese-leaders\.org$ -(^|\.)chinese-memorial\.org$ -(^|\.)chinese\.donga\.com$ -(^|\.)chinese\.engadget\.com$ -(^|\.)chinese\.irib\.ir$ -(^|\.)chinese\.soifind\.com$ -(^|\.)chinesedaily\.com$ -(^|\.)chinesedailynews\.com$ -(^|\.)chinesedemocracy\.com$ -(^|\.)chinesegay\.org$ -(^|\.)chinesen\.de$ -(^|\.)chinesenews\.net\.au$ -(^|\.)chinesepen\.org$ -(^|\.)chinesetalks\.net$ -(^|\.)chineseupress\.com$ -(^|\.)chingcheong\.com$ -(^|\.)chinman\.net$ -(^|\.)chithu\.org$ -(^|\.)chn\.chosun\.com$ -(^|\.)chobit\.cc$ -(^|\.)chrdnet\.com$ -(^|\.)christianfreedom\.org$ -(^|\.)christianstudy\.com$ -(^|\.)christiantimes\.org\.hk$ -(^|\.)christusrex\.org$ -(^|\.)chrlawyers\.hk$ -(^|\.)chrome\.com$ -(^|\.)chromecast\.com$ -(^|\.)chromeexperiments\.com$ -(^|\.)chromercise\.com$ -(^|\.)chromestatus\.com$ -(^|\.)chromium\.org$ -(^|\.)chuang-yen\.org$ -(^|\.)chubold\.com$ -(^|\.)chubun\.com$ -(^|\.)chuizi\.net$ -(^|\.)churchinhongkong\.org$ -(^|\.)chushigangdrug\.ch$ -(^|\.)cienen\.com$ -(^|\.)cineastentreff\.de$ -(^|\.)cipfg\.org$ -(^|\.)circlethebayfortibet\.org$ -(^|\.)cirosantilli\.com$ -(^|\.)citizencn\.com$ -(^|\.)citizenlab\.org$ -(^|\.)citizenscommission\.hk$ -(^|\.)citizensradio\.org$ -(^|\.)city365\.ca$ -(^|\.)city9x\.com$ -(^|\.)citypopulation\.de$ -(^|\.)citytalk\.tw$ -(^|\.)civicparty\.hk$ -(^|\.)civildisobediencemovement\.org$ -(^|\.)civilhrfront\.org$ -(^|\.)civiliangunner\.com$ -(^|\.)civilmedia\.tw$ -(^|\.)ck101\.com$ -(^|\.)cl\.d0z\.net$ -(^|\.)clarionproject\.org$ -(^|\.)classicalguitarblog\.net$ -(^|\.)clb\.org\.hk$ -(^|\.)cldr\.unicode\.org$ -(^|\.)cleansite\.biz$ -(^|\.)cleansite\.info$ -(^|\.)cleansite\.us$ -(^|\.)clearharmony\.net$ -(^|\.)clearsurance\.com$ -(^|\.)clearwisdom\.net$ -(^|\.)clementine-player\.org$ -(^|\.)cling\.omy\.sg$ -(^|\.)clinica-tibet\.ru$ -(^|\.)clipfish\.de$ -(^|\.)cloakpoint\.com$ -(^|\.)cloud\.feedly\.com$ -(^|\.)cloud\.mail\.ru$ -(^|\.)club1069\.com$ -(^|\.)clyp\.it$ -(^|\.)cmcn\.org$ -(^|\.)cmi\.org\.tw$ -(^|\.)cmp\.hku\.hk$ -(^|\.)cms\.gov$ -(^|\.)cmule\.com$ -(^|\.)cmule\.org$ -(^|\.)cmx\.im$ -(^|\.)cn-proxy\.com$ -(^|\.)cn\.calameo\.com$ -(^|\.)cn\.dayabook\.com$ -(^|\.)cn\.fmnnow\.com$ -(^|\.)cn\.freeones\.com$ -(^|\.)cn\.giganews\.com$ -(^|\.)cn\.ibtimes\.com$ -(^|\.)cn\.nytstyle\.com$ -(^|\.)cn\.sandscotaicentral\.com$ -(^|\.)cn\.shafaqna\.com$ -(^|\.)cn\.streetvoice\.com$ -(^|\.)cn\.thegay\.com$ -(^|\.)cn\.uncyclopedia\.wikia\.com$ -(^|\.)cn\.uptodown\.com$ -(^|\.)cn\.voa\.mobi$ -(^|\.)cn2\.streetvoice\.com$ -(^|\.)cn6\.eu$ -(^|\.)cna\.com\.tw$ -(^|\.)cnabc\.com$ -(^|\.)cnbbnews\.wordpress\.com$ -(^|\.)cnd\.org$ -(^|\.)cnex\.org\.cn$ -(^|\.)cnineu\.com$ -(^|\.)cnn\.com$ -(^|\.)cnnews\.chosun\.com$ -(^|\.)cnpolitics\.org$ -(^|\.)cnproxy\.com$ -(^|\.)co\.ng\.mil$ -(^|\.)coat\.co\.jp$ -(^|\.)cobinhood\.com$ -(^|\.)cochina\.co$ -(^|\.)cochina\.org$ -(^|\.)code1984\.com$ -(^|\.)codeshare\.io$ -(^|\.)codeskulptor\.org$ -(^|\.)coin2co\.in$ -(^|\.)coinbene\.com$ -(^|\.)coinegg\.com$ -(^|\.)coinex\.com$ -(^|\.)coingi\.com$ -(^|\.)coinrail\.co\.kr$ -(^|\.)cointiger\.com$ -(^|\.)cointobe\.com$ -(^|\.)coinut\.com$ -(^|\.)collateralmurder\.com$ -(^|\.)collateralmurder\.org$ -(^|\.)com\.google$ -(^|\.)comefromchina\.com$ -(^|\.)comic-mega\.me$ -(^|\.)commandarms\.com$ -(^|\.)commentshk\.com$ -(^|\.)communistcrimes\.org$ -(^|\.)community\.windy\.com$ -(^|\.)communitychoicecu\.com$ -(^|\.)compileheart\.com$ -(^|\.)compress\.to$ -(^|\.)connect\.facebook\.net$ -(^|\.)conoha\.jp$ -(^|\.)contactmagazine\.net$ -(^|\.)contests\.twilio\.com$ -(^|\.)convio\.net$ -(^|\.)coobay\.com$ -(^|\.)coolaler\.com$ -(^|\.)coolder\.com$ -(^|\.)coolloud\.org\.tw$ -(^|\.)coolncute\.com$ -(^|\.)coolstuffinc\.com$ -(^|\.)corumcollege\.com$ -(^|\.)cos-moe\.com$ -(^|\.)cosmic\.monar\.ch$ -(^|\.)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$ -(^|\.)crrev\.com$ -(^|\.)crucial\.com$ -(^|\.)csdparty\.com$ -(^|\.)css\.pixnet\.in$ -(^|\.)csuchen\.de$ -(^|\.)csw\.org\.uk$ -(^|\.)ct\.org\.tw$ -(^|\.)ctao\.org$ -(^|\.)ctfriend\.net$ -(^|\.)cthlo\.github\.io$ -(^|\.)ctitv\.com\.tw$ -(^|\.)cts\.com\.tw$ -(^|\.)cuhkacs\.org$ -(^|\.)cuihua\.org$ -(^|\.)cuiweiping\.net$ -(^|\.)culture\.tw$ -(^|\.)cumlouder\.com$ -(^|\.)curvefish\.com$ -(^|\.)cusu\.hk$ -(^|\.)cutscenes\.net$ -(^|\.)cw\.com\.tw$ -(^|\.)cyberghost\.natado\.com$ -(^|\.)cyberghostvpn\.com$ -(^|\.)cynscribe\.com$ -(^|\.)cytode\.us$ -(^|\.)d-fukyu\.com$ -(^|\.)d100\.net$ -(^|\.)d1b183sg0nvnuh\.cloudfront\.net$ -(^|\.)d1c37gjwa26taa\.cloudfront\.net$ -(^|\.)d2bay\.com$ -(^|\.)d2pass\.com$ -(^|\.)d3c33hcgiwev3\.cloudfront\.net$ -(^|\.)d3rhr7kgmtrq1v\.cloudfront\.net$ -(^|\.)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$ -(^|\.)dailymotion\.com$ -(^|\.)dailynews\.sina\.com$ -(^|\.)dailynews\.sina\.com%2f$ -(^|\.)dailyview\.tw$ -(^|\.)daiphapinfo\.net$ -(^|\.)dajiyuan\.com$ -(^|\.)dajiyuan\.de$ -(^|\.)dajiyuan\.eu$ -(^|\.)dajusha\.baywords\.com$ -(^|\.)dalailama-archives\.org$ -(^|\.)dalailama\.com$ -(^|\.)dalailama\.mn$ -(^|\.)dalailama\.ru$ -(^|\.)dalailama\.usc\.edu$ -(^|\.)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$ -(^|\.)danbooru\.donmai\.us$ -(^|\.)danke4china\.net$ -(^|\.)danwei\.org$ -(^|\.)daodu14\.jigsy\.com$ -(^|\.)daolan\.net$ -(^|\.)daozhongxing\.org$ -(^|\.)darktech\.org$ -(^|\.)darktoy\.net$ -(^|\.)darpa\.mil$ -(^|\.)dastrassi\.org$ -(^|\.)data-vocabulary\.org$ -(^|\.)data\.flurry\.com$ -(^|\.)data\.gov\.tw$ -(^|\.)david-kilgour\.com$ -(^|\.)dawangidc\.com$ -(^|\.)daxa\.cn$ -(^|\.)daylife\.com$ -(^|\.)db\.tt$ -(^|\.)dbc\.hk$ -(^|\.)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$ -(^|\.)deaftone\.com$ -(^|\.)debug\.com$ -(^|\.)deck\.ly$ -(^|\.)decodet\.co$ -(^|\.)deepmind\.com$ -(^|\.)deezer\.com$ -(^|\.)definebabe\.com$ -(^|\.)deja\.com$ -(^|\.)delcamp\.net$ -(^|\.)delicious\.com$ -(^|\.)demo\.opera-mini\.net$ -(^|\.)democrats\.org$ -(^|\.)depositphotos\.com$ -(^|\.)derekhsu\.homeip\.net$ -(^|\.)desc\.se$ -(^|\.)design\.google$ -(^|\.)desipro\.de$ -(^|\.)dessci\.com$ -(^|\.)destiny\.xfiles\.to$ -(^|\.)destroy-china\.jp$ -(^|\.)deutsche-welle\.de$ -(^|\.)developers\.box\.net$ -(^|\.)devio\.us$ -(^|\.)devpn\.com$ -(^|\.)dfas\.mil$ -(^|\.)dfn\.org$ -(^|\.)dharamsalanet\.com$ -(^|\.)dharmakara\.net$ -(^|\.)dhcp\.biz$ -(^|\.)diaoyuislands\.org$ -(^|\.)dictionary\.goo\.ne\.jp$ -(^|\.)difangwenge\.org$ -(^|\.)digiland\.tw$ -(^|\.)digisfera\.com$ -(^|\.)digitalnomadsproject\.org$ -(^|\.)diigo\.com$ -(^|\.)dilber\.se$ -(^|\.)dingchin\.com\.tw$ -(^|\.)dipity\.com$ -(^|\.)directcreative\.com$ -(^|\.)discoins\.com$ -(^|\.)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$ -(^|\.)dl\.box\.net$ -(^|\.)dlsite\.com$ -(^|\.)dlyoutube\.com$ -(^|\.)dm530\.net$ -(^|\.)dmcdn\.net$ -(^|\.)dmm\.co\.jp$ -(^|\.)dns-dns\.com$ -(^|\.)dns-stuff\.com$ -(^|\.)dns04\.com$ -(^|\.)dns05\.com$ -(^|\.)dns1\.us$ -(^|\.)dns2\.us$ -(^|\.)dns2go\.com$ -(^|\.)dnscrypt\.org$ -(^|\.)dnset\.com$ -(^|\.)dnsrd\.com$ -(^|\.)dnssec\.net$ -(^|\.)dnvod\.tv$ -(^|\.)doctorvoice\.org$ -(^|\.)dogfartnetwork\.com$ -(^|\.)dojin\.com$ -(^|\.)dok-forum\.net$ -(^|\.)dolc\.de$ -(^|\.)dolf\.org\.hk$ -(^|\.)dollf\.com$ -(^|\.)domain\.club\.tw$ -(^|\.)domainhelp\.search\.com$ -(^|\.)domains\.google$ -(^|\.)domaintoday\.com\.au$ -(^|\.)dongtaiwang\.com$ -(^|\.)dongtaiwang\.net$ -(^|\.)dongyangjing\.com$ -(^|\.)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$ -(^|\.)download\.aircrack-ng\.org$ -(^|\.)download\.cnet\.com$ -(^|\.)download\.ithome\.com\.tw$ -(^|\.)dphk\.org$ -(^|\.)dpp\.org\.tw$ -(^|\.)dpr\.info$ -(^|\.)dragonex\.io$ -(^|\.)dragonsprings\.org$ -(^|\.)dreamamateurs\.com$ -(^|\.)drepung\.org$ -(^|\.)drgan\.net$ -(^|\.)drmingxia\.org$ -(^|\.)dropbooks\.tv$ -(^|\.)dropbox\.com$ -(^|\.)dropboxusercontent\.com$ -(^|\.)drsunacademy\.com$ -(^|\.)drtuber\.com$ -(^|\.)dscn\.info$ -(^|\.)dsmtp\.com$ -(^|\.)dstk\.dk$ -(^|\.)dtdns\.net$ -(^|\.)dtiblog\.com$ -(^|\.)dtic\.mil$ -(^|\.)dtwang\.org$ -(^|\.)duanzhihu\.com$ -(^|\.)duck\.com$ -(^|\.)duckdns\.org$ -(^|\.)duckduckgo-owned-server\.yahoo\.net$ -(^|\.)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$ -(^|\.)dvdpac\.com$ -(^|\.)dvorak\.org$ -(^|\.)dw-world\.com$ -(^|\.)dw-world\.de$ -(^|\.)dw\.com$ -(^|\.)dw\.de$ -(^|\.)dwnews\.com$ -(^|\.)dwnews\.net$ -(^|\.)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$ -(^|\.)dynupdate\.no-ip\.com$ -(^|\.)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$ -(^|\.)eastturkistancc\.org$ -(^|\.)eastturkistangovernmentinexile\.us$ -(^|\.)easyca\.ca$ -(^|\.)easypic\.com$ -(^|\.)ebony-beauty\.com$ -(^|\.)ebook\.hyread\.com\.tw$ -(^|\.)ebookbrowse\.com$ -(^|\.)ebookee\.com$ -(^|\.)ebtcbank\.com$ -(^|\.)ecfa\.org\.tw$ -(^|\.)echofon\.com$ -(^|\.)ecimg\.tw$ -(^|\.)ecministry\.net$ -(^|\.)economist\.com$ -(^|\.)ecsm\.vs\.com$ -(^|\.)edgecastcdn\.net$ -(^|\.)edicypages\.com$ -(^|\.)edmontonchina\.cn$ -(^|\.)edmontonservice\.com$ -(^|\.)edns\.biz$ -(^|\.)edoors\.com$ -(^|\.)edubridge\.com$ -(^|\.)edupro\.org$ -(^|\.)eeas\.europa\.eu$ -(^|\.)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$ -(^|\.)embr\.in$ -(^|\.)emilylau\.org\.hk$ -(^|\.)empfil\.com$ -(^|\.)emule-ed2k\.com$ -(^|\.)emulefans\.com$ -(^|\.)emuparadise\.me$ -(^|\.)en\.favotter\.net$ -(^|\.)en\.hao123\.com$ -(^|\.)enanyang\.my$ -(^|\.)enewstree\.com$ -(^|\.)enfal\.de$ -(^|\.)engagedaily\.org$ -(^|\.)englishforeveryone\.org$ -(^|\.)englishfromengland\.co\.uk$ -(^|\.)englishpen\.org$ -(^|\.)enlighten\.org\.tw$ -(^|\.)entermap\.com$ -(^|\.)entnt\.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$ -(^|\.)esurance\.com$ -(^|\.)etaa\.org\.au$ -(^|\.)etadult\.com$ -(^|\.)etaiwannews\.com$ -(^|\.)etherdelta\.com$ -(^|\.)etizer\.org$ -(^|\.)etokki\.com$ -(^|\.)etools\.ncol\.com$ -(^|\.)etowns\.net$ -(^|\.)etowns\.org$ -(^|\.)ettoday\.net$ -(^|\.)etvonline\.hk$ -(^|\.)eu\.org$ -(^|\.)eucasino\.com$ -(^|\.)eulam\.com$ -(^|\.)eurekavpt\.com$ -(^|\.)euronews\.com$ -(^|\.)evchk\.wikia\.com$ -(^|\.)evschool\.net$ -(^|\.)exblog\.jp$ -(^|\.)exchristian\.hk$ -(^|\.)exmo\.com$ -(^|\.)exmormon\.org$ -(^|\.)expatshield\.com$ -(^|\.)expecthim\.com$ -(^|\.)expekt\.com$ -(^|\.)experts-univers\.com$ -(^|\.)exploader\.net$ -(^|\.)expressvpn\.com$ -(^|\.)exrates\.me$ -(^|\.)extmatrix\.com$ -(^|\.)extremetube\.com$ -(^|\.)exx\.com$ -(^|\.)eyevio\.jp$ -(^|\.)eyny\.com$ -(^|\.)ezpc\.tk$ -(^|\.)ezpeer\.com$ -(^|\.)ezua\.com$ -(^|\.)fa\.gov\.tw$ -(^|\.)facebook\.br$ -(^|\.)facebook\.com$ -(^|\.)facebook\.design$ -(^|\.)facebook\.hu$ -(^|\.)facebook\.in$ -(^|\.)facebook\.nl$ -(^|\.)facebook\.se$ -(^|\.)facebookmail\.com$ -(^|\.)facebookquotes4u\.com$ -(^|\.)faceless\.me$ -(^|\.)facesofnyfw\.com$ -(^|\.)facesoftibetanselfimmolators\.info$ -(^|\.)fail\.hk$ -(^|\.)faith100\.org$ -(^|\.)faithfuleye\.com$ -(^|\.)faiththedog\.info$ -(^|\.)fakku\.net$ -(^|\.)falsefire\.com$ -(^|\.)falun-co\.org$ -(^|\.)falun-ny\.net$ -(^|\.)falun\.caltech\.edu$ -(^|\.)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$ -(^|\.)fangbinxing\.com$ -(^|\.)fangeming\.com$ -(^|\.)fangeqiang\.com$ -(^|\.)fanglizhi\.info$ -(^|\.)fangmincn\.org$ -(^|\.)fangong\.forums-free\.com$ -(^|\.)fangong\.org$ -(^|\.)fangongheike\.com$ -(^|\.)fanhaodang\.com$ -(^|\.)fanqiang\.tk$ -(^|\.)fanqianghou\.com$ -(^|\.)fanqiangyakexi\.net$ -(^|\.)fanqiangzhe\.com$ -(^|\.)fanswong\.com$ -(^|\.)fanyue\.info$ -(^|\.)fapdu\.com$ -(^|\.)faproxy\.com$ -(^|\.)faqserv\.com$ -(^|\.)fartit\.com$ -(^|\.)farwestchina\.com$ -(^|\.)fast\.wistia\.com$ -(^|\.)fastpic\.ru$ -(^|\.)fastssh\.com$ -(^|\.)faststone\.org$ -(^|\.)fatbtc\.com$ -(^|\.)favstar\.fm$ -(^|\.)fawanghuihui\.org$ -(^|\.)faydao\.com$ -(^|\.)fb\.com$ -(^|\.)fb\.me$ -(^|\.)fbaddins\.com$ -(^|\.)fbcdn\.net$ -(^|\.)fbsbx\.com$ -(^|\.)fbworkmail\.com$ -(^|\.)fc2\.com$ -(^|\.)fc2blog\.net$ -(^|\.)fc2china\.com$ -(^|\.)fc2cn\.com$ -(^|\.)fda\.gov\.tw$ -(^|\.)fdc64\.de$ -(^|\.)fdc64\.org$ -(^|\.)fdc89\.jp$ -(^|\.)feedburner\.com$ -(^|\.)feeds\.fileforum\.com$ -(^|\.)feelssh\.com$ -(^|\.)feer\.com$ -(^|\.)feifeiss\.com$ -(^|\.)feitian-california\.org$ -(^|\.)feitianacademy\.org$ -(^|\.)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$ -(^|\.)files2me\.com$ -(^|\.)fileserve\.com$ -(^|\.)filesor\.com$ -(^|\.)fillthesquare\.org$ -(^|\.)filmingfortibet\.org$ -(^|\.)filmy\.olabloga\.pl$ -(^|\.)filthdump\.com$ -(^|\.)financetwitter\.com$ -(^|\.)finchvpn\.com$ -(^|\.)findmespot\.com$ -(^|\.)findyoutube\.com$ -(^|\.)findyoutube\.net$ -(^|\.)fingerdaily\.com$ -(^|\.)finler\.net$ -(^|\.)firearmsworld\.net$ -(^|\.)firebaseio\.com$ -(^|\.)fireofliberty\.org$ -(^|\.)firetweet\.io$ -(^|\.)firstfivefollowers\.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$ -(^|\.)flyvpn\.com$ -(^|\.)flyzy2005\.com$ -(^|\.)fnac\.be$ -(^|\.)fnac\.com$ -(^|\.)fochk\.org$ -(^|\.)focustaiwan\.tw$ -(^|\.)focusvpn\.com$ -(^|\.)fofg-europe\.net$ -(^|\.)fofg\.org$ -(^|\.)fofldfradio\.org$ -(^|\.)fooooo\.com$ -(^|\.)footwiball\.com$ -(^|\.)foreignpolicy\.com$ -(^|\.)forum\.baby-kingdom\.com$ -(^|\.)forum\.cyberctm\.com$ -(^|\.)forum\.idsam\.com$ -(^|\.)forum\.my903\.com$ -(^|\.)forum\.mymaji\.com$ -(^|\.)forum\.omy\.sg$ -(^|\.)forum\.palmislife\.com$ -(^|\.)forum\.setty\.com\.tw$ -(^|\.)forum\.sina\.com\.hk$ -(^|\.)forum\.slime\.com\.tw$ -(^|\.)forum\.tvb\.com$ -(^|\.)forum\.xinbao\.de$ -(^|\.)forum4hk\.com$ -(^|\.)fotile\.me$ -(^|\.)fourface\.nodesnoop\.com$ -(^|\.)fourthinternational\.org$ -(^|\.)foxdie\.us$ -(^|\.)foxgay\.com$ -(^|\.)foxsub\.com$ -(^|\.)foxtang\.com$ -(^|\.)fpmt-osel\.org$ -(^|\.)fpmt\.org$ -(^|\.)fpmt\.tw$ -(^|\.)fpmtmexico\.org$ -(^|\.)fq\.wikia\.com$ -(^|\.)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$ -(^|\.)freebrowser\.org$ -(^|\.)freechal\.com$ -(^|\.)freechina\.net$ -(^|\.)freechina\.news$ -(^|\.)freechinaforum\.org$ -(^|\.)freechinaweibo\.com$ -(^|\.)freeddns\.com$ -(^|\.)freeddns\.org$ -(^|\.)freedomchina\.info$ -(^|\.)freedomcollection\.org$ -(^|\.)freedomhouse\.org$ -(^|\.)freedominfonetweb\.wordpress\.com$ -(^|\.)freedomsherald\.org$ -(^|\.)freeforums\.org$ -(^|\.)freefq\.com$ -(^|\.)freefuckvids\.com$ -(^|\.)freegao\.com$ -(^|\.)freeilhamtohti\.org$ -(^|\.)freekwonpyong\.org$ -(^|\.)freelotto\.com$ -(^|\.)freeman2\.com$ -(^|\.)freemoren\.com$ -(^|\.)freemorenews\.com$ -(^|\.)freemuse\.org$ -(^|\.)freenet$ -(^|\.)freenet-china\.org$ -(^|\.)freenetproject\.org$ -(^|\.)freenewscn\.com$ -(^|\.)freeopenvpn\.com$ -(^|\.)freeoz\.org$ -(^|\.)freessh\.us$ -(^|\.)freetcp\.com$ -(^|\.)freetibet\.net$ -(^|\.)freetibet\.org$ -(^|\.)freetibetanheroes\.org$ -(^|\.)freeviewmovies\.com$ -(^|\.)freevpn\.me$ -(^|\.)freevpn\.nl$ -(^|\.)freewallpaper4\.me$ -(^|\.)freewebs\.com$ -(^|\.)freewechat\.com$ -(^|\.)freeweibo\.com$ -(^|\.)freewww\.biz$ -(^|\.)freewww\.info$ -(^|\.)freexinwen\.com$ -(^|\.)freeyellow\.com$ -(^|\.)freeyoutubeproxy\.net$ -(^|\.)friendfeed-media\.com$ -(^|\.)friendfeed\.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$ -(^|\.)fucd\.com$ -(^|\.)fuckcnnic\.net$ -(^|\.)fuckgfw\.org$ -(^|\.)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$ -(^|\.)gabocorp\.com$ -(^|\.)gaeproxy\.com$ -(^|\.)gaforum\.org$ -(^|\.)galaxymacau\.com$ -(^|\.)galenwu\.com$ -(^|\.)galstars\.net$ -(^|\.)game735\.com$ -(^|\.)gamebase\.com\.tw$ -(^|\.)gamejolt\.com$ -(^|\.)gamer-cds\.cdn\.hinet\.net$ -(^|\.)gamer\.com\.tw$ -(^|\.)gamer2-cds\.cdn\.hinet\.net$ -(^|\.)gamez\.com\.tw$ -(^|\.)gamousa\.com$ -(^|\.)ganges\.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$ -(^|\.)gcmasia\.com$ -(^|\.)gcpnews\.com$ -(^|\.)gcr\.io$ -(^|\.)gdbt\.net$ -(^|\.)gdzf\.org$ -(^|\.)geek-art\.net$ -(^|\.)geekerhome\.com$ -(^|\.)geekheart\.info$ -(^|\.)gekikame\.com$ -(^|\.)gelbooru\.com$ -(^|\.)geocities\.co\.jp$ -(^|\.)geocities\.com$ -(^|\.)geocities\.jp$ -(^|\.)gerefoundation\.org$ -(^|\.)get\.app$ -(^|\.)get\.how$ -(^|\.)get\.page$ -(^|\.)getastrill\.com$ -(^|\.)getchu\.com$ -(^|\.)getcloak\.com$ -(^|\.)getfoxyproxy\.org$ -(^|\.)getfreedur\.com$ -(^|\.)getgom\.com$ -(^|\.)geti2p\.net$ -(^|\.)getiton\.com$ -(^|\.)getjetso\.com$ -(^|\.)getlantern\.org$ -(^|\.)getmdl\.io$ -(^|\.)getoutline\.org$ -(^|\.)getsocialscope\.com$ -(^|\.)getsync\.com$ -(^|\.)gettrials\.com$ -(^|\.)gettyimages\.com$ -(^|\.)getuploader\.com$ -(^|\.)gfbv\.de$ -(^|\.)gfgold\.com\.hk$ -(^|\.)gfsale\.com$ -(^|\.)gfw\.org\.ua$ -(^|\.)gfw\.press$ -(^|\.)ggpht\.com$ -(^|\.)ggssl\.com$ -(^|\.)ghostpath\.com$ -(^|\.)ghut\.org$ -(^|\.)giantessnight\.com$ -(^|\.)gifree\.com$ -(^|\.)giga-web\.jp$ -(^|\.)gigporno\.ru$ -(^|\.)girlbanker\.com$ -(^|\.)git\.io$ -(^|\.)github\.com$ -(^|\.)gizlen\.net$ -(^|\.)gjczz\.com$ -(^|\.)glass8\.eu$ -(^|\.)global\.bing\.com$ -(^|\.)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$ -(^|\.)gmbd\.cn$ -(^|\.)gmhz\.org$ -(^|\.)gmll\.org$ -(^|\.)gmodules\.com$ -(^|\.)gmozomg\.izihost\.org$ -(^|\.)gnci\.org\.hk$ -(^|\.)go-pki\.com$ -(^|\.)go\.nesnode\.com$ -(^|\.)go141\.com$ -(^|\.)goagent\.biz$ -(^|\.)goagent\.codeplex\.com$ -(^|\.)goagentplus\.com$ -(^|\.)gobet\.cc$ -(^|\.)godfootsteps\.org$ -(^|\.)godns\.work$ -(^|\.)godoc\.org$ -(^|\.)godsdirectcontact\.co\.uk$ -(^|\.)godsdirectcontact\.org$ -(^|\.)godsdirectcontact\.org\.tw$ -(^|\.)godsimmediatecontact\.com$ -(^|\.)gogotunnel\.com$ -(^|\.)gohappy\.com\.tw$ -(^|\.)gojet\.krtco\.com\.tw$ -(^|\.)gokbayrak\.com$ -(^|\.)golang\.org$ -(^|\.)goldbet\.com$ -(^|\.)goldbetsports\.com$ -(^|\.)goldeneyevault\.com$ -(^|\.)goldenfrog\.com$ -(^|\.)goldjizz\.com$ -(^|\.)goldstep\.net$ -(^|\.)goldwave\.com$ -(^|\.)gongm\.in$ -(^|\.)gongmeng\.info$ -(^|\.)gongminliliang\.com$ -(^|\.)gongwt\.com$ -(^|\.)goo\.gl$ -(^|\.)gooday\.xyz$ -(^|\.)gooddns\.info$ -(^|\.)goodreaders\.com$ -(^|\.)goodreads\.com$ -(^|\.)goodtv\.com\.tw$ -(^|\.)goodtv\.tv$ -(^|\.)goofind\.com$ -(^|\.)google\.ae$ -(^|\.)google\.am$ -(^|\.)google\.as$ -(^|\.)google\.at$ -(^|\.)google\.az$ -(^|\.)google\.ba$ -(^|\.)google\.be$ -(^|\.)google\.bg$ -(^|\.)google\.ca$ -(^|\.)google\.calstate\.edu$ -(^|\.)google\.cd$ -(^|\.)google\.ci$ -(^|\.)google\.co\.id$ -(^|\.)google\.co\.jp$ -(^|\.)google\.co\.kr$ -(^|\.)google\.co\.ma$ -(^|\.)google\.co\.uk$ -(^|\.)google\.com$ -(^|\.)google\.de$ -(^|\.)google\.dj$ -(^|\.)google\.dk$ -(^|\.)google\.es$ -(^|\.)google\.fi$ -(^|\.)google\.fm$ -(^|\.)google\.fr$ -(^|\.)google\.gg$ -(^|\.)google\.gl$ -(^|\.)google\.gr$ -(^|\.)google\.ie$ -(^|\.)google\.is$ -(^|\.)google\.it$ -(^|\.)google\.jo$ -(^|\.)google\.kz$ -(^|\.)google\.lv$ -(^|\.)google\.mn$ -(^|\.)google\.ms$ -(^|\.)google\.nl$ -(^|\.)google\.no$ -(^|\.)google\.nu$ -(^|\.)google\.ro$ -(^|\.)google\.ru$ -(^|\.)google\.rw$ -(^|\.)google\.sc$ -(^|\.)google\.sh$ -(^|\.)google\.sk$ -(^|\.)google\.sm$ -(^|\.)google\.sn$ -(^|\.)google\.tk$ -(^|\.)google\.tm$ -(^|\.)google\.to$ -(^|\.)google\.tt$ -(^|\.)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$ -(^|\.)googlegroups\.com$ -(^|\.)googlehosted\.com$ -(^|\.)googleideas\.com$ -(^|\.)googleinsidesearch\.com$ -(^|\.)googlelabs\.com$ -(^|\.)googlemail\.com$ -(^|\.)googlemashups\.com$ -(^|\.)googlepagecreator\.com$ -(^|\.)googleplay\.com$ -(^|\.)googleplus\.com$ -(^|\.)googlescholar\.com$ -(^|\.)googlesile\.com$ -(^|\.)googlesource\.com$ -(^|\.)googleusercontent\.com$ -(^|\.)googlevideo\.com$ -(^|\.)googleweblight\.com$ -(^|\.)googlezip\.net$ -(^|\.)gopetition\.com$ -(^|\.)goproxing\.net$ -(^|\.)goregrish\.com$ -(^|\.)gospelherald\.com$ -(^|\.)got-game\.org$ -(^|\.)gotdns\.ch$ -(^|\.)gotgeeks\.com$ -(^|\.)gotrusted\.com$ -(^|\.)gotw\.ca$ -(^|\.)gov\.taipei$ -(^|\.)gov\.tw$ -(^|\.)gr8domain\.biz$ -(^|\.)gr8name\.biz$ -(^|\.)grammaly\.com$ -(^|\.)grandtrial\.org$ -(^|\.)grangorz\.org$ -(^|\.)graphis\.ne\.jp$ -(^|\.)graphql\.org$ -(^|\.)greasespot\.net$ -(^|\.)great-firewall\.com$ -(^|\.)great-roc\.org$ -(^|\.)greatfire\.org$ -(^|\.)greatfire\.us7\.list-manage\.com$ -(^|\.)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$ -(^|\.)groups\.google\.cn$ -(^|\.)grow\.google$ -(^|\.)gs-discuss\.com$ -(^|\.)gsp\.target\.com$ -(^|\.)gstatic\.com$ -(^|\.)gtricks\.com$ -(^|\.)gts-vpn\.com$ -(^|\.)gu-chu-sum\.org$ -(^|\.)guaguass\.com$ -(^|\.)guaguass\.org$ -(^|\.)guancha\.org$ -(^|\.)guaneryu\.com$ -(^|\.)guangming\.com\.my$ -(^|\.)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$ -(^|\.)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$ -(^|\.)hackthatphone\.net$ -(^|\.)hahaxixi\.github\.io$ -(^|\.)hahlo\.com$ -(^|\.)hakkatv\.org\.tw$ -(^|\.)handcraftedsoftware\.org$ -(^|\.)hanunyi\.com$ -(^|\.)hao\.news$ -(^|\.)haoel\.github\.io$ -(^|\.)happy-vpn\.com$ -(^|\.)haproxy\.org$ -(^|\.)hardsextube\.com$ -(^|\.)harunyahya\.com$ -(^|\.)hautelook\.com$ -(^|\.)hautelookcdn\.com$ -(^|\.)have8\.com$ -(^|\.)hbg\.com$ -(^|\.)hbo\.com$ -(^|\.)hclips\.com$ -(^|\.)hd\.stheadline\.com$ -(^|\.)hdlt\.me$ -(^|\.)hdtvb\.net$ -(^|\.)hdzog\.com$ -(^|\.)heartyit\.com$ -(^|\.)heavy-r\.com$ -(^|\.)hec\.su$ -(^|\.)hecaitou\.net$ -(^|\.)hechaji\.com$ -(^|\.)heeact\.edu\.tw$ -(^|\.)hegre-art\.com$ -(^|\.)heix\.pp\.ru$ -(^|\.)helloandroid\.com$ -(^|\.)helloqueer\.com$ -(^|\.)helloss\.pw$ -(^|\.)hellotxt\.com$ -(^|\.)hellouk\.org$ -(^|\.)help\.linksalpha\.com$ -(^|\.)helpeachpeople\.com$ -(^|\.)helplinfen\.com$ -(^|\.)helpster\.de$ -(^|\.)helpzhuling\.org$ -(^|\.)hentai\.to$ -(^|\.)hentaitube\.tv$ -(^|\.)hentaivideoworld\.com$ -(^|\.)heqinglian\.net$ -(^|\.)heungkongdiscuss\.com$ -(^|\.)hexieshe\.com$ -(^|\.)hexieshe\.xyz$ -(^|\.)hexxeh\.net$ -(^|\.)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$ -(^|\.)hihiforum\.com$ -(^|\.)hihistory\.net$ -(^|\.)hiitch\.com$ -(^|\.)hikinggfw\.org$ -(^|\.)hilive\.tv$ -(^|\.)himalayan-foundation\.org$ -(^|\.)himalayanglacier\.com$ -(^|\.)himemix\.com$ -(^|\.)himemix\.net$ -(^|\.)hitbtc\.com$ -(^|\.)hitomi\.la$ -(^|\.)hiwifi\.com$ -(^|\.)hizb-ut-tahrir\.info$ -(^|\.)hizb-ut-tahrir\.org$ -(^|\.)hizbuttahrir\.org$ -(^|\.)hjclub\.info$ -(^|\.)hk-pub\.com$ -(^|\.)hk\.frienddy\.com$ -(^|\.)hk\.geocities\.com$ -(^|\.)hk\.gradconnection\.com$ -(^|\.)hk\.hao123img\.com$ -(^|\.)hk\.jiepang\.com$ -(^|\.)hk\.knowledge\.yahoo\.com$ -(^|\.)hk\.myblog\.yahoo\.com$ -(^|\.)hk\.news\.yahoo\.com$ -(^|\.)hk\.rd\.yahoo\.com$ -(^|\.)hk\.search\.yahoo\.com$ -(^|\.)hk\.video\.news\.yahoo\.com$ -(^|\.)hk\.yahoo\.com$ -(^|\.)hk01\.com$ -(^|\.)hk32168\.com$ -(^|\.)hka8964\.wordpress\.com$ -(^|\.)hkacg\.com$ -(^|\.)hkacg\.net$ -(^|\.)hkanews\.wordpress\.com$ -(^|\.)hkatvnews\.com$ -(^|\.)hkbc\.net$ -(^|\.)hkbf\.org$ -(^|\.)hkbookcity\.com$ -(^|\.)hkchurch\.org$ -(^|\.)hkci\.org\.hk$ -(^|\.)hkcmi\.edu$ -(^|\.)hkcnews\.com$ -(^|\.)hkcoc\.com$ -(^|\.)hkcoc\.weather\.com\.hk$ -(^|\.)hkdailynews\.com\.hk$ -(^|\.)hkday\.net$ -(^|\.)hkdf\.org$ -(^|\.)hkej\.com$ -(^|\.)hkepc\.com$ -(^|\.)hkfaa\.com$ -(^|\.)hkfreezone\.com$ -(^|\.)hkfront\.org$ -(^|\.)hkgalden\.com$ -(^|\.)hkgolden\.com$ -(^|\.)hkgreenradio\.org$ -(^|\.)hkheadline\.com$ -(^|\.)hkhkhk\.com$ -(^|\.)hkhrc\.org\.hk$ -(^|\.)hkhrm\.org\.hk$ -(^|\.)hkip\.org\.uk$ -(^|\.)hkjc\.com$ -(^|\.)hkjp\.org$ -(^|\.)hklft\.com$ -(^|\.)hklts\.org\.hk$ -(^|\.)hkptu\.org$ -(^|\.)hkreporter\.com$ -(^|\.)hkreporter\.loved\.hk$ -(^|\.)hkupop\.hku\.hk$ -(^|\.)hkusu\.net$ -(^|\.)hkvwet\.com$ -(^|\.)hkwcc\.org\.hk$ -(^|\.)hkzone\.org$ -(^|\.)hmonghot\.com$ -(^|\.)hmv\.co\.jp$ -(^|\.)hmvdigital\.ca$ -(^|\.)hmvdigital\.com$ -(^|\.)hnjhj\.com$ -(^|\.)hnntube\.com$ -(^|\.)hola\.com$ -(^|\.)hola\.org$ -(^|\.)holymountaincn\.com$ -(^|\.)holyspiritspeaks\.org$ -(^|\.)home\.sina\.com$ -(^|\.)home\.so-net\.net\.tw$ -(^|\.)homedepot\.com$ -(^|\.)homeperversion\.com$ -(^|\.)homeservershow\.com$ -(^|\.)hongkongfp\.com$ -(^|\.)hongmeimei\.com$ -(^|\.)hongzhi\.li$ -(^|\.)hootsuite\.com$ -(^|\.)hoovers\.com$ -(^|\.)hopedialogue\.org$ -(^|\.)hopto\.org$ -(^|\.)hornygamer\.com$ -(^|\.)hornytrip\.com$ -(^|\.)hotav\.tv$ -(^|\.)hotels\.cn$ -(^|\.)hotfrog\.com\.tw$ -(^|\.)hotgoo\.com$ -(^|\.)hotpornshow\.com$ -(^|\.)hotpot\.hk$ -(^|\.)hotshame\.com$ -(^|\.)hotspotshield\.com$ -(^|\.)hotvpn\.com$ -(^|\.)hougaige\.com$ -(^|\.)howtoforge\.com$ -(^|\.)hoxx\.com$ -(^|\.)hpa\.gov\.tw$ -(^|\.)hqcdp\.org$ -(^|\.)hqjapanesesex\.com$ -(^|\.)hqmovies\.com$ -(^|\.)hqsbnet\.wordpress\.com$ -(^|\.)hqsbonline\.wordpress\.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$ -(^|\.)https$ -(^|\.)https443\.net$ -(^|\.)https443\.org$ -(^|\.)hua-yue\.net$ -(^|\.)huaglad\.com$ -(^|\.)huanghuagang\.org$ -(^|\.)huangyiyu\.com$ -(^|\.)huaren\.us$ -(^|\.)huaren4us\.com$ -(^|\.)huashangnews\.com$ -(^|\.)huaxia-news\.com$ -(^|\.)huaxiabao\.org$ -(^|\.)huaxin\.ph$ -(^|\.)huayuworld\.org$ -(^|\.)hudatoriq\.web\.id$ -(^|\.)hudson\.org$ -(^|\.)huffingtonpost\.com$ -(^|\.)hugoroy\.eu$ -(^|\.)huhaitai\.com$ -(^|\.)huhamhire\.com$ -(^|\.)huiyi\.in$ -(^|\.)hulkshare\.com$ -(^|\.)hulu\.com$ -(^|\.)huluim\.com$ -(^|\.)hum$ -(^|\.)humanrightsbriefing\.org$ -(^|\.)hung-ya\.com$ -(^|\.)hungerstrikeforaids\.org$ -(^|\.)huobi\.com$ -(^|\.)huobi\.pro$ -(^|\.)huobipro\.com$ -(^|\.)huping\.net$ -(^|\.)hurgokbayrak\.com$ -(^|\.)hurriyet\.com\.tr$ -(^|\.)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$ -(^|\.)i-cable\.com$ -(^|\.)i-part\.com\.tw$ -(^|\.)i\.lithium\.com$ -(^|\.)i1\.hk$ -(^|\.)i2p2\.de$ -(^|\.)i2runner\.com$ -(^|\.)i818hk\.com$ -(^|\.)iam\.soy$ -(^|\.)iamtopone\.com$ -(^|\.)iask\.bz$ -(^|\.)iask\.ca$ -(^|\.)iav19\.com$ -(^|\.)ibiblio\.org$ -(^|\.)iblist\.com$ -(^|\.)iblogserv-f\.net$ -(^|\.)ibros\.org$ -(^|\.)ibvpn\.com$ -(^|\.)icams\.com$ -(^|\.)ice\.audionow\.com$ -(^|\.)icij\.org$ -(^|\.)icl-fi\.org$ -(^|\.)icoco\.com$ -(^|\.)iconpaper\.org$ -(^|\.)icu-project\.org$ -(^|\.)id\.hao123\.com$ -(^|\.)id\.heroku\.com$ -(^|\.)iddddg\.com$ -(^|\.)idemocracy\.asia$ -(^|\.)identi\.ca$ -(^|\.)idiomconnection\.com$ -(^|\.)idouga\.com$ -(^|\.)idreamx\.com$ -(^|\.)idv\.tw$ -(^|\.)ieasy5\.com$ -(^|\.)ied2k\.net$ -(^|\.)ienergy1\.com$ -(^|\.)if\.ttt$ -(^|\.)ifan\.cz\.cc$ -(^|\.)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$ -(^|\.)iipdigital\.usembassy\.gov$ -(^|\.)ikstar\.com$ -(^|\.)ikwb\.com$ -(^|\.)illusionfactory\.com$ -(^|\.)ilove80\.be$ -(^|\.)ilovelongtoes\.com$ -(^|\.)im\.tv$ -(^|\.)im88\.tw$ -(^|\.)imageab\.com$ -(^|\.)imagefap\.com$ -(^|\.)imageflea\.com$ -(^|\.)images-gaytube\.com$ -(^|\.)images\.comico\.tw$ -(^|\.)imageshack\.us$ -(^|\.)imagevenue\.com$ -(^|\.)imagezilla\.net$ -(^|\.)imb\.org$ -(^|\.)imdb\.com$ -(^|\.)img$ -(^|\.)img\.dlsite\.jp$ -(^|\.)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$ -(^|\.)in99\.org$ -(^|\.)incapdns\.net$ -(^|\.)incloak\.com$ -(^|\.)incredibox\.fr$ -(^|\.)indiandefensenews\.in$ -(^|\.)indiemerch\.com$ -(^|\.)info-graf\.fr$ -(^|\.)initiativesforchina\.org$ -(^|\.)inkui\.com$ -(^|\.)inmediahk\.net$ -(^|\.)innermongolia\.org$ -(^|\.)inote\.tw$ -(^|\.)insecam\.org$ -(^|\.)insidevoa\.com$ -(^|\.)instagram\.com$ -(^|\.)instanthq\.com$ -(^|\.)institut-tibetain\.org$ -(^|\.)international-news\.newsmagazine\.asia$ -(^|\.)internet\.org$ -(^|\.)internetdefenseleague\.org$ -(^|\.)internetfreedom\.org$ -(^|\.)internetpopculture\.com$ -(^|\.)inthenameofconfuciusmovie\.com$ -(^|\.)investigating\.wordpress\.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$ -(^|\.)iredmail\.org$ -(^|\.)ironbigfools\.compython\.net$ -(^|\.)ironpython\.net$ -(^|\.)ironsocket\.com$ -(^|\.)is-a-hunter\.com$ -(^|\.)is\.gd$ -(^|\.)isaacmao\.com$ -(^|\.)isasecret\.com$ -(^|\.)isc\.sans\.edu$ -(^|\.)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$ -(^|\.)istiqlalhewer\.com$ -(^|\.)istockphoto\.com$ -(^|\.)isunaffairs\.com$ -(^|\.)isuntv\.com$ -(^|\.)itaboo\.info$ -(^|\.)itaiwan\.gov\.tw$ -(^|\.)italiatibet\.org$ -(^|\.)itasoftware\.com$ -(^|\.)itemdb\.com$ -(^|\.)ithelp\.ithome\.com\.tw$ -(^|\.)its\.caltech\.edu$ -(^|\.)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$ -(^|\.)izaobao\.us$ -(^|\.)izles\.net$ -(^|\.)izlesem\.org$ -(^|\.)j\.mp$ -(^|\.)ja\.wikipedia\.org$ -(^|\.)jamaat\.org$ -(^|\.)jamyangnorbu\.com$ -(^|\.)jandyx\.com$ -(^|\.)janwongphoto\.com$ -(^|\.)japan-whores\.com$ -(^|\.)japanfirst\.asianfreeforum\.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$ -(^|\.)jiehua\.cz$ -(^|\.)jieshibaobao\.com$ -(^|\.)jigglegifs\.com$ -(^|\.)jigong1024\.com$ -(^|\.)jihadintel\.meforum\.org$ -(^|\.)jihadology\.net$ -(^|\.)jiji\.com$ -(^|\.)jims\.net$ -(^|\.)jinbushe\.org$ -(^|\.)jingpin\.org$ -(^|\.)jingsim\.org$ -(^|\.)jinpianwang\.com$ -(^|\.)jinroukong\.com$ -(^|\.)jintian\.net$ -(^|\.)jinx\.com$ -(^|\.)jitouch\.com$ -(^|\.)jizzthis\.com$ -(^|\.)jjgirls\.com$ -(^|\.)jkb\.cc$ -(^|\.)jkforum\.net$ -(^|\.)jkub\.com$ -(^|\.)jma\.go\.jp$ -(^|\.)jmscult\.com$ -(^|\.)joachims\.org$ -(^|\.)jobnewera\.wordpress\.com$ -(^|\.)jobso\.tv$ -(^|\.)joinmastodon\.org$ -(^|\.)journalchretien\.net$ -(^|\.)journalofdemocracy\.org$ -(^|\.)joymiihub\.com$ -(^|\.)joyourself\.com$ -(^|\.)jp\.hao123\.com$ -(^|\.)jpl\.nasa\.gov$ -(^|\.)jpopforum\.net$ -(^|\.)jtvnw\.net$ -(^|\.)jubushoushen\.com$ -(^|\.)juhuaren\.com$ -(^|\.)jukujo-club\.com$ -(^|\.)juliepost\.com$ -(^|\.)juliereyc\.com$ -(^|\.)junauza\.com$ -(^|\.)june4commemoration\.org$ -(^|\.)junefourth-20\.net$ -(^|\.)jungleheart\.com$ -(^|\.)juoaa\.com$ -(^|\.)justdied\.com$ -(^|\.)justfreevpn\.com$ -(^|\.)justicefortenzin\.org$ -(^|\.)justpaste\.it$ -(^|\.)justtristan\.com$ -(^|\.)juyuange\.org$ -(^|\.)juziyue\.com$ -(^|\.)jwmusic\.org$ -(^|\.)jyxf\.net$ -(^|\.)k-doujin\.net$ -(^|\.)ka-wai\.com$ -(^|\.)kagyu\.org$ -(^|\.)kagyu\.org\.za$ -(^|\.)kagyumonlam\.org$ -(^|\.)kagyunews\.com\.hk$ -(^|\.)kagyuoffice\.org$ -(^|\.)kagyuoffice\.org\.tw$ -(^|\.)kaiyuan\.de$ -(^|\.)kakao\.com$ -(^|\.)kalachakralugano\.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$ -(^|\.)kb\.monitorware\.com$ -(^|\.)kba-tx\.org$ -(^|\.)kcoolonline\.com$ -(^|\.)kebrum\.com$ -(^|\.)kechara\.com$ -(^|\.)keepandshare\.com$ -(^|\.)keezmovies\.com$ -(^|\.)kendatire\.com$ -(^|\.)kendincos\.net$ -(^|\.)kenengba\.com$ -(^|\.)keontech\.net$ -(^|\.)kepard\.com$ -(^|\.)kex\.com$ -(^|\.)keycdn\.com$ -(^|\.)khabdha\.org$ -(^|\.)khatrimaza\.org$ -(^|\.)khmusic\.com\.tw$ -(^|\.)kichiku-doujinko\.com$ -(^|\.)kik\.com$ -(^|\.)killwall\.com$ -(^|\.)kindleren\.com$ -(^|\.)kineox\.free\.fr$ -(^|\.)kingdomsalvation\.org$ -(^|\.)kinghost\.com$ -(^|\.)kingstone\.com\.tw$ -(^|\.)kink\.com$ -(^|\.)kinmen\.org\.tw$ -(^|\.)kinmen\.travel$ -(^|\.)kir\.jp$ -(^|\.)kissbbao\.cn$ -(^|\.)kiwi\.kz$ -(^|\.)kk-whys\.co\.jp$ -(^|\.)kkbox\.com$ -(^|\.)kknews\.cc$ -(^|\.)kmuh\.org\.tw$ -(^|\.)knowledgerush\.com$ -(^|\.)kobo\.com$ -(^|\.)kobobooks\.com$ -(^|\.)kodingen\.com$ -(^|\.)kompozer\.net$ -(^|\.)konachan\.com$ -(^|\.)kone\.com$ -(^|\.)koolsolutions\.com$ -(^|\.)koornk\.com$ -(^|\.)koranmandarin\.com$ -(^|\.)korenan2\.com$ -(^|\.)ksdl\.org$ -(^|\.)ksnews\.com\.tw$ -(^|\.)kspcoin\.com$ -(^|\.)ktzhk\.com$ -(^|\.)kucoin\.com$ -(^|\.)kui\.name$ -(^|\.)kun\.im$ -(^|\.)kurashsultan\.com$ -(^|\.)kurtmunger\.com$ -(^|\.)kusocity\.com$ -(^|\.)kwcg\.ca$ -(^|\.)kwongwah\.com\.my$ -(^|\.)kxsw\.life$ -(^|\.)kyofun\.com$ -(^|\.)kyohk\.net$ -(^|\.)kyoyue\.com$ -(^|\.)kyzyhello\.com$ -(^|\.)kzeng\.info$ -(^|\.)la-forum\.org$ -(^|\.)labiennale\.org$ -(^|\.)ladbrokes\.com$ -(^|\.)lagranepoca\.com$ -(^|\.)lalulalu\.com$ -(^|\.)lama\.com\.tw$ -(^|\.)lamayeshe\.com$ -(^|\.)lamnia\.co\.uk$ -(^|\.)lamrim\.com$ -(^|\.)lanterncn\.cn$ -(^|\.)lantosfoundation\.org$ -(^|\.)laod\.cn$ -(^|\.)laogai\.org$ -(^|\.)laomiu\.com$ -(^|\.)laoyang\.info$ -(^|\.)laptoplockdown\.com$ -(^|\.)laqingdan\.net$ -(^|\.)larsgeorge\.com$ -(^|\.)lastcombat\.com$ -(^|\.)lastfm\.es$ -(^|\.)latelinenews\.com$ -(^|\.)latibet\.org$ -(^|\.)lbank\.info$ -(^|\.)ld\.hao123img\.com$ -(^|\.)le-vpn\.com$ -(^|\.)leafyvpn\.net$ -(^|\.)lecloud\.net$ -(^|\.)leeao\.com\.cn$ -(^|\.)lefora\.com$ -(^|\.)left21\.hk$ -(^|\.)legalporno\.com$ -(^|\.)legaltech\.law\.com$ -(^|\.)legsjapan\.com$ -(^|\.)leirentv\.ca$ -(^|\.)leisurecafe\.ca$ -(^|\.)leisurepro\.com$ -(^|\.)lematin\.ch$ -(^|\.)lemonde\.fr$ -(^|\.)lenwhite\.com$ -(^|\.)lerosua\.org$ -(^|\.)lers\.google$ -(^|\.)lesoir\.be$ -(^|\.)letou\.com$ -(^|\.)letscorp\.net$ -(^|\.)lflink\.com$ -(^|\.)lflinkup\.com$ -(^|\.)lflinkup\.net$ -(^|\.)lflinkup\.org$ -(^|\.)lhakar\.org$ -(^|\.)lhasocialwork\.org$ -(^|\.)liangyou\.net$ -(^|\.)liangzhichuanmei\.com$ -(^|\.)lianyue\.net$ -(^|\.)liaowangxizang\.net$ -(^|\.)liberal\.org\.hk$ -(^|\.)libertytimes\.com\.tw$ -(^|\.)library\.usc\.cuhk\.edu\.hk$ -(^|\.)lidecheng\.com$ -(^|\.)lifemiles\.com$ -(^|\.)lighten\.org\.tw$ -(^|\.)lightnovel\.cn$ -(^|\.)lihkg\.com$ -(^|\.)like\.com$ -(^|\.)limiao\.net$ -(^|\.)line-apps\.com$ -(^|\.)line-scdn\.net$ -(^|\.)line\.me$ -(^|\.)line\.naver\.jp$ -(^|\.)linear-abematv\.akamaized\.net$ -(^|\.)linglingfa\.com$ -(^|\.)lingvodics\.com$ -(^|\.)link-o-rama\.com$ -(^|\.)linkideo\.com$ -(^|\.)linkuswell\.com$ -(^|\.)linux\.org\.hk$ -(^|\.)linuxtoy\.org$ -(^|\.)lionsroar\.com$ -(^|\.)lipuman\.com$ -(^|\.)liquidvpn\.com$ -(^|\.)listentoyoutube\.com$ -(^|\.)listorious\.com$ -(^|\.)lists\.w3\.org$ -(^|\.)liu-xiaobo\.org$ -(^|\.)liudejun\.com$ -(^|\.)liuhanyu\.com$ -(^|\.)liujianshu\.com$ -(^|\.)liuxiaobo\.net$ -(^|\.)liuxiaotong\.com$ -(^|\.)livecoin\.net$ -(^|\.)livedoor\.jp$ -(^|\.)liveleak\.com$ -(^|\.)livestation\.com$ -(^|\.)livestream\.com$ -(^|\.)livevideo\.com$ -(^|\.)livingonline\.us$ -(^|\.)livingstream\.com$ -(^|\.)liwangyang\.com$ -(^|\.)lizhizhuangbi\.com$ -(^|\.)lkcn\.net$ -(^|\.)llss\.me$ -(^|\.)load\.to$ -(^|\.)lobsangwangyal\.com$ -(^|\.)localbitcoins\.com$ -(^|\.)localdomain\.ws$ -(^|\.)localpresshk\.com$ -(^|\.)lockestek\.com$ -(^|\.)logbot\.net$ -(^|\.)login\.target\.com$ -(^|\.)logiqx\.com$ -(^|\.)londonchinese\.ca$ -(^|\.)longhair\.hk$ -(^|\.)longmusic\.com$ -(^|\.)longtermly\.net$ -(^|\.)longtoes\.com$ -(^|\.)lookpic\.com$ -(^|\.)looktoronto\.com$ -(^|\.)lotsawahouse\.org$ -(^|\.)lotuslight\.org\.hk$ -(^|\.)lotuslight\.org\.tw$ -(^|\.)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$ -(^|\.)luke54\.com$ -(^|\.)luke54\.org$ -(^|\.)lupm\.org$ -(^|\.)lushstories\.com$ -(^|\.)luxebc\.com$ -(^|\.)lvhai\.org$ -(^|\.)lvv2\.com$ -(^|\.)lyfhk\.net$ -(^|\.)lzmtnews\.org$ -(^|\.)m\.hkgalden\.com$ -(^|\.)m\.me$ -(^|\.)m\.plixi\.com$ -(^|\.)m\.slandr\.net$ -(^|\.)ma\.hao123\.com$ -(^|\.)macgamestore\.com$ -(^|\.)macrovpn\.com$ -(^|\.)macts\.com\.tw$ -(^|\.)mad-ar\.ch$ -(^|\.)madewithcode\.com$ -(^|\.)madonna-av\.com$ -(^|\.)madrau\.com$ -(^|\.)madthumbs\.com$ -(^|\.)magazines\.sina\.com\.tw$ -(^|\.)magic-net\.info$ -(^|\.)mahabodhi\.org$ -(^|\.)maiio\.net$ -(^|\.)mail-archive\.com$ -(^|\.)maildns\.xyz$ -(^|\.)maiplus\.com$ -(^|\.)maizhong\.org$ -(^|\.)makemymood\.com$ -(^|\.)makkahnewspaper\.com$ -(^|\.)makzhou\.warehouse333\.com$ -(^|\.)malaysiakini\.com$ -(^|\.)mamingzhe\.com$ -(^|\.)manchukuo\.net$ -(^|\.)mangafox\.com$ -(^|\.)mangafox\.me$ -(^|\.)maniash\.com$ -(^|\.)manicur4ik\.ru$ -(^|\.)mansion\.com$ -(^|\.)mansionpoker\.com$ -(^|\.)manta\.com$ -(^|\.)maplew\.com$ -(^|\.)marc\.info$ -(^|\.)marguerite\.su$ -(^|\.)martau\.com$ -(^|\.)martincartoons\.com$ -(^|\.)martsangkagyuofficial\.org$ -(^|\.)maruta\.be$ -(^|\.)marxist\.com$ -(^|\.)marxist\.net$ -(^|\.)marxists\.org$ -(^|\.)mash\.to$ -(^|\.)maskedip\.com$ -(^|\.)mastodon\.cloud$ -(^|\.)mastodon\.host$ -(^|\.)mastodon\.social$ -(^|\.)matainja\.com$ -(^|\.)material\.io$ -(^|\.)mathable\.io$ -(^|\.)mathiew-badimon\.com$ -(^|\.)matome-plus\.com$ -(^|\.)matome-plus\.net$ -(^|\.)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$ -(^|\.)me\.youthwant\.com\.tw$ -(^|\.)meansys\.com$ -(^|\.)media\.nu\.nl$ -(^|\.)media\.org\.hk$ -(^|\.)mediachinese\.com$ -(^|\.)mediafire\.com$ -(^|\.)mediafreakcity\.com$ -(^|\.)medium\.com$ -(^|\.)meetav\.com$ -(^|\.)meetup\.com$ -(^|\.)mefeedia\.com$ -(^|\.)mefound\.com$ -(^|\.)mega\.nz$ -(^|\.)megaproxy\.com$ -(^|\.)megarotic\.com$ -(^|\.)megavideo\.com$ -(^|\.)megurineluka\.com$ -(^|\.)meirixiaochao\.com$ -(^|\.)meltoday\.com$ -(^|\.)meme\.yahoo\.com$ -(^|\.)memehk\.com$ -(^|\.)memorybbs\.com$ -(^|\.)memri\.org$ -(^|\.)memrijttm\.org$ -(^|\.)mercatox\.com$ -(^|\.)mercyprophet\.org$ -(^|\.)mergersandinquisitions\.org$ -(^|\.)meridian-trust\.org$ -(^|\.)meripet\.biz$ -(^|\.)meripet\.com$ -(^|\.)merit-times\.com\.tw$ -(^|\.)meshrep\.com$ -(^|\.)mesotw\.com$ -(^|\.)messenger\.com$ -(^|\.)metacafe\.com$ -(^|\.)metart\.com$ -(^|\.)metarthunter\.com$ -(^|\.)meteorshowersonline\.com$ -(^|\.)metrohk\.com\.hk$ -(^|\.)metrolife\.ca$ -(^|\.)metroradio\.com\.hk$ -(^|\.)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$ -(^|\.)mike\.cz\.cc$ -(^|\.)mikesoltys\.com$ -(^|\.)milph\.net$ -(^|\.)milsurps\.com$ -(^|\.)mimiai\.net$ -(^|\.)mimivip\.com$ -(^|\.)mimivv\.com$ -(^|\.)mindrolling\.org$ -(^|\.)minghui-a\.org$ -(^|\.)minghui-b\.org$ -(^|\.)minghui-school\.org$ -(^|\.)minghui\.or\.kr$ -(^|\.)minghui\.org$ -(^|\.)minghuiyw\.wordpress\.com$ -(^|\.)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$ -(^|\.)mist\.vip$ -(^|\.)mitao\.com\.tw$ -(^|\.)mitbbs\.com$ -(^|\.)mitbbsau\.com$ -(^|\.)mixero\.com$ -(^|\.)mixpod\.com$ -(^|\.)mixx\.com$ -(^|\.)mizzmona\.com$ -(^|\.)mjib\.gov\.tw$ -(^|\.)mjlsh\.usc\.cuhk\.edu\.hk$ -(^|\.)mk5000\.com$ -(^|\.)mlcool\.com$ -(^|\.)mlzs\.work$ -(^|\.)mm-cg\.com$ -(^|\.)mmaaxx\.com$ -(^|\.)mmmca\.com$ -(^|\.)mnewstv\.com$ -(^|\.)mo\.nightlife141\.com$ -(^|\.)mobatek\.net$ -(^|\.)mobile01\.com$ -(^|\.)mobileways\.de$ -(^|\.)moby\.to$ -(^|\.)mobypicture\.com$ -(^|\.)moeaic\.gov\.tw$ -(^|\.)moeerolibrary\.com$ -(^|\.)mofa\.gov\.tw$ -(^|\.)mofaxiehui\.com$ -(^|\.)mofos\.com$ -(^|\.)mog\.com$ -(^|\.)mohu\.club$ -(^|\.)mohu\.ml$ -(^|\.)mojim\.com$ -(^|\.)mol\.gov\.tw$ -(^|\.)molihua\.org$ -(^|\.)mondex\.org$ -(^|\.)money-link\.com\.tw$ -(^|\.)moneyhome\.biz$ -(^|\.)monitorchina\.org$ -(^|\.)monster\.com$ -(^|\.)moodyz\.com$ -(^|\.)moonbbs\.com$ -(^|\.)moonbingo\.com$ -(^|\.)morningsun\.org$ -(^|\.)moroneta\.com$ -(^|\.)mos\.ru$ -(^|\.)motherless\.com$ -(^|\.)motiyun\.com$ -(^|\.)motor4ik\.ru$ -(^|\.)mousebreaker\.com$ -(^|\.)movements\.org$ -(^|\.)moviefap\.com$ -(^|\.)mp3buscador\.com$ -(^|\.)mp3ye\.eu$ -(^|\.)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$ -(^|\.)mswe1\.org$ -(^|\.)mthruf\.com$ -(^|\.)mtw\.tl$ -(^|\.)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$ -(^|\.)mx\.hao123\.com$ -(^|\.)mx981\.com$ -(^|\.)my-formosa\.com$ -(^|\.)my-private-network\.co\.uk$ -(^|\.)my-proxy\.com$ -(^|\.)my\.mail\.ru$ -(^|\.)my\.opera\.com$ -(^|\.)my\.pcloud\.com$ -(^|\.)my03\.com$ -(^|\.)myactimes\.com$ -(^|\.)myanniu\.com$ -(^|\.)myaudiocast\.com$ -(^|\.)myav\.com\.tw$ -(^|\.)mybbs\.us$ -(^|\.)mybet\.com$ -(^|\.)myca168\.com$ -(^|\.)mycanadanow\.com$ -(^|\.)mychinamyhome\.com$ -(^|\.)mychinanet\.com$ -(^|\.)mychinanews\.com$ -(^|\.)mychinese\.news$ -(^|\.)mycnnews\.com$ -(^|\.)mycould\.com$ -(^|\.)mydad\.info$ -(^|\.)myddns\.com$ -(^|\.)myeasytv\.com$ -(^|\.)myeclipseide\.com$ -(^|\.)myforum\.com\.hk$ -(^|\.)myforum\.com\.uk$ -(^|\.)myfreecams\.com$ -(^|\.)myfreepaysite\.com$ -(^|\.)myfreshnet\.com$ -(^|\.)myftp\.info$ -(^|\.)myftp\.name$ -(^|\.)myiphide\.com$ -(^|\.)mykomica\.org$ -(^|\.)mylftv\.com$ -(^|\.)mymediarom\.com$ -(^|\.)mymoe\.moe$ -(^|\.)mymom\.info$ -(^|\.)mymusic\.net\.tw$ -(^|\.)mynetav\.net$ -(^|\.)mynetav\.org$ -(^|\.)mynumber\.org$ -(^|\.)myparagliding\.com$ -(^|\.)mypicture\.info$ -(^|\.)mypop3\.net$ -(^|\.)mypop3\.org$ -(^|\.)mypopescu\.com$ -(^|\.)myradio\.hk$ -(^|\.)myreadingmanga\.info$ -(^|\.)mysecondarydns\.com$ -(^|\.)myshare\.url\.com\.tw$ -(^|\.)mysinablog\.com$ -(^|\.)mysite\.verizon\.net$ -(^|\.)myspace\.com$ -(^|\.)myspacecdn\.com$ -(^|\.)mytalkbox\.com$ -(^|\.)mytizi\.com$ -(^|\.)mywww\.biz$ -(^|\.)myz\.info$ -(^|\.)naacoalition\.org$ -(^|\.)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$ -(^|\.)nat\.gov\.tw$ -(^|\.)nat\.moe$ -(^|\.)national-lottery\.co\.uk$ -(^|\.)nationsonline\.org$ -(^|\.)nationwide\.com$ -(^|\.)naughtyamerica\.com$ -(^|\.)navyfamily\.navy\.mil$ -(^|\.)navyreserve\.navy\.mil$ -(^|\.)naweeklytimes\.com$ -(^|\.)nbtvpn\.com$ -(^|\.)nccwatch\.org\.tw$ -(^|\.)nch\.com\.tw$ -(^|\.)ncn\.org$ -(^|\.)nde\.de$ -(^|\.)ndr\.de$ -(^|\.)ned\.org$ -(^|\.)nekoslovakia\.net$ -(^|\.)nemesis2\.qx\.net$ -(^|\.)neo-miracle\.com$ -(^|\.)nepusoku\.com$ -(^|\.)net-fits\.pro$ -(^|\.)netbirds\.com$ -(^|\.)netcolony\.com$ -(^|\.)netflix\.com$ -(^|\.)netme\.cc$ -(^|\.)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$ -(^|\.)newipnow\.com$ -(^|\.)newlandmagazine\.com\.au$ -(^|\.)newnews\.ca$ -(^|\.)news\.cnyes\.com$ -(^|\.)news\.hk\.msn\.com$ -(^|\.)news\.hkpeanut\.com$ -(^|\.)news\.msn\.com\.tw$ -(^|\.)news\.nationalgeographic\.com$ -(^|\.)news\.now\.com$ -(^|\.)news\.now\.com%2fhome$ -(^|\.)news\.omy\.sg$ -(^|\.)news\.seehua\.com$ -(^|\.)news\.sina\.com\.hk$ -(^|\.)news\.sina\.com\.tw$ -(^|\.)news\.sinchew\.com\.my$ -(^|\.)news\.singtao\.ca$ -(^|\.)news\.tvb\.com$ -(^|\.)news\.tvbs\.com\.tw$ -(^|\.)news\.yahoo\.com$ -(^|\.)news100\.com\.tw$ -(^|\.)newsancai\.com$ -(^|\.)newschinacomment\.org$ -(^|\.)newscn\.org$ -(^|\.)newsdetox\.ca$ -(^|\.)newsdh\.com$ -(^|\.)newspeak\.cc$ -(^|\.)newstamago\.com$ -(^|\.)newstapa\.org$ -(^|\.)newstarnet\.com$ -(^|\.)newtaiwan\.com\.tw$ -(^|\.)newtalk\.tw$ -(^|\.)newyorktimes\.com$ -(^|\.)nexon\.com$ -(^|\.)next11\.co\.jp$ -(^|\.)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$ -(^|\.)nga\.mil$ -(^|\.)ngensis\.com$ -(^|\.)nhentai\.net$ -(^|\.)nhi\.gov\.tw$ -(^|\.)nhk-ondemand\.jp$ -(^|\.)nic\.cz\.cc$ -(^|\.)nic\.google$ -(^|\.)nic\.gov$ -(^|\.)nicovideo\.jp$ -(^|\.)nighost\.org$ -(^|\.)nikkei\.com$ -(^|\.)ninecommentaries\.com$ -(^|\.)ninjacloak\.com$ -(^|\.)ninjaproxy\.ninja$ -(^|\.)nintendium\.com$ -(^|\.)ninth\.biz$ -(^|\.)niu\.moe$ -(^|\.)niusnews\.com$ -(^|\.)njactb\.org$ -(^|\.)njuice\.com$ -(^|\.)nko\.navy\.mil$ -(^|\.)nlfreevpn\.com$ -(^|\.)no-ip\.org$ -(^|\.)nobel\.se$ -(^|\.)nobelprize\.org$ -(^|\.)nobodycanstop\.us$ -(^|\.)nofile\.io$ -(^|\.)nokogiri\.org$ -(^|\.)nokola\.com$ -(^|\.)noodlevpn\.com$ -(^|\.)norbulingka\.org$ -(^|\.)nordstrom\.com$ -(^|\.)nordstromimage\.com$ -(^|\.)nordstromrack\.com$ -(^|\.)nordvpn\.com$ -(^|\.)notify\.dropboxapi\.com$ -(^|\.)nottinghampost\.com$ -(^|\.)novelasia\.com$ -(^|\.)now\.com$ -(^|\.)now\.im$ -(^|\.)nownews\.com$ -(^|\.)nowtorrents\.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\.cz$ -(^|\.)ntdtv\.org$ -(^|\.)ntdtv\.ru$ -(^|\.)ntdtvla\.com$ -(^|\.)ntrfun\.com$ -(^|\.)ntsna\.gov\.tw$ -(^|\.)nubiles\.net$ -(^|\.)nuexpo\.com$ -(^|\.)nukistream\.com$ -(^|\.)nurgo-software\.com$ -(^|\.)nusatrip\.com$ -(^|\.)nutaku\.net$ -(^|\.)nuuvem\.com$ -(^|\.)nuvid\.com$ -(^|\.)nuzcom\.com$ -(^|\.)nvdst\.com$ -(^|\.)nvquan\.org$ -(^|\.)nvtongzhisheng\.org$ -(^|\.)nwtca\.org$ -(^|\.)ny\.stgloballink\.com$ -(^|\.)ny\.visiontimes\.com$ -(^|\.)nyaa\.eu$ -(^|\.)nydus\.ca$ -(^|\.)nylon-angel\.com$ -(^|\.)nylonstockingsonline\.com$ -(^|\.)nyt\.com$ -(^|\.)nytchina\.com$ -(^|\.)nytcn\.me$ -(^|\.)nytco\.com$ -(^|\.)nyti\.ms$ -(^|\.)nytimes\.com$ -(^|\.)nytimes\.map\.fastly\.net$ -(^|\.)nytimg\.com$ -(^|\.)nytstyle\.com$ -(^|\.)nzchinese\.com$ -(^|\.)nzchinese\.net\.nz$ -(^|\.)observechina\.net$ -(^|\.)obutu\.com$ -(^|\.)ocaspro\.com$ -(^|\.)occupytiananmen\.com$ -(^|\.)oclp\.hk$ -(^|\.)ocreampies\.com$ -(^|\.)ocry\.com$ -(^|\.)october-review\.org$ -(^|\.)oculus\.com$ -(^|\.)oculuscdn\.com$ -(^|\.)oex\.com$ -(^|\.)offbeatchina\.com$ -(^|\.)officeoftibet\.com$ -(^|\.)ofile\.org$ -(^|\.)ogaoga\.org$ -(^|\.)ogate\.org$ -(^|\.)oikos\.com\.tw$ -(^|\.)oiktv\.com$ -(^|\.)oizoblog\.com$ -(^|\.)ok\.ru$ -(^|\.)okayfreedom\.com$ -(^|\.)okex\.com$ -(^|\.)okk\.tw$ -(^|\.)old-cat\.net$ -(^|\.)old\.honeynet\.org$ -(^|\.)old\.nabble\.com$ -(^|\.)olumpo\.com$ -(^|\.)olympicwatch\.org$ -(^|\.)omgili\.com$ -(^|\.)omni7\.jp$ -(^|\.)omnitalk\.com$ -(^|\.)omnitalk\.org$ -(^|\.)on\.cc$ -(^|\.)on2\.com$ -(^|\.)onapp\.com$ -(^|\.)onedrive\.live\.com$ -(^|\.)onedumb\.com$ -(^|\.)onejav\.com$ -(^|\.)onion\.city$ -(^|\.)online\.recoveryversion\.org$ -(^|\.)onlinecha\.com$ -(^|\.)onlineyoutube\.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$ -(^|\.)openvpn\.net$ -(^|\.)openvpn\.org$ -(^|\.)openwebster\.com$ -(^|\.)openwrt\.org\.cn$ -(^|\.)opml\.radiotime\.com$ -(^|\.)opus-gaming\.com$ -(^|\.)organcare\.org\.tw$ -(^|\.)organharvestinvestigation\.net$ -(^|\.)organiccrap\.com$ -(^|\.)orgasm\.com$ -(^|\.)orgfree\.com$ -(^|\.)orient-doll\.com$ -(^|\.)orientaldaily\.com\.my$ -(^|\.)orn\.jp$ -(^|\.)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$ -(^|\.)overplay\.net$ -(^|\.)oversea\.istarshine\.com$ -(^|\.)ow\.ly$ -(^|\.)owl\.li$ -(^|\.)oyax\.com$ -(^|\.)oyghan\.com$ -(^|\.)ozchinese\.com$ -(^|\.)ozvoice\.org$ -(^|\.)ozxw\.com$ -(^|\.)ozyoyo\.com$ -(^|\.)pachosting\.com$ -(^|\.)pacificpoker\.com$ -(^|\.)packages\.debian\.org$ -(^|\.)packetix\.net$ -(^|\.)pacopacomama\.com$ -(^|\.)padmanet\.com$ -(^|\.)page\.bid\.yahoo\.com$ -(^|\.)page2rss\.com$ -(^|\.)pagodabox\.com$ -(^|\.)palacemoon\.com$ -(^|\.)paldengyal\.com$ -(^|\.)paljorpublications\.com$ -(^|\.)paltalk\.com$ -(^|\.)panamapapers\.sueddeutsche\.de$ -(^|\.)pandapow\.co$ -(^|\.)pandapow\.net$ -(^|\.)pandavpn-jp\.com$ -(^|\.)pandora\.com$ -(^|\.)pandora\.tv$ -(^|\.)panluan\.net$ -(^|\.)panoramio\.com$ -(^|\.)pao-pao\.net$ -(^|\.)paper\.li$ -(^|\.)paperb\.us$ -(^|\.)paradisehill\.cc$ -(^|\.)paradisepoker\.com$ -(^|\.)parkansky\.com$ -(^|\.)partycasino\.com$ -(^|\.)partypoker\.com$ -(^|\.)passion\.com$ -(^|\.)passiontimes\.hk$ -(^|\.)paste\.ee$ -(^|\.)pastebin\.com$ -(^|\.)pastie\.org$ -(^|\.)pbs\.org$ -(^|\.)pbwiki\.com$ -(^|\.)pbworks\.com$ -(^|\.)pbxes\.com$ -(^|\.)pbxes\.org$ -(^|\.)pcanywhere\.net$ -(^|\.)pcc\.gov\.tw$ -(^|\.)pcdvd\.com\.tw$ -(^|\.)pchome\.com\.tw$ -(^|\.)pcij\.org$ -(^|\.)pcstore\.com\.tw$ -(^|\.)pct\.org\.tw$ -(^|\.)pdetails\.com$ -(^|\.)pdproxy\.com$ -(^|\.)pds\.nasa\.gov$ -(^|\.)peace\.ca$ -(^|\.)peacefire\.org$ -(^|\.)peacehall\.com$ -(^|\.)pearlher\.org$ -(^|\.)peeasian\.com$ -(^|\.)pekingduck\.org$ -(^|\.)pemulihan\.or\.id$ -(^|\.)pen\.io$ -(^|\.)penchinese\.com$ -(^|\.)penchinese\.net$ -(^|\.)pengyulong\.com$ -(^|\.)penisbot\.com$ -(^|\.)penthouse\.com$ -(^|\.)pentoy\.hk$ -(^|\.)peoplebookcafe\.com$ -(^|\.)peoplenews\.tw$ -(^|\.)peopo\.org$ -(^|\.)percy\.in$ -(^|\.)perfectgirls\.net$ -(^|\.)perfectvpn\.net$ -(^|\.)periscope\.tv$ -(^|\.)persecutionblog\.com$ -(^|\.)persiankitty\.com$ -(^|\.)pfd\.org\.hk$ -(^|\.)phapluan\.org$ -(^|\.)phayul\.com$ -(^|\.)philborges\.com$ -(^|\.)philly\.com$ -(^|\.)phmsociety\.org$ -(^|\.)phncdn\.com$ -(^|\.)phobos\.apple\.com$ -(^|\.)phosphation13\.rssing\.com$ -(^|\.)photodharma\.net$ -(^|\.)photofocus\.com$ -(^|\.)phuquocservices\.com$ -(^|\.)picacomic\.com$ -(^|\.)picacomiccn\.com$ -(^|\.)picasaweb\.com$ -(^|\.)picidae\.net$ -(^|\.)pictures\.playboy\.com$ -(^|\.)picturesocial\.com$ -(^|\.)pin-cong\.com$ -(^|\.)pin6\.com$ -(^|\.)pincong\.rocks$ -(^|\.)ping\.fm$ -(^|\.)pinimg\.com$ -(^|\.)pinkrod\.com$ -(^|\.)pinoy-n\.com$ -(^|\.)pinterest\.at$ -(^|\.)pinterest\.co\.kr$ -(^|\.)pinterest\.co\.uk$ -(^|\.)pinterest\.com$ -(^|\.)pinterest\.de$ -(^|\.)pinterest\.dk$ -(^|\.)pinterest\.fr$ -(^|\.)pinterest\.jp$ -(^|\.)pinterest\.nl$ -(^|\.)pinterest\.se$ -(^|\.)pioneer-worker\.forums-free\.com$ -(^|\.)pipii\.tv$ -(^|\.)piposay\.com$ -(^|\.)piraattilahti\.org$ -(^|\.)piring\.com$ -(^|\.)pixelqi\.com$ -(^|\.)pixiv\.net$ -(^|\.)pixnet\.net$ -(^|\.)pk\.com$ -(^|\.)pki\.goog$ -(^|\.)placemix\.com$ -(^|\.)playboy\.com$ -(^|\.)playboyplus\.com$ -(^|\.)player\.fm$ -(^|\.)playno1\.com$ -(^|\.)playpcesor\.com$ -(^|\.)plays\.com\.tw$ -(^|\.)plm\.org\.hk$ -(^|\.)plunder\.com$ -(^|\.)plurk\.com$ -(^|\.)plus28\.com$ -(^|\.)plusbb\.com$ -(^|\.)pmatehunter\.com$ -(^|\.)pmates\.com$ -(^|\.)po2b\.com$ -(^|\.)pobieramy\.top$ -(^|\.)podictionary\.com$ -(^|\.)pokerstars\.com$ -(^|\.)pokerstars\.net$ -(^|\.)politicalchina\.org$ -(^|\.)politicalconsultation\.org$ -(^|\.)politiscales\.net$ -(^|\.)poloniex\.com$ -(^|\.)polymer-project\.org$ -(^|\.)polymerhk\.com$ -(^|\.)popo\.tw$ -(^|\.)popvote\.hk$ -(^|\.)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$ -(^|\.)potvpn\.com$ -(^|\.)power\.com$ -(^|\.)powerapple\.com$ -(^|\.)powercx\.com$ -(^|\.)powerphoto\.org$ -(^|\.)prayforchina\.net$ -(^|\.)premeforwindows7\.com$ -(^|\.)premproxy\.com$ -(^|\.)presentationzen\.com$ -(^|\.)presidentlee\.tw$ -(^|\.)prestige-av\.com$ -(^|\.)pride\.google$ -(^|\.)prisoner-state-secret-journal-premier$ -(^|\.)prisoneralert\.com$ -(^|\.)pritunl\.com$ -(^|\.)privacybox\.de$ -(^|\.)private\.com$ -(^|\.)privateinternetaccess\.com$ -(^|\.)privatepaste\.com$ -(^|\.)privatetunnel\.com$ -(^|\.)privatevpn\.com$ -(^|\.)procopytips\.com$ -(^|\.)prosiben\.de$ -(^|\.)protonvpn\.com$ -(^|\.)provideocoalition\.com$ -(^|\.)provpnaccounts\.com$ -(^|\.)proxfree\.com$ -(^|\.)proxifier\.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$ -(^|\.)psiphon\.ca$ -(^|\.)psiphon\.civisec\.org$ -(^|\.)psiphon3\.com$ -(^|\.)psiphontoday\.com$ -(^|\.)pts\.org\.tw$ -(^|\.)ptt\.cc$ -(^|\.)pttvan\.org$ -(^|\.)pubu\.com\.tw$ -(^|\.)puffinbrowser\.com$ -(^|\.)puffstore\.com$ -(^|\.)pullfolio\.com$ -(^|\.)pulse\.yahoo\.com$ -(^|\.)punyu\.com$ -(^|\.)pure18\.com$ -(^|\.)pureconcepts\.net$ -(^|\.)pureinsight\.org$ -(^|\.)purepdf\.com$ -(^|\.)purevpn\.com$ -(^|\.)purplelotus\.org$ -(^|\.)pursuestar\.com$ -(^|\.)pushchinawall\.com$ -(^|\.)pussyspace\.com$ -(^|\.)putihome\.org$ -(^|\.)putlocker\.com$ -(^|\.)putty\.org$ -(^|\.)puuko\.com$ -(^|\.)pwned\.com$ -(^|\.)python\.com$ -(^|\.)python\.com\.tw$ -(^|\.)pythonhackers\.com$ -(^|\.)pytorch\.org$ -(^|\.)q%3dfreedom$ -(^|\.)q%3dtriangle$ -(^|\.)q=freedom$ -(^|\.)q=triangle$ -(^|\.)qanote\.com$ -(^|\.)qgirl\.com\.tw$ -(^|\.)qhigh\.com$ -(^|\.)qi-gong\.me$ -(^|\.)qiandao\.today$ -(^|\.)qiangyou\.org$ -(^|\.)qidian\.ca$ -(^|\.)qienkuen\.org$ -(^|\.)qiwen\.lu$ -(^|\.)qixianglu\.cn$ -(^|\.)qkshare\.com$ -(^|\.)qoos\.com$ -(^|\.)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$ -(^|\.)qxbbs\.org$ -(^|\.)r18\.com$ -(^|\.)ra\.gg$ -(^|\.)radicalparty\.org$ -(^|\.)radiko\.jp$ -(^|\.)radioaustralia\.net\.au$ -(^|\.)radiohilight\.net$ -(^|\.)radiovaticana\.org$ -(^|\.)radiovncr\.com$ -(^|\.)rael\.org$ -(^|\.)raggedbanner\.com$ -(^|\.)raidcall\.com\.tw$ -(^|\.)raidtalk\.com\.tw$ -(^|\.)rainbowplan\.org$ -(^|\.)raizoji\.or\.jp$ -(^|\.)ramcity\.com\.au$ -(^|\.)rangwang\.biz$ -(^|\.)rangzen\.com$ -(^|\.)rangzen\.net$ -(^|\.)rangzen\.org$ -(^|\.)ranyunfei\.com$ -(^|\.)rapbull\.net$ -(^|\.)rapidgator\.net$ -(^|\.)rapidmoviez\.com$ -(^|\.)rapidvpn\.com$ -(^|\.)raremovie\.cc$ -(^|\.)raremovie\.net$ -(^|\.)rawgit\.com$ -(^|\.)rawgithub\.com$ -(^|\.)razyboard\.com$ -(^|\.)rcam\.target\.com$ -(^|\.)rcinet\.ca$ -(^|\.)rconversation\.blogs\.com$ -(^|\.)rd\.com$ -(^|\.)rdio\.com$ -(^|\.)read01\.com$ -(^|\.)read100\.com$ -(^|\.)readingtimes\.com\.tw$ -(^|\.)readmoo\.com$ -(^|\.)readydown\.com$ -(^|\.)realcourage\.org$ -(^|\.)realforum\.zkiz\.com$ -(^|\.)realitykings\.com$ -(^|\.)realraptalk\.com$ -(^|\.)realsexpass\.com$ -(^|\.)rebatesrule\.net$ -(^|\.)recordhistory\.org$ -(^|\.)recovery\.org\.tw$ -(^|\.)recoveryversion\.com\.tw$ -(^|\.)red-lang\.org$ -(^|\.)redballoonsolidarity\.org$ -(^|\.)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$ -(^|\.)religioustolerance\.org$ -(^|\.)remembering_tiananmen_20_years$ -(^|\.)renminbao\.com$ -(^|\.)renyurenquan\.org$ -(^|\.)research\.jmsc\.hku\.hk$ -(^|\.)resilio\.com$ -(^|\.)retweeteffect\.com$ -(^|\.)retweetist\.com$ -(^|\.)retweetrank\.com$ -(^|\.)reuters\.com$ -(^|\.)reutersmedia\.net$ -(^|\.)revleft\.com$ -(^|\.)revver\.com$ -(^|\.)rfa\.org$ -(^|\.)rfachina\.com$ -(^|\.)rfalive1\.akacast\.akamaistream\.net$ -(^|\.)rfamobile\.org$ -(^|\.)rfaweb\.org$ -(^|\.)rferl\.org$ -(^|\.)rfi\.fr$ -(^|\.)rfi\.my$ -(^|\.)rg3\.github\.io$ -(^|\.)rightbtc\.com$ -(^|\.)rigpa\.org$ -(^|\.)riku\.me$ -(^|\.)rileyguide\.com$ -(^|\.)ritouki\.jp$ -(^|\.)ritter\.vg$ -(^|\.)rixcloud\.com$ -(^|\.)rixcloud\.us$ -(^|\.)rlwlw\.com$ -(^|\.)rmjdw\.com$ -(^|\.)rmjdw132\.info$ -(^|\.)roadshow\.hk$ -(^|\.)roboforex\.com$ -(^|\.)robustnessiskey\.com$ -(^|\.)rocket-inc\.net$ -(^|\.)rocksdb\.org$ -(^|\.)rojo\.com$ -(^|\.)rolia\.net$ -(^|\.)ronjoneswriter\.com$ -(^|\.)roodo\.com$ -(^|\.)rosechina\.net$ -(^|\.)rotten\.com$ -(^|\.)rsdlmonitor\.com$ -(^|\.)rsf-chinese\.org$ -(^|\.)rsf\.org$ -(^|\.)rsgamen\.org$ -(^|\.)rssmeme\.com$ -(^|\.)rtalabel\.org$ -(^|\.)rthk\.hk$ -(^|\.)rthk\.org\.hk$ -(^|\.)rthklive2-lh\.akamaihd\.net$ -(^|\.)rti\.org\.tw$ -(^|\.)rtycminnesota\.org$ -(^|\.)ruanyifeng\.com$ -(^|\.)rukor\.org$ -(^|\.)runbtx\.com$ -(^|\.)rushbee\.com$ -(^|\.)ruten\.com\.tw$ -(^|\.)rutube\.ru$ -(^|\.)ruyiseek\.com$ -(^|\.)rxhj\.net$ -(^|\.)s-cute\.com$ -(^|\.)s-dragon\.org$ -(^|\.)s1\.nudezz\.com$ -(^|\.)s1heng\.com$ -(^|\.)s1s1s1\.com$ -(^|\.)s3-ap-northeast-1\.amazonaws\.com$ -(^|\.)s3-ap-southeast-2\.amazonaws\.com$ -(^|\.)s8forum\.com$ -(^|\.)sa\.hao123\.com$ -(^|\.)sacks\.com$ -(^|\.)sacom\.hk$ -(^|\.)sadistic-v\.com$ -(^|\.)sadpanda\.us$ -(^|\.)safervpn\.com$ -(^|\.)safety\.google$ -(^|\.)saintyculture\.com$ -(^|\.)saiq\.me$ -(^|\.)sakuralive\.com$ -(^|\.)sakya\.org$ -(^|\.)salvation\.org\.hk$ -(^|\.)samair\.ru$ -(^|\.)sambhota\.org$ -(^|\.)sanmin\.com\.tw$ -(^|\.)sapikachu\.net$ -(^|\.)saveliuxiaobo\.com$ -(^|\.)savemedia\.com$ -(^|\.)savethedate\.foo$ -(^|\.)savethesounds\.info$ -(^|\.)savetibet\.de$ -(^|\.)savetibet\.fr$ -(^|\.)savetibet\.nl$ -(^|\.)savetibet\.org$ -(^|\.)savetibet\.ru$ -(^|\.)savetibetstore\.org$ -(^|\.)savevid\.com$ -(^|\.)say2\.info$ -(^|\.)sbme\.me$ -(^|\.)sbs\.com\.au$ -(^|\.)scache\.vzw\.com$ -(^|\.)scache1\.vzw\.com$ -(^|\.)scache2\.vzw\.com$ -(^|\.)scasino\.com$ -(^|\.)schema\.org$ -(^|\.)sciencenets\.com$ -(^|\.)scieron\.com$ -(^|\.)scmp\.com$ -(^|\.)scmpchinese\.com$ -(^|\.)scramble\.io$ -(^|\.)scribd\.com$ -(^|\.)scriptspot\.com$ -(^|\.)seapuff\.com$ -(^|\.)search$ -(^|\.)search\.aol\.com$ -(^|\.)search\.yahoo\.co\.jp$ -(^|\.)search\.yahoo\.com$ -(^|\.)searchtruth\.com$ -(^|\.)secretchina\.com$ -(^|\.)secretgarden\.no$ -(^|\.)secretsline\.biz$ -(^|\.)secure\.hustler\.com$ -(^|\.)secure\.logmein\.com$ -(^|\.)secure\.raxcdn\.com$ -(^|\.)securetunnel\.com$ -(^|\.)securityinabox\.org$ -(^|\.)securitykiss\.com$ -(^|\.)seed4\.me$ -(^|\.)seesmic\.com$ -(^|\.)seevpn\.com$ -(^|\.)seezone\.net$ -(^|\.)sejie\.com$ -(^|\.)sellclassics\.com$ -(^|\.)sendsmtp\.com$ -(^|\.)sendspace\.com$ -(^|\.)servehttp\.com$ -(^|\.)serveuser\.com$ -(^|\.)serveusers\.com$ -(^|\.)sesawe\.net$ -(^|\.)sesawe\.org$ -(^|\.)sethwklein\.net$ -(^|\.)setn\.com$ -(^|\.)settv\.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$ -(^|\.)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$ -(^|\.)shambalapost\.com$ -(^|\.)shambhalasun\.com$ -(^|\.)shangfang\.org$ -(^|\.)shapeservices\.com$ -(^|\.)share\.dmhy\.org$ -(^|\.)share\.ovi\.com$ -(^|\.)share\.youthwant\.com\.tw$ -(^|\.)sharebee\.com$ -(^|\.)sharecool\.org$ -(^|\.)sharpdaily\.com\.hk$ -(^|\.)sharpdaily\.hk$ -(^|\.)sharpdaily\.tw$ -(^|\.)shat-tibet\.com$ -(^|\.)shattered\.io$ -(^|\.)sheikyermami\.com$ -(^|\.)shellfire\.de$ -(^|\.)shenshou\.org$ -(^|\.)shenyun\.com$ -(^|\.)shenyunperformingarts\.org$ -(^|\.)shenzhoufilm\.com$ -(^|\.)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$ -(^|\.)shopping\.com$ -(^|\.)showbiz\.omy\.sg$ -(^|\.)showhaotu\.com$ -(^|\.)showtime\.jp$ -(^|\.)shutterstock\.com$ -(^|\.)shwchurch\.org$ -(^|\.)shwchurch3\.com$ -(^|\.)siddharthasintent\.org$ -(^|\.)sidelinesnews\.com$ -(^|\.)sidelinessportseatery\.com$ -(^|\.)sierrafriendsoftibet\.org$ -(^|\.)sijihuisuo\.club$ -(^|\.)sijihuisuo\.com$ -(^|\.)sikaozhe1997\.github\.io$ -(^|\.)silkbook\.com$ -(^|\.)simbolostwitter\.com$ -(^|\.)simplecd\.org$ -(^|\.)simpleproductivityblog\.com$ -(^|\.)sinchew\.com\.my$ -(^|\.)singaporepools\.com\.sg$ -(^|\.)singfortibet\.com$ -(^|\.)singpao\.com\.hk$ -(^|\.)singtao\.com$ -(^|\.)singtaousa\.com$ -(^|\.)sino-monthly\.com$ -(^|\.)sinoants\.com$ -(^|\.)sinocast\.com$ -(^|\.)sinocism\.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$ -(^|\.)siteks\.uk\.to$ -(^|\.)sitemaps\.org$ -(^|\.)six-degrees\.io$ -(^|\.)sixth\.biz$ -(^|\.)sjrt\.org$ -(^|\.)sjum\.cn$ -(^|\.)sketchappsources\.com$ -(^|\.)skimtube\.com$ -(^|\.)skybet\.com$ -(^|\.)skyking\.com\.tw$ -(^|\.)skyvegas\.com$ -(^|\.)skyxvpn\.com$ -(^|\.)slacker\.com$ -(^|\.)slaytizle\.com$ -(^|\.)sleazydream\.com$ -(^|\.)slheng\.com$ -(^|\.)slickvpn\.com$ -(^|\.)slideshare\.net$ -(^|\.)slinkset\.com$ -(^|\.)slutload\.com$ -(^|\.)slutmoonbeam\.com$ -(^|\.)slyip\.com$ -(^|\.)slyip\.net$ -(^|\.)sm-miracle\.com$ -(^|\.)smartdnsproxy\.com$ -(^|\.)smarthide\.com$ -(^|\.)smchbooks\.com$ -(^|\.)smh\.com\.au$ -(^|\.)smhric\.org$ -(^|\.)smith\.edu$ -(^|\.)smyxy\.org$ -(^|\.)snapchat\.com$ -(^|\.)snaptu\.com$ -(^|\.)sndcdn\.com$ -(^|\.)sneakme\.net$ -(^|\.)snowlionpub\.com$ -(^|\.)sobees\.com$ -(^|\.)soc\.mil$ -(^|\.)socialwhale\.com$ -(^|\.)socks-proxy\.net$ -(^|\.)sockscap64\.com$ -(^|\.)sockslist\.net$ -(^|\.)socrec\.org$ -(^|\.)sod\.co\.jp$ -(^|\.)sodatea\.github\.io$ -(^|\.)softether-download\.com$ -(^|\.)softether\.co\.jp$ -(^|\.)softether\.org$ -(^|\.)softsmirror\.cf$ -(^|\.)softwarebychuck\.com$ -(^|\.)softwaredownload\.gitbooks\.io$ -(^|\.)sogclub\.com$ -(^|\.)sogrady\.me$ -(^|\.)soh\.tw$ -(^|\.)sohcradio\.com$ -(^|\.)sohfrance\.org$ -(^|\.)sokamonline\.com$ -(^|\.)sokmil\.com$ -(^|\.)solarsystem\.nasa\.gov$ -(^|\.)solidaritetibet\.org$ -(^|\.)solidfiles\.com$ -(^|\.)somee\.com$ -(^|\.)songjianjun\.com$ -(^|\.)sonicbbs\.cc$ -(^|\.)sonidodelaesperanza\.org$ -(^|\.)sopcast\.com$ -(^|\.)sopcast\.org$ -(^|\.)sorazone\.net$ -(^|\.)sorting-algorithms\.com$ -(^|\.)sos\.org$ -(^|\.)sosreader\.com$ -(^|\.)sostibet\.org$ -(^|\.)soubory\.com$ -(^|\.)soul-plus\.net$ -(^|\.)soulcaliburhentai\.net$ -(^|\.)soumo\.info$ -(^|\.)soundcloud\.com$ -(^|\.)soundofhope\.kr$ -(^|\.)soundofhope\.org$ -(^|\.)soup\.io$ -(^|\.)soupofmedia\.com$ -(^|\.)sourceforge\.net$ -(^|\.)sourcewadio\.com$ -(^|\.)southnews\.com\.tw$ -(^|\.)sowers\.org\.hk$ -(^|\.)soylentnews\.org$ -(^|\.)spaces\.hightail\.com$ -(^|\.)spankbang\.com$ -(^|\.)spankingtube\.com$ -(^|\.)spankwire\.com$ -(^|\.)spb\.com$ -(^|\.)speakerdeck\.com$ -(^|\.)specxinzl\.jigsy\.com$ -(^|\.)speedify\.com$ -(^|\.)spem\.at$ -(^|\.)spencertipping\.com$ -(^|\.)spendee\.com$ -(^|\.)spicevpn\.com$ -(^|\.)spideroak\.com$ -(^|\.)spike\.com$ -(^|\.)sports\.williamhill\.com$ -(^|\.)spotflux\.com$ -(^|\.)spotify\.com$ -(^|\.)spreadshirt\.es$ -(^|\.)spring4u\.info$ -(^|\.)springboardplatform\.com$ -(^|\.)sprite\.org$ -(^|\.)sproutcore\.com$ -(^|\.)sproxy\.info$ -(^|\.)squirly\.info$ -(^|\.)srcf\.ucam\.org$ -(^|\.)srocket\.us$ -(^|\.)ss-link\.com$ -(^|\.)ss\.carryzhou\.com$ -(^|\.)ss\.levyhsu\.com$ -(^|\.)ss\.pythonic\.life$ -(^|\.)ss7\.vzw\.com$ -(^|\.)ssglobal\.co$ -(^|\.)ssglobal\.me$ -(^|\.)ssh91\.com$ -(^|\.)ssl\.webpack\.de$ -(^|\.)ssl443\.org$ -(^|\.)sspanel\.net$ -(^|\.)sspro\.ml$ -(^|\.)ssr\.tools$ -(^|\.)ssrshare\.com$ -(^|\.)sss\.camp$ -(^|\.)sstmlt\.moe$ -(^|\.)sstmlt\.net$ -(^|\.)stackoverflow\.com$ -(^|\.)stage64\.hk$ -(^|\.)standupfortibet\.org$ -(^|\.)stanford\.edu$ -(^|\.)starfishfx\.com$ -(^|\.)starp2p\.com$ -(^|\.)startpage\.com$ -(^|\.)startuplivingchina\.com$ -(^|\.)stat\.gov\.tw$ -(^|\.)static-economist\.com$ -(^|\.)static\.comico\.tw$ -(^|\.)static\.shemalez\.com$ -(^|\.)static01\.nyt\.com$ -(^|\.)staticflickr\.com$ -(^|\.)statueofdemocracy\.org$ -(^|\.)stc\.com\.sa$ -(^|\.)steamcommunity\.com$ -(^|\.)steel-storm\.com$ -(^|\.)steganos\.com$ -(^|\.)steganos\.net$ -(^|\.)stepchina\.com$ -(^|\.)stephaniered\.com$ -(^|\.)sthoo\.com$ -(^|\.)stickam\.com$ -(^|\.)stickeraction\.com$ -(^|\.)stileproject\.com$ -(^|\.)sto\.cc$ -(^|\.)stoporganharvesting\.org$ -(^|\.)stoptibetcrisis\.net$ -(^|\.)storagenewsletter\.com$ -(^|\.)store\.steampowered\.com$ -(^|\.)stories\.google$ -(^|\.)storify\.com$ -(^|\.)storm\.mg$ -(^|\.)stormmediagroup\.com$ -(^|\.)stoweboyd\.com$ -(^|\.)stranabg\.com$ -(^|\.)straplessdildo\.com$ -(^|\.)streamingthe\.net$ -(^|\.)streema\.com$ -(^|\.)strikingly\.com$ -(^|\.)strongvpn\.com$ -(^|\.)strongwindpress\.com$ -(^|\.)student\.tw$ -(^|\.)studentsforafreetibet\.org$ -(^|\.)stumbleupon\.com$ -(^|\.)stupidvideos\.com$ -(^|\.)subacme\.rerouted\.org$ -(^|\.)successfn\.com$ -(^|\.)sugarsync\.com$ -(^|\.)sugobbs\.com$ -(^|\.)sugumiru18\.com$ -(^|\.)suissl\.com$ -(^|\.)sujiatun\.wordpress\.com$ -(^|\.)sukebei\.nyaa\.si$ -(^|\.)sulian\.me$ -(^|\.)summify\.com$ -(^|\.)sumrando\.com$ -(^|\.)sun1911\.com$ -(^|\.)sunmedia\.ca$ -(^|\.)sunporno\.com$ -(^|\.)sunskyforum\.com$ -(^|\.)sunta\.com\.tw$ -(^|\.)sunvpn\.net$ -(^|\.)sunwinism\.joinbbs\.net$ -(^|\.)suoluo\.org$ -(^|\.)supchina\.com$ -(^|\.)superfreevpn\.com$ -(^|\.)superokayama\.com$ -(^|\.)superpages\.com$ -(^|\.)supervpn\.net$ -(^|\.)superzooi\.com$ -(^|\.)suppig\.net$ -(^|\.)suprememastertv\.com$ -(^|\.)surfeasy\.com$ -(^|\.)surfeasy\.com\.au$ -(^|\.)suroot\.com$ -(^|\.)surrenderat20\.net$ -(^|\.)sustainability\.google$ -(^|\.)suyangg\.com$ -(^|\.)svsfx\.com$ -(^|\.)swagbucks\.com$ -(^|\.)swissinfo\.ch$ -(^|\.)swissvpn\.net$ -(^|\.)switch1\.jp$ -(^|\.)switchvpn\.net$ -(^|\.)sydneytoday\.com$ -(^|\.)sylfoundation\.org$ -(^|\.)syncback\.com$ -(^|\.)synergyse\.com$ -(^|\.)sysresccd\.org$ -(^|\.)sytes\.net$ -(^|\.)szbbs\.net$ -(^|\.)szetowah\.org\.hk$ -(^|\.)t-g\.com$ -(^|\.)t\.co$ -(^|\.)t\.me$ -(^|\.)t\.orzdream\.com$ -(^|\.)t35\.com$ -(^|\.)t66y\.com$ -(^|\.)taa-usa\.org$ -(^|\.)taaze\.tw$ -(^|\.)tabtter\.jp$ -(^|\.)tacc\.cwb\.gov\.tw$ -(^|\.)tacem\.org$ -(^|\.)taconet\.com\.tw$ -(^|\.)taedp\.org\.tw$ -(^|\.)tafm\.org$ -(^|\.)tagwa\.org\.au$ -(^|\.)tagwalk\.com$ -(^|\.)tahr\.org\.tw$ -(^|\.)taipei\.gov\.tw$ -(^|\.)taipeisociety\.org$ -(^|\.)taiwan-sex\.com$ -(^|\.)taiwanbible\.com$ -(^|\.)taiwancon\.com$ -(^|\.)taiwandaily\.net$ -(^|\.)taiwandc\.org$ -(^|\.)taiwanjobs\.gov\.tw$ -(^|\.)taiwanjustice\.com$ -(^|\.)taiwanjustice\.net$ -(^|\.)taiwankiss\.com$ -(^|\.)taiwannation\.50webs\.com$ -(^|\.)taiwannation\.com$ -(^|\.)taiwannation\.com\.tw$ -(^|\.)taiwanncf\.org\.tw$ -(^|\.)taiwannews\.com\.tw$ -(^|\.)taiwantp\.net$ -(^|\.)taiwantt\.org\.tw$ -(^|\.)taiwanus\.net$ -(^|\.)taiwanyes\.com$ -(^|\.)taiwanyes\.ning\.com$ -(^|\.)talk853\.com$ -(^|\.)talkboxapp\.com$ -(^|\.)talkcc\.com$ -(^|\.)talkonly\.net$ -(^|\.)tamiaode\.tk$ -(^|\.)tanc\.org$ -(^|\.)tangben\.com$ -(^|\.)tangren\.us$ -(^|\.)taoism\.net$ -(^|\.)taolun\.info$ -(^|\.)tapanwap\.com$ -(^|\.)tapatalk\.com$ -(^|\.)tarr\.uspto\.gov$ -(^|\.)tascn\.com\.au$ -(^|\.)taup\.net$ -(^|\.)taweet\.com$ -(^|\.)tbcollege\.org$ -(^|\.)tbi\.org\.hk$ -(^|\.)tbicn\.org$ -(^|\.)tbjyt\.org$ -(^|\.)tbpic\.info$ -(^|\.)tbrc\.org$ -(^|\.)tbs-rainbow\.org$ -(^|\.)tbsec\.org$ -(^|\.)tbskkinabalu\.page\.tl$ -(^|\.)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$ -(^|\.)tdm\.com\.mo$ -(^|\.)teachparentstech\.org$ -(^|\.)teamamericany\.com$ -(^|\.)tech2\.in\.com$ -(^|\.)techviz\.net$ -(^|\.)teck\.in$ -(^|\.)teco-hk\.org$ -(^|\.)teco-mo\.org$ -(^|\.)teddysun\.com$ -(^|\.)teeniefuck\.net$ -(^|\.)teensinasia\.com$ -(^|\.)telecomspace\.com$ -(^|\.)telegram\.dog$ -(^|\.)telegram\.me$ -(^|\.)telegram\.org$ -(^|\.)telegramdownload\.com$ -(^|\.)telegraph\.co\.uk$ -(^|\.)telesco\.pe$ -(^|\.)tellme\.pw$ -(^|\.)tenacy\.com$ -(^|\.)tensorflow\.org$ -(^|\.)tenzinpalmo\.com$ -(^|\.)terminus2049\.github\.io$ -(^|\.)tew\.org$ -(^|\.)textnow\.me$ -(^|\.)th\.hao123\.com$ -(^|\.)thaicn\.com$ -(^|\.)thb\.gov\.tw$ -(^|\.)theatrum-belli\.com$ -(^|\.)thebcomplex\.com$ -(^|\.)theblemish\.com$ -(^|\.)thebobs\.com$ -(^|\.)thebodyshop-usa\.com$ -(^|\.)thecenter\.mit\.edu$ -(^|\.)thechinabeat\.org$ -(^|\.)thedalailamamovie\.com$ -(^|\.)thedw\.us$ -(^|\.)thefacebook\.com$ -(^|\.)thefrontier\.hk$ -(^|\.)thegioitinhoc\.vn$ -(^|\.)thegly\.com$ -(^|\.)thehots\.info$ -(^|\.)thehousenews\.com$ -(^|\.)thehun\.net$ -(^|\.)theinitium\.com$ -(^|\.)thenewslens\.com$ -(^|\.)thepiratebay\.org$ -(^|\.)theporndude\.com$ -(^|\.)theportalwiki\.com$ -(^|\.)thereallove\.kr$ -(^|\.)therock\.net\.nz$ -(^|\.)thespeeder\.com$ -(^|\.)thestandnews\.com$ -(^|\.)thetibetcenter\.org$ -(^|\.)thetibetconnection\.org$ -(^|\.)thetibetmuseum\.org$ -(^|\.)thetibetpost\.com$ -(^|\.)thetinhat\.com$ -(^|\.)thetrotskymovie\.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-info\.net$ -(^|\.)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$ -(^|\.)tibetanfeministcollective\.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$ -(^|\.)tibetlibre\.free\.fr$ -(^|\.)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$ -(^|\.)tiltbrush\.com$ -(^|\.)timdir\.com$ -(^|\.)time\.com$ -(^|\.)times\.hinet\.net$ -(^|\.)timesofindia\.indiatimes\.com$ -(^|\.)timsah\.com$ -(^|\.)tinc-vpn\.org$ -(^|\.)tineye\.com$ -(^|\.)tintuc101\.com$ -(^|\.)tiny\.cc$ -(^|\.)tinychat\.com$ -(^|\.)tinypaste\.com$ -(^|\.)tipo\.gov\.tw$ -(^|\.)tistory\.com$ -(^|\.)tkcs-collins\.com$ -(^|\.)tl\.gd$ -(^|\.)tma\.co\.jp$ -(^|\.)tmagazine\.com$ -(^|\.)tmdfish\.com$ -(^|\.)tmi\.me$ -(^|\.)tmpp\.org$ -(^|\.)tn1\.shemalez\.com$ -(^|\.)tn2\.shemalez\.com$ -(^|\.)tn3\.shemalez\.com$ -(^|\.)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$ -(^|\.)tongil\.or\.kr$ -(^|\.)tono-oka\.jp$ -(^|\.)tonyyan\.net$ -(^|\.)toodoc\.com$ -(^|\.)toonel\.net$ -(^|\.)top\.tv$ -(^|\.)top10vpn\.com$ -(^|\.)top81\.ws$ -(^|\.)topbtc\.com$ -(^|\.)topic\.youthwant\.com\.tw$ -(^|\.)topnews\.in$ -(^|\.)toppornsites\.com$ -(^|\.)topshareware\.com$ -(^|\.)topsy\.com$ -(^|\.)toptip\.ca$ -(^|\.)tor\.blingblingsquad\.net$ -(^|\.)tor\.cn\.uptodown\.com$ -(^|\.)tor\.updatestar\.com$ -(^|\.)tora\.to$ -(^|\.)torcn\.com$ -(^|\.)torguard\.net$ -(^|\.)torproject\.org$ -(^|\.)torrentprivacy\.com$ -(^|\.)torrentproject\.se$ -(^|\.)torrenty\.org$ -(^|\.)torrentz\.eu$ -(^|\.)torvpn\.com$ -(^|\.)tosh\.comedycentral\.com$ -(^|\.)totalvpn\.com$ -(^|\.)toutiaoabc\.com$ -(^|\.)toutyrater\.github\.io$ -(^|\.)towngain\.com$ -(^|\.)toypark\.in$ -(^|\.)toythieves\.com$ -(^|\.)toytractorshow\.com$ -(^|\.)tparents\.org$ -(^|\.)tpi\.org\.tw$ -(^|\.)tracfone\.com$ -(^|\.)traffichaus\.com$ -(^|\.)trans\.wenweipo\.com$ -(^|\.)transparency\.org$ -(^|\.)treemall\.com\.tw$ -(^|\.)trendsmap\.com$ -(^|\.)trialofccp\.org$ -(^|\.)trickip\.net$ -(^|\.)trickip\.org$ -(^|\.)trimondi\.de$ -(^|\.)trouw\.nl$ -(^|\.)trt\.net\.tr$ -(^|\.)trtc\.com\.tw$ -(^|\.)truebuddha-md\.org$ -(^|\.)trulyergonomic\.com$ -(^|\.)truth101\.co\.tv$ -(^|\.)truthontour\.org$ -(^|\.)truveo\.com$ -(^|\.)tryheart\.jp$ -(^|\.)tsctv\.net$ -(^|\.)tsdr\.uspto\.gov$ -(^|\.)tsemtulku\.com$ -(^|\.)tsquare\.tv$ -(^|\.)tsu\.org\.tw$ -(^|\.)tsunagarumon\.com$ -(^|\.)tt-rss\.org$ -(^|\.)tt1069\.com$ -(^|\.)tttan\.com$ -(^|\.)ttvnw\.net$ -(^|\.)tu8964\.com$ -(^|\.)tubaholic\.com$ -(^|\.)tube\.com$ -(^|\.)tube8\.com$ -(^|\.)tube911\.com$ -(^|\.)tubecup\.com$ -(^|\.)tubegals\.com$ -(^|\.)tubeislam\.com$ -(^|\.)tubepornclassic\.com$ -(^|\.)tubestack\.com$ -(^|\.)tubewolf\.com$ -(^|\.)tui\.orzdream\.com$ -(^|\.)tuibeitu\.net$ -(^|\.)tuidang\.net$ -(^|\.)tuidang\.org$ -(^|\.)tuidang\.se$ -(^|\.)tuitwit\.com$ -(^|\.)tumblr\.com$ -(^|\.)tumutanzi\.com$ -(^|\.)tumview\.com$ -(^|\.)tunein\.com$ -(^|\.)tunnelbear\.com$ -(^|\.)tunnelr\.com$ -(^|\.)tuo8\.blue$ -(^|\.)tuo8\.cc$ -(^|\.)tuo8\.club$ -(^|\.)tuo8\.fit$ -(^|\.)tuo8\.hk$ -(^|\.)tuo8\.in$ -(^|\.)tuo8\.ninja$ -(^|\.)tuo8\.org$ -(^|\.)tuo8\.pw$ -(^|\.)tuo8\.red$ -(^|\.)tuo8\.space$ -(^|\.)turansam\.org$ -(^|\.)turbobit\.net$ -(^|\.)turbohide\.com$ -(^|\.)turbotwitter\.com$ -(^|\.)turntable\.fm$ -(^|\.)tushycash\.com$ -(^|\.)tuvpn\.com$ -(^|\.)tuzaijidi\.com$ -(^|\.)tv\.com$ -(^|\.)tvants\.com$ -(^|\.)tvboxnow\.com$ -(^|\.)tvider\.com$ -(^|\.)tvmost\.com\.hk$ -(^|\.)tvplayvideos\.com$ -(^|\.)tvunetworks\.com$ -(^|\.)tw-blog\.com$ -(^|\.)tw-npo\.org$ -(^|\.)tw\.answers\.yahoo\.com$ -(^|\.)tw\.bid\.yahoo\.com$ -(^|\.)tw\.gigacircle\.com$ -(^|\.)tw\.hao123\.com$ -(^|\.)tw\.iqiyi\.com$ -(^|\.)tw\.jiepang\.com$ -(^|\.)tw\.knowledge\.yahoo\.com$ -(^|\.)tw\.mall\.yahoo\.com$ -(^|\.)tw\.mobi\.yahoo\.com$ -(^|\.)tw\.money\.yahoo\.com$ -(^|\.)tw\.myblog\.yahoo\.com$ -(^|\.)tw\.news\.yahoo\.com$ -(^|\.)tw\.streetvoice\.com$ -(^|\.)tw\.tomonews\.net$ -(^|\.)tw\.voa\.mobi$ -(^|\.)tw\.yahoo\.com$ -(^|\.)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$ -(^|\.)tweets\.seraph\.me$ -(^|\.)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$ -(^|\.)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$ -(^|\.)twskype\.com$ -(^|\.)twstar\.net$ -(^|\.)twt\.tl$ -(^|\.)twtkr\.com$ -(^|\.)twtr2src\.ogaoga\.org$ -(^|\.)twtrland\.com$ -(^|\.)twttr\.com$ -(^|\.)twurl\.nl$ -(^|\.)twyac\.org$ -(^|\.)txxx\.com$ -(^|\.)tycool\.com$ -(^|\.)typepad\.com$ -(^|\.)u9un\.com$ -(^|\.)ub0\.cc$ -(^|\.)ubddns\.org$ -(^|\.)uberproxy\.net$ -(^|\.)uc-japan\.org$ -(^|\.)ucdc1998\.org$ -(^|\.)uderzo\.it$ -(^|\.)udn\.com$ -(^|\.)udn\.com\.tw$ -(^|\.)udnbkk\.com$ -(^|\.)uforadio\.com\.tw$ -(^|\.)ufreevpn\.com$ -(^|\.)ug\.m\.wikipedia\.org$ -(^|\.)ugo\.com$ -(^|\.)uhdwallpapers\.org$ -(^|\.)uhrp\.org$ -(^|\.)uighur\.narod\.ru$ -(^|\.)uighur\.nl$ -(^|\.)uighurbiz\.net$ -(^|\.)ukcdp\.co\.uk$ -(^|\.)ukliferadio\.co\.uk$ -(^|\.)uku\.im$ -(^|\.)ulike\.net$ -(^|\.)ulop\.net$ -(^|\.)ultrareach$ -(^|\.)ultrasurf$ -(^|\.)ultravpn\.fr$ -(^|\.)ultraxs\.com$ -(^|\.)umich\.edu$ -(^|\.)unblock-us\.com$ -(^|\.)unblock\.cn\.com$ -(^|\.)unblockdmm\.com$ -(^|\.)unblocker\.yt$ -(^|\.)unblocksit\.es$ -(^|\.)uncyclomedia\.org$ -(^|\.)uncyclopedia\.hk$ -(^|\.)uncyclopedia\.tw$ -(^|\.)underwoodammo\.com$ -(^|\.)unholyknight\.com$ -(^|\.)uni\.cc$ -(^|\.)unification\.net$ -(^|\.)unification\.org\.tw$ -(^|\.)unirule\.cloud$ -(^|\.)unitedsocialpress\.com$ -(^|\.)unix100\.com$ -(^|\.)unknownspace\.org$ -(^|\.)unodedos\.com$ -(^|\.)unpo\.org$ -(^|\.)unseen\.is$ -(^|\.)untraceable\.us$ -(^|\.)uocn\.org$ -(^|\.)upcoming\.yahoo\.com$ -(^|\.)updates\.tdesktop\.com$ -(^|\.)upholdjustice\.org$ -(^|\.)upload4u\.info$ -(^|\.)uploaded\.net$ -(^|\.)uploaded\.to$ -(^|\.)uploadstation\.com$ -(^|\.)upmedia\.mg$ -(^|\.)upornia\.com$ -(^|\.)uproxy\.org$ -(^|\.)upwill\.org$ -(^|\.)ur7s\.com$ -(^|\.)uraban\.me$ -(^|\.)urbansurvival\.com$ -(^|\.)urchin\.com$ -(^|\.)urlborg\.com$ -(^|\.)urlparser\.com$ -(^|\.)us\.to$ -(^|\.)usacn\.com$ -(^|\.)usaip\.eu$ -(^|\.)userapi\.nytlog\.com$ -(^|\.)users\.skynet\.be$ -(^|\.)usfk\.mil$ -(^|\.)ushuarencity\.echainhost\.com$ -(^|\.)usinfo\.state\.gov$ -(^|\.)usma\.edu$ -(^|\.)usmc\.mil$ -(^|\.)usmgtcg\.ning\.com$ -(^|\.)usno\.navy\.mil$ -(^|\.)usocctn\.com$ -(^|\.)ustream\.tv$ -(^|\.)usunitednews\.com$ -(^|\.)usus\.cc$ -(^|\.)utopianpal\.com$ -(^|\.)uu-gg\.com$ -(^|\.)uukanshu\.com$ -(^|\.)uvwxyz\.xyz$ -(^|\.)uwants\.com$ -(^|\.)uwants\.net$ -(^|\.)uyghur-j\.org$ -(^|\.)uyghur\.co\.uk$ -(^|\.)uyghuramerican\.org$ -(^|\.)uyghurcanadiansociety\.org$ -(^|\.)uyghurcongress\.org$ -(^|\.)uyghurensemble\.co\.uk$ -(^|\.)uyghurpen\.org$ -(^|\.)uyghurpress\.com$ -(^|\.)uyghurstudies\.org$ -(^|\.)uygur\.fc2web\.com$ -(^|\.)uygur\.org$ -(^|\.)uymaarip\.com$ -(^|\.)v2ex\.com$ -(^|\.)v2ray\.com$ -(^|\.)van001\.com$ -(^|\.)van698\.com$ -(^|\.)vanemu\.cn$ -(^|\.)vanilla-jp\.com$ -(^|\.)vanpeople\.com$ -(^|\.)vansky\.com$ -(^|\.)vaticannews\.va$ -(^|\.)vatn\.org$ -(^|\.)vcf-online\.org$ -(^|\.)vcfbuilder\.org$ -(^|\.)vds\.rightster\.com$ -(^|\.)vegas\.williamhill\.com$ -(^|\.)vegasred\.com$ -(^|\.)velkaepocha\.sk$ -(^|\.)venbbs\.com$ -(^|\.)venchina\.com$ -(^|\.)venetianmacao\.com$ -(^|\.)ventureswell\.com$ -(^|\.)veoh\.com$ -(^|\.)vermonttibet\.org$ -(^|\.)versavpn\.com$ -(^|\.)verybs\.com$ -(^|\.)vevo\.com$ -(^|\.)vft\.com\.tw$ -(^|\.)viber\.com$ -(^|\.)vica\.info$ -(^|\.)victimsofcommunism\.org$ -(^|\.)vid\.me$ -(^|\.)vidble\.com$ -(^|\.)video\.aol\.ca$ -(^|\.)video\.aol\.co\.uk$ -(^|\.)video\.aol\.com$ -(^|\.)video\.ap\.org$ -(^|\.)video\.fdbox\.com$ -(^|\.)video\.foxbusiness\.com$ -(^|\.)video\.pbs\.org$ -(^|\.)video\.yahoo\.com$ -(^|\.)videobam\.com$ -(^|\.)videodetective\.com$ -(^|\.)videomega\.tv$ -(^|\.)videomo\.com$ -(^|\.)videopediaworld\.com$ -(^|\.)videopress\.com$ -(^|\.)vidinfo\.org$ -(^|\.)vietdaikynguyen\.com$ -(^|\.)vijayatemple\.org$ -(^|\.)vimeo\.com$ -(^|\.)vimperator\.org$ -(^|\.)vincnd\.com$ -(^|\.)vine\.co$ -(^|\.)vinniev\.com$ -(^|\.)vip-enterprise\.com$ -(^|\.)virtualrealporn\.com$ -(^|\.)visibletweets\.com$ -(^|\.)vital247\.org$ -(^|\.)viu\.com$ -(^|\.)viu\.tv$ -(^|\.)vivahentai4u\.net$ -(^|\.)vivatube\.com$ -(^|\.)vivthomas\.com$ -(^|\.)vizvaz\.com$ -(^|\.)vjav\.com$ -(^|\.)vjmedia\.com\.hk$ -(^|\.)vllcs\.org$ -(^|\.)vlog\.xuite\.net$ -(^|\.)vmixcore\.com$ -(^|\.)vmpsoft\.com$ -(^|\.)vn\.hao123\.com$ -(^|\.)vnet\.link$ -(^|\.)voa-11\.akacast\.akamaistream\.net$ -(^|\.)voacantonese\.com$ -(^|\.)voachinese\.com$ -(^|\.)voachineseblog\.com$ -(^|\.)voagd\.com$ -(^|\.)voanews\.com$ -(^|\.)voatibetan\.com$ -(^|\.)voatibetanenglish\.com$ -(^|\.)vocativ\.com$ -(^|\.)vocn\.tv$ -(^|\.)vod-abematv\.akamaized\.net$ -(^|\.)vod\.wwe\.com$ -(^|\.)vot\.org$ -(^|\.)vovo2000\.com$ -(^|\.)voxer\.com$ -(^|\.)voy\.com$ -(^|\.)vpn\.ac$ -(^|\.)vpn\.cjb\.net$ -(^|\.)vpn\.cmu\.edu$ -(^|\.)vpn\.sv\.cmu\.edu$ -(^|\.)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$ -(^|\.)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$ -(^|\.)vtunnel\.com$ -(^|\.)vuku\.cc$ -(^|\.)vultryhw\.com$ -(^|\.)w\.idaiwan\.com$ -(^|\.)w3schools\.com$ -(^|\.)waffle1999\.com$ -(^|\.)wahas\.com$ -(^|\.)waigaobu\.com$ -(^|\.)waikeung\.org$ -(^|\.)wailaike\.net$ -(^|\.)waiwaier\.com$ -(^|\.)wallmama\.com$ -(^|\.)wallornot\.org$ -(^|\.)wallpapercasa\.com$ -(^|\.)wallproxy\.com$ -(^|\.)waltermartin\.com$ -(^|\.)waltermartin\.org$ -(^|\.)wanderinghorse\.net$ -(^|\.)wangafu\.net$ -(^|\.)wangjinbo\.org$ -(^|\.)wanglixiong\.com$ -(^|\.)wango\.org$ -(^|\.)wangruoshui\.net$ -(^|\.)want-daily\.com$ -(^|\.)wanz-factory\.com$ -(^|\.)wapedia\.mobi$ -(^|\.)warbler\.iconfactory\.net$ -(^|\.)waselpro\.com$ -(^|\.)washeng\.net$ -(^|\.)watch8x\.com$ -(^|\.)watchinese\.com$ -(^|\.)watchmygf\.net$ -(^|\.)wattpad\.com$ -(^|\.)wav\.tv$ -(^|\.)waveprotocol\.org$ -(^|\.)waymo\.com$ -(^|\.)wda\.gov\.tw$ -(^|\.)wdf5\.com$ -(^|\.)wearehairy\.com$ -(^|\.)wearn\.com$ -(^|\.)web\.dev$ -(^|\.)web2project\.net$ -(^|\.)webbang\.net$ -(^|\.)webevader\.org$ -(^|\.)webfreer\.com$ -(^|\.)webjb\.org$ -(^|\.)weblagu\.com$ -(^|\.)webmproject\.org$ -(^|\.)webrtc\.org$ -(^|\.)webrush\.net$ -(^|\.)webs-tv\.net$ -(^|\.)website\.informer\.com$ -(^|\.)websitepulse\.com$ -(^|\.)webwarper\.net$ -(^|\.)webworkerdaily\.com$ -(^|\.)weekmag\.info$ -(^|\.)wefightcensorship\.org$ -(^|\.)wefong\.com$ -(^|\.)wego\.here\.com$ -(^|\.)weiboleak\.com$ -(^|\.)weiboscope\.jmsc\.hku\.hk$ -(^|\.)weihuo\.org$ -(^|\.)weijingsheng\.org$ -(^|\.)weiming\.info$ -(^|\.)weiquanwang\.org$ -(^|\.)weisuo\.ws$ -(^|\.)welovecock\.com$ -(^|\.)wemigrate\.org$ -(^|\.)wengewang\.com$ -(^|\.)wengewang\.org$ -(^|\.)wenhui\.ch$ -(^|\.)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$ -(^|\.)whitebear\.freebearblog\.org$ -(^|\.)whodns\.xyz$ -(^|\.)whoer\.net$ -(^|\.)whotalking\.com$ -(^|\.)whylover\.com$ -(^|\.)whyx\.org$ -(^|\.)widevine\.com$ -(^|\.)wikaba\.com$ -(^|\.)wiki\.cnitter\.com$ -(^|\.)wiki\.esu\.im$ -(^|\.)wiki\.gamerp\.jp$ -(^|\.)wiki\.jqueryui\.com$ -(^|\.)wiki\.keso\.cn$ -(^|\.)wiki\.moegirl\.org$ -(^|\.)wiki\.oauth\.net$ -(^|\.)wiki\.phonegap\.com$ -(^|\.)wikileaks-forum\.com$ -(^|\.)wikileaks\.ch$ -(^|\.)wikileaks\.com$ -(^|\.)wikileaks\.de$ -(^|\.)wikileaks\.eu$ -(^|\.)wikileaks\.lu$ -(^|\.)wikileaks\.org$ -(^|\.)wikileaks\.pl$ -(^|\.)wikilivres\.info$ -(^|\.)wikimapia\.org$ -(^|\.)wikiwiki\.jp$ -(^|\.)wildammo\.com$ -(^|\.)williamhill\.com$ -(^|\.)willw\.net$ -(^|\.)windowsphoneme\.com$ -(^|\.)windscribe\.com$ -(^|\.)wingamestore\.com$ -(^|\.)wingy\.site$ -(^|\.)winning11\.com$ -(^|\.)winwhispers\.info$ -(^|\.)wire\.com$ -(^|\.)wiredbytes\.com$ -(^|\.)wiredpen\.com$ -(^|\.)wisdompubs\.org$ -(^|\.)wisevid\.com$ -(^|\.)withgoogle\.com$ -(^|\.)withyoutube\.com$ -(^|\.)witnessleeteaching\.com$ -(^|\.)witopia\.net$ -(^|\.)wizcrafts\.net$ -(^|\.)wjbk\.org$ -(^|\.)wlcnew\.jigsy\.com$ -(^|\.)wlx\.sowiki\.net$ -(^|\.)wn\.com$ -(^|\.)wnacg\.com$ -(^|\.)wnacg\.org$ -(^|\.)wo\.tc$ -(^|\.)wo3ttt\.wordpress\.com$ -(^|\.)woeser\.com$ -(^|\.)woesermiddle-way\.net$ -(^|\.)wokar\.org$ -(^|\.)wolfax\.com$ -(^|\.)woolyss\.com$ -(^|\.)woopie\.jp$ -(^|\.)woopie\.tv$ -(^|\.)wordpress\.com$ -(^|\.)workatruna\.com$ -(^|\.)workerdemo\.org\.hk$ -(^|\.)workerempowerment\.org$ -(^|\.)workersthebig\.net$ -(^|\.)worldcat\.org$ -(^|\.)worldjournal\.com$ -(^|\.)worldvpn\.net$ -(^|\.)wow-life\.net$ -(^|\.)wow\.com$ -(^|\.)wowgirls\.com$ -(^|\.)wowlegacy\.ml$ -(^|\.)wowporn\.com$ -(^|\.)wowrk\.com$ -(^|\.)woxinghuiguo\.com$ -(^|\.)woyaolian\.org$ -(^|\.)wozy\.in$ -(^|\.)wp\.com$ -(^|\.)wpoforum\.com$ -(^|\.)wqyd\.org$ -(^|\.)wrchina\.org$ -(^|\.)wretch\.cc$ -(^|\.)writer\.zoho\.com$ -(^|\.)wsgzao\.github\.io$ -(^|\.)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$ -(^|\.)wuu\.wikipedia\.org$ -(^|\.)wuw\.red$ -(^|\.)wuyanblog\.com$ -(^|\.)wwitv\.com$ -(^|\.)www\.ajsands\.com$ -(^|\.)www\.americorps\.gov$ -(^|\.)www\.antd\.org$ -(^|\.)www\.aolnews\.com$ -(^|\.)www\.businessinsider\.com\.au$ -(^|\.)www\.citizenlab\.org$ -(^|\.)www\.cmoinc\.org$ -(^|\.)www\.cool18\.com$ -(^|\.)www\.dmm\.com$ -(^|\.)www\.dwheeler\.com$ -(^|\.)www\.eastturkistan\.net$ -(^|\.)www\.ftchinese\.com$ -(^|\.)www\.gmiddle\.com$ -(^|\.)www\.gmiddle\.net$ -(^|\.)www\.hustlercash\.com$ -(^|\.)www\.idlcoyote\.com$ -(^|\.)www\.imdb\.com$ -(^|\.)www\.kindleren\.com$ -(^|\.)www\.klip\.me$ -(^|\.)www\.lamenhu\.com$ -(^|\.)www\.lib\.virginia\.edu$ -(^|\.)www\.linksalpha\.com$ -(^|\.)www\.m-sport\.co\.uk$ -(^|\.)www\.metro\.taipei$ -(^|\.)www\.monlamit\.org$ -(^|\.)www\.moztw\.org$ -(^|\.)www\.nbc\.com$ -(^|\.)www\.orchidbbs\.com$ -(^|\.)www\.owind\.com$ -(^|\.)www\.oxid\.it$ -(^|\.)www\.powerpointninja\.com$ -(^|\.)www\.s4miniarchive\.com$ -(^|\.)www\.sciencemag\.org$ -(^|\.)www\.shadowsocks\.com$ -(^|\.)www\.shwchurch\.org$ -(^|\.)www\.skype\.com$ -(^|\.)www\.tablesgenerator\.com$ -(^|\.)www\.taiwanonline\.cc$ -(^|\.)www\.taup\.org\.tw$ -(^|\.)www\.thechinastory\.org$ -(^|\.)www\.wan-press\.org$ -(^|\.)www\.wangruowang\.org$ -(^|\.)www\.websnapr\.com$ -(^|\.)www\.zensur\.freerk\.com$ -(^|\.)www1\.american\.edu$ -(^|\.)www1\.biz$ -(^|\.)www2\.ohchr\.org$ -(^|\.)www2\.rocketbbs\.com$ -(^|\.)wwwhost\.biz$ -(^|\.)wzyboy\.im$ -(^|\.)x-art\.com$ -(^|\.)x-berry\.com$ -(^|\.)x-wall\.org$ -(^|\.)x\.company$ -(^|\.)x1949x\.com$ -(^|\.)x24hr\.com$ -(^|\.)x365x\.com$ -(^|\.)xa\.yimg\.com$ -(^|\.)xanga\.com$ -(^|\.)xbabe\.com$ -(^|\.)xbookcn\.com$ -(^|\.)xbtce\.com$ -(^|\.)xcafe\.in$ -(^|\.)xcity\.jp$ -(^|\.)xcritic\.com$ -(^|\.)xerotica\.com$ -(^|\.)xfinity\.com$ -(^|\.)xfm\.pp\.ru$ -(^|\.)xgmyd\.com$ -(^|\.)xhamster\.com$ -(^|\.)xianba\.net$ -(^|\.)xianchawang\.net$ -(^|\.)xianjian\.tw$ -(^|\.)xianqiao\.net$ -(^|\.)xiaobaiwu\.com$ -(^|\.)xiaochuncnjp\.com$ -(^|\.)xiaod\.in$ -(^|\.)xiaohexie\.com$ -(^|\.)xiaolan\.me$ -(^|\.)xiaoma\.org$ -(^|\.)xiezhua\.com$ -(^|\.)xihua\.es$ -(^|\.)xijie\.wordpress\.com$ -(^|\.)xing\.com$ -(^|\.)xinhuanet\.org$ -(^|\.)xinmiao\.com\.hk$ -(^|\.)xinqimeng\.over-blog\.com$ -(^|\.)xinsheng\.net$ -(^|\.)xinshijue\.com$ -(^|\.)xinyubbs\.net$ -(^|\.)xiongpian\.com$ -(^|\.)xiuren\.org$ -(^|\.)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--czq75pvv1aj5c\.org$ -(^|\.)xn--i2ru8q2qg\.com$ -(^|\.)xn--ngstr-lra8j\.com$ -(^|\.)xn--oiq\.cc$ -(^|\.)xn--p8j9a0d9c9a\.xn--q9jyb4c$ -(^|\.)xnxx\.com$ -(^|\.)xpdo\.net$ -(^|\.)xpud\.org$ -(^|\.)xrentdvd\.com$ -(^|\.)xskywalker\.com$ -(^|\.)xskywalker\.net$ -(^|\.)xtube\.com$ -(^|\.)xuchao\.net$ -(^|\.)xuchao\.org$ -(^|\.)xuehua\.us$ -(^|\.)xuzhiyong\.net$ -(^|\.)xvideo\.cc$ -(^|\.)xvideos\.com$ -(^|\.)xvideos\.es$ -(^|\.)xxbbx\.com$ -(^|\.)xxlmovies\.com$ -(^|\.)xxuz\.com$ -(^|\.)xxx\.com$ -(^|\.)xxx\.xxx$ -(^|\.)xxxfuckmom\.com$ -(^|\.)xxxx\.com\.au$ -(^|\.)xxxy\.biz$ -(^|\.)xxxy\.info$ -(^|\.)xxxymovies\.com$ -(^|\.)xys\.dxiong\.com$ -(^|\.)xys\.org$ -(^|\.)xysblogs\.org$ -(^|\.)xyy69\.com$ -(^|\.)xyy69\.info$ -(^|\.)yahoo\.com\.hk$ -(^|\.)yakbutterblues\.com$ -(^|\.)yam\.com$ -(^|\.)yam\.org\.tw$ -(^|\.)yanghengjun\.com$ -(^|\.)yangjianli\.com$ -(^|\.)yasni\.co\.uk$ -(^|\.)yayabay\.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$ -(^|\.)yilubbs\.com$ -(^|\.)yingsuoss\.com$ -(^|\.)yinlei\.org$ -(^|\.)yipub\.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$ -(^|\.)youthnetradio\.org$ -(^|\.)youtu\.be$ -(^|\.)youtube-nocookie\.com$ -(^|\.)youtube\.com$ -(^|\.)youtubecn\.com$ -(^|\.)youtubeeducation\.com$ -(^|\.)youtubegaming\.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$ -(^|\.)yzzk\.com$ -(^|\.)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$ -(^|\.)zenmate\.com\.ru$ -(^|\.)zeronet\.io$ -(^|\.)zeutch\.com$ -(^|\.)zfreet\.com$ -(^|\.)zgsddh\.com$ -(^|\.)zgzcjj\.net$ -(^|\.)zh-yue\.wikipedia\.org$ -(^|\.)zh\.bitterwinter\.org$ -(^|\.)zh\.ecdm\.wikia\.com$ -(^|\.)zh\.m\.wikipedia\.org$ -(^|\.)zh\.pokerstrategy\.com$ -(^|\.)zh\.pttpedia\.wikia\.com$ -(^|\.)zh\.uncyclopedia\.wikia\.com$ -(^|\.)zh\.wikinews\.org$ -(^|\.)zh\.wikipedia\.org$ -(^|\.)zh\.wikisource\.org$ -(^|\.)zhanbin\.net$ -(^|\.)zhangboli\.net$ -(^|\.)zhangtianliang\.com$ -(^|\.)zhanlve\.org$ -(^|\.)zhao\.1984\.city$ -(^|\.)zhao\.jinhai\.de$ -(^|\.)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$ -(^|\.)ziddu\.com$ -(^|\.)zillionk\.com$ -(^|\.)zim\.vn$ -(^|\.)zinio\.com$ -(^|\.)ziporn\.com$ -(^|\.)zippyshare\.com$ -(^|\.)zkaip\.com$ -(^|\.)zmw\.cn$ -(^|\.)zodgame\.us$ -(^|\.)zomobo\.net$ -(^|\.)zonaeuropa\.com$ -(^|\.)zonghexinwen\.com$ -(^|\.)zonghexinwen\.net$ -(^|\.)zoogvpn\.com$ -(^|\.)zootool\.com$ -(^|\.)zoozle\.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$ -(^|\.)zyzc9\.com$ -(^|\.)zzcartoon\.com$ -(^|\.)zzcloud\.me$ -(^|\.)zzux\.com$ diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/BootReceiver.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/BootReceiver.kt deleted file mode 100644 index 907f0a622..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/BootReceiver.kt +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core - -import android.content.BroadcastReceiver -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.content.pm.PackageManager -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.preference.DataStore - -class BootReceiver : BroadcastReceiver() { - companion object { - private val componentName by lazy { ComponentName(app, org.amnezia.vpn.shadowsocks.core.BootReceiver::class.java) } - var enabled: Boolean - get() = app.packageManager.getComponentEnabledSetting(org.amnezia.vpn.shadowsocks.core.BootReceiver.Companion.componentName) == - PackageManager.COMPONENT_ENABLED_STATE_ENABLED - set(value) = app.packageManager.setComponentEnabledSetting( - org.amnezia.vpn.shadowsocks.core.BootReceiver.Companion.componentName, - if (value) PackageManager.COMPONENT_ENABLED_STATE_ENABLED - else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP) - } - - override fun onReceive(context: Context, intent: Intent) { - val locked = when (intent.action) { - Intent.ACTION_BOOT_COMPLETED -> false - Intent.ACTION_LOCKED_BOOT_COMPLETED -> true // constant will be folded so no need to do version checks - else -> return - } - if (DataStore.directBootAware == locked) org.amnezia.vpn.shadowsocks.core.Core.startService() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/Core.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/Core.kt deleted file mode 100644 index 93bfcacce..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/Core.kt +++ /dev/null @@ -1,159 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2018 by Max Lv * - * Copyright (C) 2018 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core - -import android.app.Application -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent -import android.app.admin.DevicePolicyManager -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.content.pm.PackageInfo -import android.content.pm.PackageManager -import android.os.Build -import android.os.UserManager -import androidx.annotation.RequiresApi -import androidx.core.content.ContextCompat -import androidx.core.content.getSystemService -import androidx.work.Configuration -import androidx.work.WorkManager - -import org.amnezia.vpn.shadowsocks.core.acl.Acl -import org.amnezia.vpn.shadowsocks.core.aidl.ShadowsocksConnection -import org.amnezia.vpn.shadowsocks.core.database.Profile -import org.amnezia.vpn.shadowsocks.core.database.ProfileManager -import org.amnezia.vpn.shadowsocks.core.net.TcpFastOpen -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.* -import kotlinx.coroutines.DEBUG_PROPERTY_NAME -import kotlinx.coroutines.DEBUG_PROPERTY_VALUE_ON -import java.io.File -import java.io.IOException -import kotlin.reflect.KClass - -object Core { - const val TAG = "Core" - - lateinit var app: Application - lateinit var configureIntent: (Context) -> PendingIntent - val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) } - val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) } - val directBootSupported by lazy { - Build.VERSION.SDK_INT >= 24 && app.getSystemService()?.storageEncryptionStatus == - DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER - } - - val activeProfileIds - get() = ProfileManager.getProfile(DataStore.profileId).let { - if (it == null) emptyList() else listOfNotNull(it.id, it.udpFallback) - } - val currentProfile: Pair? - get() { - if (DataStore.directBootAware) DirectBoot.getDeviceProfile()?.apply { return this } - return ProfileManager.expand(ProfileManager.getProfile(DataStore.profileId) - ?: return null) - } - - fun switchProfile(id: Long): Profile { - val result = ProfileManager.getProfile(id) ?: ProfileManager.createProfile() - DataStore.profileId = result.id - return result - } - - fun init(app: Application, configureClass: KClass) { - Core.app = app - configureIntent = { - PendingIntent.getActivity(it, 0, - Intent(it, configureClass.java).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT), - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) - } - - if (Build.VERSION.SDK_INT >= 24) { // migrate old files - deviceStorage.moveDatabaseFrom(app, Key.DB_PUBLIC) - val old = Acl.getFile(Acl.CUSTOM_RULES, app) - if (old.canRead()) { - Acl.getFile(Acl.CUSTOM_RULES).writeText(old.readText()) - old.delete() - } - } - - // overhead of debug mode is minimal: https://github.com/Kotlin/kotlinx.coroutines/blob/f528898/docs/debugging.md#debug-mode - System.setProperty(DEBUG_PROPERTY_NAME, DEBUG_PROPERTY_VALUE_ON) - - // handle data restored/crash - if (Build.VERSION.SDK_INT >= 24 && DataStore.directBootAware && - app.getSystemService()?.isUserUnlocked == true) DirectBoot.flushTrafficStats() - if (DataStore.tcpFastOpen && !TcpFastOpen.sendEnabled) TcpFastOpen.enableTimeout() - if (DataStore.publicStore.getLong(Key.assetUpdateTime, -1) != packageInfo.lastUpdateTime) { - val assetManager = app.assets - try { - for (file in assetManager.list("acl")!!) assetManager.open("acl/$file").use { input -> - File(ContextCompat.getNoBackupFilesDir(deviceStorage), file).outputStream().use { output -> input.copyTo(output) } - } - } catch (e: IOException) { - printLog(e) - } - DataStore.publicStore.putLong(Key.assetUpdateTime, packageInfo.lastUpdateTime) - } - updateNotificationChannels() - } - - fun updateNotificationChannels() { - if (Build.VERSION.SDK_INT >= 26) @RequiresApi(26) { - val nm = app.getSystemService()!! - nm.createNotificationChannels(listOf( - NotificationChannel("service-vpn", app.getText(R.string.service_vpn), - NotificationManager.IMPORTANCE_LOW), - NotificationChannel("service-proxy", app.getText(R.string.service_proxy), - NotificationManager.IMPORTANCE_LOW), - NotificationChannel("service-transproxy", app.getText(R.string.service_transproxy), - NotificationManager.IMPORTANCE_LOW))) - nm.deleteNotificationChannel("service-nat") // NAT mode is gone for good - } - } - - fun getPackageInfo(packageName: String) = app.packageManager.getPackageInfo(packageName, - if (Build.VERSION.SDK_INT >= 28) PackageManager.GET_SIGNING_CERTIFICATES - else @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES)!! - - fun startService() = ContextCompat.startForegroundService(app, Intent(app, ShadowsocksConnection.serviceClass)) - fun reloadService() = app.sendBroadcast(Intent(Action.RELOAD)) - fun stopService() = app.sendBroadcast(Intent(Action.CLOSE)) - - fun listenForPackageChanges(onetime: Boolean = true, callback: () -> Unit) = object : BroadcastReceiver() { - init { - app.registerReceiver(this, IntentFilter().apply { - addAction(Intent.ACTION_PACKAGE_ADDED) - addAction(Intent.ACTION_PACKAGE_REMOVED) - addDataScheme("package") - }) - } - - override fun onReceive(context: Context, intent: Intent) { - if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) return - callback() - if (onetime) app.unregisterReceiver(this) - } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnManager.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnManager.kt deleted file mode 100644 index b9429544b..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnManager.kt +++ /dev/null @@ -1,148 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.net.VpnService -import android.os.DeadObjectException -import android.os.Handler -import org.amnezia.vpn.shadowsocks.core.aidl.IShadowsocksService -import org.amnezia.vpn.shadowsocks.core.aidl.ShadowsocksConnection -import org.amnezia.vpn.shadowsocks.core.aidl.TrafficStats -import org.amnezia.vpn.shadowsocks.core.bg.BaseService -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Key - -class VpnManager private constructor() { - - var state = BaseService.State.Idle - private var context: Context? = null - private val handler = Handler() - private val connection = ShadowsocksConnection(handler, true) - private var listener: OnStatusChangeListener? = null - private val callback: ShadowsocksConnection.Callback = object : ShadowsocksConnection.Callback { - override fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) { - changeState(state) - } - - override fun onServiceDisconnected() = changeState(BaseService.State.Idle) - - override fun onServiceConnected(service: IShadowsocksService) { - changeState(try { - BaseService.State.values()[service.state] - } catch (_: DeadObjectException) { - BaseService.State.Idle - }) - } - - override fun trafficUpdated(profileId: Long, stats: TrafficStats) { - super.trafficUpdated(profileId, stats) - listener?.onTrafficUpdated(profileId, stats) - } - override fun onBinderDied() { - disconnect() - connect() - } - } - - private fun connect() { - context?.let { - connection.connect(it, callback) - } - } - - private fun disconnect() { - context?.let { connection.disconnect(it) } - } - - companion object { - private const val REQUEST_CONNECT = 1 - @SuppressLint("StaticFieldLeak") - private var instance: VpnManager? = null - - fun getInstance(): VpnManager { - if (instance == null) { - instance = VpnManager() - } - return instance as VpnManager - } - } - - fun init(context: Context){ - this.context=context - connect() - } - - fun run() { - when { - state.canStop -> Core.stopService() -// DataStore.serviceMode == Key.modeVpn -> { -// val intent = VpnService.prepare(activity) -// if (intent != null) activity.startActivityForResult(intent, REQUEST_CONNECT) -// else onActivityResult(REQUEST_CONNECT, Activity.RESULT_OK, null) -// } - else -> Core.startService() - } - } - - - fun setOnStatusChangeListener(listener: OnStatusChangeListener) { - this.listener = listener - } - - fun onStop() { - connection.bandwidthTimeout = 0 - } - - fun onStart() { - connection.bandwidthTimeout = 1000 - } - - fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when { - requestCode != REQUEST_CONNECT -> { - } - resultCode == Activity.RESULT_OK -> Core.startService() - else -> { - - } - } - } - - private fun changeState(state: BaseService.State) { - this.state = state - this.listener?.onStatusChanged(state) - } - - interface OnStatusChangeListener { - fun onStatusChanged(state: BaseService.State) - - fun onTrafficUpdated(profileId: Long, stats: TrafficStats) - } - - enum class Route(name: String) { - - ALL("all") - - , - BY_PASS_LAN("bypass-lan") - - , - BY_PASS_CHINA("bypass-china") - - , - BY_PASS_LAN_CHINA("bypass-lan-china") - - , - GFW_LIST("gfwlist") - - , - CHINA_LIST("china-list") - - , - CUSTOM_RULES("custom-rules"); - - var route = name - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnRequestActivity.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnRequestActivity.kt deleted file mode 100644 index f8442bae2..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/VpnRequestActivity.kt +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core - -import android.app.KeyguardManager -import android.content.BroadcastReceiver -import android.content.Intent -import android.content.IntentFilter -import android.net.VpnService -import android.os.Bundle -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.getSystemService - -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Key -import org.amnezia.vpn.shadowsocks.core.utils.broadcastReceiver - -class VpnRequestActivity : AppCompatActivity() { - companion object { - private const val TAG = "VpnRequestActivity" - private const val REQUEST_CONNECT = 1 - } - - private var receiver: BroadcastReceiver? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (DataStore.serviceMode != Key.modeVpn) { - finish() - return - } - if (getSystemService()!!.isKeyguardLocked) { - receiver = broadcastReceiver { _, _ -> request() } - registerReceiver(receiver, IntentFilter(Intent.ACTION_USER_PRESENT)) - } else request() - } - - private fun request() { - val intent = VpnService.prepare(this) - if (intent == null) onActivityResult(REQUEST_CONNECT, RESULT_OK, null) - else startActivityForResult(intent, REQUEST_CONNECT) - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (resultCode == RESULT_OK) Core.startService() else { - Toast.makeText(this, R.string.vpn_permission_denied, Toast.LENGTH_LONG).show() - } - finish() - super.onActivityResult(requestCode, resultCode, data) - } - - override fun onDestroy() { - super.onDestroy() - if (receiver != null) unregisterReceiver(receiver) - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/Acl.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/Acl.kt deleted file mode 100644 index 0bae1fac5..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/Acl.kt +++ /dev/null @@ -1,180 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.acl - -import android.content.Context -import androidx.recyclerview.widget.SortedList - -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.net.Subnet -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.asIterable -import java.io.File -import java.io.IOException -import java.io.Reader -import java.net.URL -import java.net.URLConnection - -class Acl { - companion object { - const val TAG = "Acl" - const val ALL = "all" - const val BYPASS_LAN = "bypass-lan" - const val BYPASS_CHN = "bypass-china" - const val BYPASS_LAN_CHN = "bypass-lan-china" - const val GFWLIST = "gfwlist" - const val CHINALIST = "china-list" - const val CUSTOM_RULES = "custom-rules" - - val networkAclParser = "^IMPORT_URL\\s*<(.+)>\\s*$".toRegex() - - fun getFile(id: String, context: Context = Core.deviceStorage) = File(context.noBackupFilesDir, "$id.acl") - - var customRules: Acl - get() { - val acl = Acl() - val str = DataStore.publicStore.getString(CUSTOM_RULES) - if (str != null) acl.fromReader(str.reader(), true) - if (!acl.bypass) { - acl.bypass = true - acl.subnets.clear() - } - return acl - } - set(value) = DataStore.publicStore.putString(CUSTOM_RULES, - if ((!value.bypass || value.subnets.size() == 0) && value.bypassHostnames.size() == 0 && - value.proxyHostnames.size() == 0 && value.urls.size() == 0) null else value.toString()) - fun save(id: String, acl: Acl) = getFile(id).writeText(acl.toString()) - } - - private abstract class BaseSorter : SortedList.Callback() { - override fun onInserted(position: Int, count: Int) { } - override fun areContentsTheSame(oldItem: T?, newItem: T?): Boolean = oldItem == newItem - override fun onMoved(fromPosition: Int, toPosition: Int) { } - override fun onChanged(position: Int, count: Int) { } - override fun onRemoved(position: Int, count: Int) { } - override fun areItemsTheSame(item1: T?, item2: T?): Boolean = item1 == item2 - override fun compare(o1: T?, o2: T?): Int = - if (o1 == null) if (o2 == null) 0 else 1 else if (o2 == null) -1 else compareNonNull(o1, o2) - abstract fun compareNonNull(o1: T, o2: T): Int - } - private open class DefaultSorter> : BaseSorter() { - override fun compareNonNull(o1: T, o2: T): Int = o1.compareTo(o2) - } - private object StringSorter : DefaultSorter() - private object SubnetSorter : DefaultSorter() - private object URLSorter : BaseSorter() { - private val ordering = compareBy({ it.host }, { it.port }, { it.file }, { it.protocol }) - override fun compareNonNull(o1: URL, o2: URL): Int = ordering.compare(o1, o2) - } - - val bypassHostnames = SortedList(String::class.java, StringSorter) - val proxyHostnames = SortedList(String::class.java, StringSorter) - val subnets = SortedList(Subnet::class.java, SubnetSorter) - val urls = SortedList(URL::class.java, URLSorter) - var bypass = false - - fun fromAcl(other: Acl): Acl { - bypassHostnames.clear() - for (item in other.bypassHostnames.asIterable()) bypassHostnames.add(item) - proxyHostnames.clear() - for (item in other.proxyHostnames.asIterable()) proxyHostnames.add(item) - subnets.clear() - for (item in other.subnets.asIterable()) subnets.add(item) - urls.clear() - for (item in other.urls.asIterable()) urls.add(item) - bypass = other.bypass - return this - } - fun fromReader(reader: Reader, defaultBypass: Boolean = false): Acl { - bypassHostnames.clear() - proxyHostnames.clear() - subnets.clear() - urls.clear() - bypass = defaultBypass - val bypassSubnets by lazy { SortedList(Subnet::class.java, SubnetSorter) } - val proxySubnets by lazy { SortedList(Subnet::class.java, SubnetSorter) } - var hostnames: SortedList? = if (defaultBypass) proxyHostnames else bypassHostnames - var subnets: SortedList? = if (defaultBypass) proxySubnets else bypassSubnets - reader.useLines { - for (line in it) { - @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") - val blocks = (line as java.lang.String).split("#", 2) - val url = networkAclParser.matchEntire(blocks.getOrElse(1) { "" })?.groupValues?.getOrNull(1) - if (url != null) urls.add(URL(url)) - when (val input = blocks[0].trim()) { - "[outbound_block_list]" -> { - hostnames = null - subnets = null - } - "[black_list]", "[bypass_list]" -> { - hostnames = bypassHostnames - subnets = bypassSubnets - } - "[white_list]", "[proxy_list]" -> { - hostnames = proxyHostnames - subnets = proxySubnets - } - "[reject_all]", "[bypass_all]" -> bypass = true - "[accept_all]", "[proxy_all]" -> bypass = false - else -> if (subnets != null && input.isNotEmpty()) { - val subnet = Subnet.fromString(input) - if (subnet == null) hostnames!!.add(input) else subnets!!.add(subnet) - } - } - } - } - for (item in (if (bypass) proxySubnets else bypassSubnets).asIterable()) this.subnets.add(item) - return this - } - - fun fromId(id: String): Acl = try { - fromReader(getFile(id).bufferedReader()) - } catch (_: IOException) { this } - - suspend fun flatten(depth: Int, connect: suspend (URL) -> URLConnection): Acl { - if (depth > 0) for (url in urls.asIterable()) { - val child = Acl() - try { - child.fromReader(connect(url).getInputStream().bufferedReader(), bypass).flatten(depth - 1, connect) - } catch (e: IOException) { - e.printStackTrace() - continue - } - if (bypass != child.bypass) { - child.subnets.clear() // subnets for the different mode are discarded - child.bypass = bypass - } - for (item in child.bypassHostnames.asIterable()) bypassHostnames.add(item) - for (item in child.proxyHostnames.asIterable()) proxyHostnames.add(item) - for (item in child.subnets.asIterable()) subnets.add(item) - } - urls.clear() - return this - } - - override fun toString(): String { - val result = StringBuilder() - result.append(if (bypass) "[bypass_all]\n" else "[proxy_all]\n") - val bypassList = (if (bypass) { - bypassHostnames.asIterable().asSequence() - } else { - subnets.asIterable().asSequence().map(Subnet::toString) + bypassHostnames.asIterable().asSequence() - }).toList() - val proxyList = (if (bypass) { - subnets.asIterable().asSequence().map(Subnet::toString) + proxyHostnames.asIterable().asSequence() - } else { - proxyHostnames.asIterable().asSequence() - }).toList() - if (bypassList.isNotEmpty()) { - result.append("[bypass_list]\n") - result.append(bypassList.joinToString("\n")) - result.append('\n') - } - if (proxyList.isNotEmpty()) { - result.append("[proxy_list]\n") - result.append(proxyList.joinToString("\n")) - result.append('\n') - } - result.append(urls.asIterable().joinToString("") { "#IMPORT_URL <$it>\n" }) - return result.toString() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/AclSyncer.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/AclSyncer.kt deleted file mode 100644 index b42a10639..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/acl/AclSyncer.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.acl - -import android.content.Context -import androidx.work.* -import kotlinx.coroutines.Dispatchers -import java.io.IOException -import java.net.URL -import java.util.concurrent.TimeUnit - -class AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { - companion object { - private const val KEY_ROUTE = "route" - - fun schedule(route: String) = WorkManager.getInstance().enqueueUniqueWork(route, ExistingWorkPolicy.REPLACE, - OneTimeWorkRequestBuilder().run { - setInputData(Data.Builder().putString(KEY_ROUTE, route).build()) - setConstraints(Constraints.Builder() - .setRequiredNetworkType(NetworkType.UNMETERED) - .setRequiresCharging(true) - .build()) - setInitialDelay(10, TimeUnit.SECONDS) - build() - }) - } - - override val coroutineContext get() = Dispatchers.IO - - override suspend fun doWork(): Result = try { - val route = inputData.getString(KEY_ROUTE)!! - val acl = URL("https://shadowsocks.org/acl/android/v1/$route.acl").openStream().bufferedReader() - .use { it.readText() } - Acl.getFile(route).printWriter().use { it.write(acl) } - Result.success() - } catch (e: IOException) { - e.printStackTrace() - Result.retry() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/ShadowsocksConnection.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/ShadowsocksConnection.kt deleted file mode 100644 index bf728bcf5..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/ShadowsocksConnection.kt +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.aidl - -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.content.ServiceConnection -import android.os.DeadObjectException -import android.os.Handler -import android.os.IBinder -import android.os.RemoteException -import org.amnezia.vpn.shadowsocks.core.bg.BaseService -import org.amnezia.vpn.shadowsocks.core.bg.ProxyService -import org.amnezia.vpn.shadowsocks.core.bg.TransproxyService -import org.amnezia.vpn.shadowsocks.core.bg.ShadowsocksVpnService -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Action -import org.amnezia.vpn.shadowsocks.core.utils.Key - -/** - * This object should be compact as it will not get GC-ed. - */ -class ShadowsocksConnection(private val handler: Handler = Handler(), - private var listenForDeath: Boolean = false) : - ServiceConnection, IBinder.DeathRecipient { - companion object { - val serviceClass get() = when (DataStore.serviceMode) { - Key.modeProxy -> ProxyService::class - Key.modeVpn -> ShadowsocksVpnService::class - Key.modeTransproxy -> TransproxyService::class - else -> throw UnknownError() - }.java - } - - interface Callback { - fun stateChanged(state: BaseService.State, profileName: String?, msg: String?) - fun trafficUpdated(profileId: Long, stats: TrafficStats) { } - fun trafficPersisted(profileId: Long) { } - - fun onServiceConnected(service: IShadowsocksService) - /** - * Different from Android framework, this method will be called even when you call `detachService`. - */ - fun onServiceDisconnected() { } - fun onBinderDied() { } - } - - private var connectionActive = false - private var callbackRegistered = false - private var callback: Callback? = null - private val serviceCallback = object : IShadowsocksServiceCallback.Stub() { - override fun stateChanged(state: Int, profileName: String?, msg: String?) { - val callback = callback ?: return - handler.post { callback.stateChanged(BaseService.State.values()[state], profileName, msg) } - } - override fun trafficUpdated(profileId: Long, stats: TrafficStats) { - val callback = callback ?: return - handler.post { - callback.trafficUpdated(profileId, stats) - } - } - override fun trafficPersisted(profileId: Long) { - val callback = callback ?: return - handler.post { callback.trafficPersisted(profileId) } - } - } - private var binder: IBinder? = null - - var bandwidthTimeout = 0L - set(value) { - val service = service - if (bandwidthTimeout != value && service != null) - if (value > 0) service.startListeningForBandwidth(serviceCallback, value) else try { - service.stopListeningForBandwidth(serviceCallback) - } catch (_: DeadObjectException) { } - field = value - } - var service: IShadowsocksService? = null - - override fun onServiceConnected(name: ComponentName?, binder: IBinder) { - this.binder = binder - if (listenForDeath) binder.linkToDeath(this, 0) - val service = IShadowsocksService.Stub.asInterface(binder)!! - this.service = service - if (!callbackRegistered) try { - service.registerCallback(serviceCallback) - callbackRegistered = true - if (bandwidthTimeout > 0) service.startListeningForBandwidth(serviceCallback, bandwidthTimeout) - } catch (_: RemoteException) { } - callback!!.onServiceConnected(service) - } - - override fun onServiceDisconnected(name: ComponentName?) { - unregisterCallback() - callback?.onServiceDisconnected() - service = null - binder = null - } - - override fun binderDied() { - service = null - callback?.also { handler.post(it::onBinderDied) } - } - - private fun unregisterCallback() { - val service = service - if (service != null && callbackRegistered) try { - service.unregisterCallback(serviceCallback) - } catch (_: RemoteException) { } - callbackRegistered = false - } - - fun connect(context: Context, callback: Callback) { - if (connectionActive) return - connectionActive = true - check(this.callback == null) - this.callback = callback - val intent = Intent(context, serviceClass).setAction(Action.SERVICE) - context.bindService(intent, this, Context.BIND_AUTO_CREATE) - } - - fun disconnect(context: Context) { - unregisterCallback() - if (connectionActive) try { - context.unbindService(this) - } catch (_: IllegalArgumentException) { } // ignore - connectionActive = false - if (listenForDeath) binder?.unlinkToDeath(this, 0) - binder = null - service?.stopListeningForBandwidth(serviceCallback) - service = null - callback = null - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.kt deleted file mode 100644 index 7ac06bf0a..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/aidl/TrafficStats.kt +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.aidl - -import android.os.Parcel -import android.os.Parcelable - -data class TrafficStats( - // Bytes per second - var txRate: Long = 0L, - var rxRate: Long = 0L, - - // Bytes for the current session - var txTotal: Long = 0L, - var rxTotal: Long = 0L -) : Parcelable { - operator fun plus(other: TrafficStats) = TrafficStats( - txRate + other.txRate, rxRate + other.rxRate, - txTotal + other.txTotal, rxTotal + other.rxTotal) - - constructor(parcel: Parcel) : this(parcel.readLong(), parcel.readLong(), parcel.readLong(), parcel.readLong()) - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeLong(txRate) - parcel.writeLong(rxRate) - parcel.writeLong(txTotal) - parcel.writeLong(rxTotal) - } - override fun describeContents() = 0 - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel) = TrafficStats(parcel) - override fun newArray(size: Int): Array = arrayOfNulls(size) - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/BaseService.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/BaseService.kt deleted file mode 100644 index 67fc582cb..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/BaseService.kt +++ /dev/null @@ -1,377 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.app.Service -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.os.* -import android.util.Log -import androidx.core.content.getSystemService -import kotlinx.coroutines.* -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.R -import org.amnezia.vpn.shadowsocks.core.aidl.IShadowsocksService -import org.amnezia.vpn.shadowsocks.core.aidl.IShadowsocksServiceCallback -import org.amnezia.vpn.shadowsocks.core.aidl.TrafficStats -import org.amnezia.vpn.shadowsocks.core.plugin.PluginManager -import org.amnezia.vpn.shadowsocks.core.utils.Action -import org.amnezia.vpn.shadowsocks.core.utils.broadcastReceiver -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import org.amnezia.vpn.shadowsocks.core.utils.readableMessage -import java.io.File -import java.net.BindException -import java.net.InetAddress -import java.net.URL -import java.net.UnknownHostException - -/** - * This object uses WeakMap to simulate the effects of multi-inheritance. - */ -object BaseService { - enum class State(val canStop: Boolean = false) { - /** - * Idle state is only used by UI and will never be returned by BaseService. - */ - Idle, - Connecting(true), - Connected(true), - Stopping, - Stopped, - } - - const val CONFIG_FILE = "shadowsocks.conf" - const val CONFIG_FILE_UDP = "shadowsocks-udp.conf" - - class Data(private val service: Interface) { - var state = State.Stopped - var processes: GuardedProcessPool? = null - var proxy: ProxyInstance? = null - var udpFallback: ProxyInstance? = null - -// var notification: ServiceNotification? = null - val closeReceiver = broadcastReceiver { _, intent -> - when (intent.action) { - Action.RELOAD -> service.forceLoad() - else -> service.stopRunner() - } - } - var closeReceiverRegistered = false - - val binder = Binder(this) - var connectingJob: Job? = null - - fun changeState(s: State, msg: String? = null) { - if (state == s && msg == null) return - binder.stateChanged(s, msg) - state = s - } - } - - class Binder(private var data: Data? = null) : IShadowsocksService.Stub(), AutoCloseable { - val callbacks = object : RemoteCallbackList() { - override fun onCallbackDied(callback: IShadowsocksServiceCallback?, cookie: Any?) { - super.onCallbackDied(callback, cookie) - stopListeningForBandwidth(callback ?: return) - } - } - private val bandwidthListeners = - mutableMapOf() // the binder is the real identifier - private val handler = Handler() - - override fun getState(): Int = (data?.state ?: State.Idle).ordinal - override fun getProfileName(): String = data?.proxy?.profile?.name ?: "Idle" - - override fun registerCallback(cb: IShadowsocksServiceCallback) { - callbacks.register(cb) - } - - private fun broadcast(work: (IShadowsocksServiceCallback) -> Unit) { - repeat(callbacks.beginBroadcast()) { - try { - work(callbacks.getBroadcastItem(it)) - } catch (_: DeadObjectException) { - } catch (e: Exception) { - printLog(e) - } - } - callbacks.finishBroadcast() - } - - private fun registerTimeout() { - handler.postDelayed(this::onTimeout, bandwidthListeners.values.minOrNull() ?: return) - } - - private fun onTimeout() { - val proxies = listOfNotNull(data?.proxy, data?.udpFallback) - val stats = proxies - .map { Pair(it.profile.id, it.trafficMonitor?.requestUpdate()) } - .filter { it.second != null } - .map { Triple(it.first, it.second!!.first, it.second!!.second) } - if (stats.any { it.third } && data?.state == State.Connected && bandwidthListeners.isNotEmpty()) { - val sum = stats.fold(TrafficStats()) { a, b -> a + b.second } - broadcast { item -> - if (bandwidthListeners.contains(item.asBinder())) { - stats.forEach { (id, stats) -> item.trafficUpdated(id, stats) } - item.trafficUpdated(0, sum) - } - } - } - registerTimeout() - } - - override fun startListeningForBandwidth(cb: IShadowsocksServiceCallback, timeout: Long) { - val wasEmpty = bandwidthListeners.isEmpty() - if (bandwidthListeners.put(cb.asBinder(), timeout) == null) { - if (wasEmpty) registerTimeout() - if (data?.state != State.Connected) return - var sum = TrafficStats() - val data = data - val proxy = data?.proxy ?: return - proxy.trafficMonitor?.out.also { stats -> - cb.trafficUpdated( - proxy.profile.id, if (stats == null) sum else { - sum += stats - stats - } - ) - } - data.udpFallback?.also { udpFallback -> - udpFallback.trafficMonitor?.out.also { stats -> - cb.trafficUpdated( - udpFallback.profile.id, if (stats == null) TrafficStats() else { - sum += stats - stats - } - ) - } - } - cb.trafficUpdated(0, sum) - } - } - - override fun stopListeningForBandwidth(cb: IShadowsocksServiceCallback) { - if (bandwidthListeners.remove(cb.asBinder()) != null && bandwidthListeners.isEmpty()) { - handler.removeCallbacksAndMessages(null) - } - } - - override fun unregisterCallback(cb: IShadowsocksServiceCallback) { - stopListeningForBandwidth(cb) // saves an RPC, and safer - callbacks.unregister(cb) - } - - fun stateChanged(s: State, msg: String?) { - val profileName = profileName - broadcast { it.stateChanged(s.ordinal, profileName, msg) } - } - - fun trafficPersisted(ids: List) { - if (bandwidthListeners.isNotEmpty() && ids.isNotEmpty()) broadcast { item -> - if (bandwidthListeners.contains(item.asBinder())) ids.forEach(item::trafficPersisted) - } - } - - override fun close() { - callbacks.kill() - handler.removeCallbacksAndMessages(null) - data = null - } - } - - interface Interface { - val data: Data - val tag: String -// fun createNotification(profileName: String): ServiceNotification - - fun onBind(intent: Intent): IBinder? = - if (intent.action == Action.SERVICE) data.binder else null - - fun forceLoad() { - val (profile, fallback) = Core.currentProfile - ?: return stopRunner(false, (this as Context).getString(R.string.profile_empty)) - if (profile.host.isEmpty() || profile.password.isEmpty() || - fallback != null && (fallback.host.isEmpty() || fallback.password.isEmpty()) - ) { - stopRunner(false, (this as Context).getString(R.string.proxy_empty)) - return - } - val s = data.state - when { - s == State.Stopped -> startRunner() - s.canStop -> stopRunner(true) - else -> {} - } - } - - fun buildAdditionalArguments(cmd: ArrayList): ArrayList = cmd - - suspend fun startProcesses() { - val configRoot = (if (Build.VERSION.SDK_INT < 24 || app.getSystemService() - ?.isUserUnlocked != false - ) app else Core.deviceStorage).noBackupFilesDir - val udpFallback = data.udpFallback - data.proxy!!.start( - this, - File(Core.deviceStorage.noBackupFilesDir, "stat_main"), - File(configRoot, CONFIG_FILE), - if (udpFallback == null) "-u" else null - ) - check(udpFallback?.pluginPath == null) { "UDP fallback cannot have plugins" } - udpFallback?.start( - this, - File(Core.deviceStorage.noBackupFilesDir, "stat_udp"), - File(configRoot, CONFIG_FILE_UDP), - "-U" - ) - } - - fun startRunner() { - this as Context - if (Build.VERSION.SDK_INT >= 26) startForegroundService(Intent(this, javaClass)) - else startService(Intent(this, javaClass)) - } - - fun killProcesses(scope: CoroutineScope) { - data.processes?.run { - close(scope) - data.processes = null - } - } - - fun stopRunner(restart: Boolean = false, msg: String? = null) { - if (data.state == State.Stopping) return - // change the state - data.changeState(State.Stopping) - GlobalScope.launch(Dispatchers.Main.immediate) { - data.connectingJob?.cancelAndJoin() // ensure stop connecting first - this@Interface as Service - // we use a coroutineScope here to allow clean-up in parallel - coroutineScope { - killProcesses(this) - // clean up receivers - val data = data - if (data.closeReceiverRegistered) { - unregisterReceiver(data.closeReceiver) - data.closeReceiverRegistered = false - } - -// data.notification?.destroy() -// data.notification = null - - val ids = listOfNotNull(data.proxy, data.udpFallback).map { - it.shutdown(this) - it.profile.id - } - data.proxy = null - data.udpFallback = null - data.binder.trafficPersisted(ids) - } - - // change the state - data.changeState(State.Stopped, msg) - - // stop the service if nothing has bound to it - if (restart) { - startRunner() - } else { - Log.d("Aman", "Stop Self BaseService-------") -// stopSelf() - } - } - } - - suspend fun preInit() {} - suspend fun resolver(host: String) = InetAddress.getAllByName(host) - suspend fun openConnection(url: URL) = url.openConnection() - - fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - val data = data - if (data.state != State.Stopped) return Service.START_REDELIVER_INTENT - val profilePair = Core.currentProfile - this as Context - if (profilePair == null) { - // gracefully shutdown: https://stackoverflow.com/q/47337857/2245107 -// data.notification = createNotification("") - stopRunner(false, getString(R.string.profile_empty)) - return Service.START_REDELIVER_INTENT - } - val (profile, fallback) = profilePair - profile.name = profile.formattedName // save name for later queries - val proxy = ProxyInstance(profile) - data.proxy = proxy - data.udpFallback = - if (fallback == null) null else ProxyInstance(fallback, profile.route) - - if (!data.closeReceiverRegistered) { - registerReceiver(data.closeReceiver, IntentFilter().apply { - addAction(Action.RELOAD) - addAction(Intent.ACTION_SHUTDOWN) - addAction(Action.CLOSE) - }) - data.closeReceiverRegistered = true - } - -// data.notification = createNotification(profile.formattedName) - - data.changeState(State.Connecting) - data.connectingJob = GlobalScope.launch(Dispatchers.Main) { - try { - Executable.killAll() // clean up old processes - preInit() - proxy.init(this@Interface) - data.udpFallback?.init(this@Interface) - - data.processes = GuardedProcessPool { - printLog(it) - stopRunner(false, it.readableMessage) - } - startProcesses() - - proxy.scheduleUpdate() - data.udpFallback?.scheduleUpdate() - - data.changeState(State.Connected) - } catch (_: CancellationException) { - // if the job was cancelled, it is canceller's responsibility to call stopRunner - } catch (_: UnknownHostException) { - stopRunner(false, getString(R.string.invalid_server)) - } catch (exc: Throwable) { - if (exc !is PluginManager.PluginNotFoundException && - exc !is BindException && - exc !is ShadowsocksVpnService.NullConnectionException - ) { - printLog(exc) - } - stopRunner( - false, - "${getString(R.string.service_failed)}: ${exc.readableMessage}" - ) - } finally { - data.connectingJob = null - } - } - return Service.START_REDELIVER_INTENT - } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/Executable.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/Executable.kt deleted file mode 100644 index 485cad3c1..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/Executable.kt +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.system.ErrnoException -import android.system.Os -import android.system.OsConstants -import android.text.TextUtils - -import java.io.File -import java.io.IOException - -object Executable { - const val REDSOCKS = "libredsocks.so" - const val SS_LOCAL = "libsslocal.so" - const val TUN2SOCKS = "libtun2socks.so" - - private val EXECUTABLES = setOf(SS_LOCAL, REDSOCKS, TUN2SOCKS) - - fun killAll() { - for (process in File("/proc").listFiles { _, name -> TextUtils.isDigitsOnly(name) }) { - val exe = File(try { - File(process, "cmdline").inputStream().bufferedReader().readText() - } catch (_: IOException) { - continue - }.split(Character.MIN_VALUE, limit = 2).first()) - if (EXECUTABLES.contains(exe.name)) try { - Os.kill(process.name.toInt(), OsConstants.SIGKILL) - } catch (e: ErrnoException) { - if (e.errno != OsConstants.ESRCH) { - e.printStackTrace() - } - } - } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/GuardedProcessPool.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/GuardedProcessPool.kt deleted file mode 100644 index 40a25c1b5..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/GuardedProcessPool.kt +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.os.Build -import android.os.SystemClock -import android.system.ErrnoException -import android.system.Os -import android.system.OsConstants -import android.util.Log -import androidx.annotation.MainThread - -import org.amnezia.vpn.shadowsocks.core.Core -import kotlinx.coroutines.* -import kotlinx.coroutines.channels.Channel -import java.io.File -import java.io.IOException -import java.io.InputStream -import kotlin.concurrent.thread - -class GuardedProcessPool(private val onFatal: suspend (IOException) -> Unit) : CoroutineScope { - companion object { - private const val TAG = "GuardedProcessPool" - private val pid by lazy { - Class.forName("java.lang.ProcessManager\$ProcessImpl").getDeclaredField("pid").apply { isAccessible = true } - } - } - - private inner class Guard(private val cmd: List) { - private lateinit var process: Process - - private fun streamLogger(input: InputStream, logger: (String) -> Unit) = try { - input.bufferedReader().forEachLine(logger) - } catch (_: IOException) { - } // ignore - - fun start() { - process = ProcessBuilder(cmd).directory(Core.deviceStorage.noBackupFilesDir).start() - } - - suspend fun looper(onRestartCallback: (suspend () -> Unit)?) { - var running = true - val cmdName = File(cmd.first()).nameWithoutExtension - val exitChannel = Channel() - try { - while (true) { - thread(name = "stderr-$cmdName") { streamLogger(process.errorStream) { Log.e(cmdName, it) } } - thread(name = "stdout-$cmdName") { - streamLogger(process.inputStream) { Log.i(cmdName, it) } - // this thread also acts as a daemon thread for waitFor - runBlocking { exitChannel.send(process.waitFor()) } - } - val startTime = SystemClock.elapsedRealtime() - val exitCode = exitChannel.receive() - running = false - if (SystemClock.elapsedRealtime() - startTime < 1000) { - throw IOException("$cmdName exits too fast (exit code: $exitCode)") - } - start() - onRestartCallback?.invoke() - } - } catch (e: IOException) { - GlobalScope.launch(Dispatchers.Main) { onFatal(e) } - } finally { - if (running) withContext(NonCancellable) { - // clean-up cannot be cancelled - if (Build.VERSION.SDK_INT < 24) { - try { - Os.kill(pid.get(process) as Int, OsConstants.SIGTERM) - } catch (e: ErrnoException) { - if (e.errno != OsConstants.ESRCH) throw e - } - if (withTimeoutOrNull(500) { exitChannel.receive() } != null) return@withContext - } - process.destroy() // kill the process - if (Build.VERSION.SDK_INT >= 26) { - if (withTimeoutOrNull(1000) { exitChannel.receive() } != null) return@withContext - process.destroyForcibly() // Force to kill the process if it's still alive - } - exitChannel.receive() - } // otherwise process already exited, nothing to be done - } - } - } - - override val coroutineContext = Dispatchers.Main.immediate + Job() - - @MainThread - fun start(cmd: List, onRestartCallback: (suspend () -> Unit)? = null) { - Guard(cmd).apply { - start() // if start fails, IOException will be thrown directly - launch { looper(onRestartCallback) } - } - } - - @MainThread - fun close(scope: CoroutineScope) { - cancel() - coroutineContext[Job]!!.also { job -> scope.launch { job.join() } } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/LocalDnsService.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/LocalDnsService.kt deleted file mode 100644 index 481a5d728..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/LocalDnsService.kt +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.acl.Acl -import org.amnezia.vpn.shadowsocks.core.R -import org.amnezia.vpn.shadowsocks.core.net.LocalDnsServer -import org.amnezia.vpn.shadowsocks.core.net.Socks5Endpoint -import org.amnezia.vpn.shadowsocks.core.net.Subnet -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import kotlinx.coroutines.CoroutineScope -import java.net.InetSocketAddress -import java.net.URI -import java.util.* - -object LocalDnsService { - private val googleApisTester = - "(^|\\.)googleapis(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?){1,2}\$".toRegex() - private val chinaIpList by lazy { - app.resources.openRawResource(R.raw.china_ip_list).bufferedReader() - .lineSequence().map(Subnet.Companion::fromString).filterNotNull().toList() - } - - private val servers = WeakHashMap() - - interface Interface : BaseService.Interface { - override suspend fun startProcesses() { - super.startProcesses() - val profile = data.proxy!!.profile - val dns = URI("dns://${profile.remoteDns}") - LocalDnsServer(this::resolver, - Socks5Endpoint(dns.host, if (dns.port < 0) 53 else dns.port), - DataStore.proxyAddress).apply { - tcp = !profile.udpdns - when (profile.route) { - Acl.BYPASS_CHN, Acl.BYPASS_LAN_CHN, Acl.GFWLIST, Acl.CUSTOM_RULES -> { - remoteDomainMatcher = googleApisTester - localIpMatcher = chinaIpList - } - Acl.CHINALIST -> { } - else -> forwardOnly = true - } - }.also { servers[this] = it }.start(InetSocketAddress(DataStore.listenAddress, DataStore.portLocalDns)) - } - - override fun killProcesses(scope: CoroutineScope) { - servers.remove(this)?.shutdown(scope) - super.killProcesses(scope) - } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyInstance.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyInstance.kt deleted file mode 100644 index a4ca6d5bc..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyInstance.kt +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.content.Context - -import org.amnezia.vpn.shadowsocks.core.acl.Acl -import org.amnezia.vpn.shadowsocks.core.acl.AclSyncer -import org.amnezia.vpn.shadowsocks.core.database.Profile -import org.amnezia.vpn.shadowsocks.core.database.ProfileManager -import org.amnezia.vpn.shadowsocks.core.plugin.PluginConfiguration -import org.amnezia.vpn.shadowsocks.core.plugin.PluginManager -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.DirectBoot -import org.amnezia.vpn.shadowsocks.core.utils.parseNumericAddress -import kotlinx.coroutines.* -import java.io.File -import java.io.IOException -import java.net.UnknownHostException - -/** - * This class sets up environment for ss-local. - */ -class ProxyInstance(val profile: Profile, private val route: String = profile.route) { - private var configFile: File? = null - var trafficMonitor: TrafficMonitor? = null - private val plugin = PluginConfiguration(profile.plugin ?: "").selectedOptions - val pluginPath by lazy { PluginManager.init(plugin) } - - suspend fun init(service: BaseService.Interface) { - if (route == Acl.CUSTOM_RULES) withContext(Dispatchers.IO) { - Acl.save(Acl.CUSTOM_RULES, Acl.customRules.flatten(10, service::openConnection)) - } - - // it's hard to resolve DNS on a specific interface so we'll do it here - if (profile.host.parseNumericAddress() == null) { - while (true) try { - val io = GlobalScope.async(Dispatchers.IO) { service.resolver(profile.host) } - profile.host = io.await().firstOrNull()?.hostAddress ?: throw UnknownHostException() - return - } catch (e: UnknownHostException) { - // retries are only needed on Chrome OS where arc0 is brought up/down during VPN changes - if (!DataStore.hasArc0) throw e - Thread.yield() - } - } - } - - /** - * Sensitive shadowsocks configuration file requires extra protection. It may be stored in encrypted storage or - * device storage, depending on which is currently available. - */ - fun start(service: BaseService.Interface, stat: File, configFile: File, extraFlag: String? = null) { - trafficMonitor = TrafficMonitor(stat) - - this.configFile = configFile - val config = profile.toJson() - if (pluginPath != null) config.put("plugin", pluginPath).put("plugin_opts", plugin.toString()) - configFile.writeText(config.toString()) - - val cmd = service.buildAdditionalArguments(arrayListOf( - File((service as Context).applicationInfo.nativeLibraryDir, Executable.SS_LOCAL).absolutePath, - "-b", DataStore.listenAddress, - "-l", DataStore.portProxy.toString(), - "-t", "600", - "-S", stat.absolutePath, - "-c", configFile.absolutePath)) - if (extraFlag != null) cmd.add(extraFlag) - - if (route != Acl.ALL) { - cmd += "--acl" - cmd += Acl.getFile(route).absolutePath - } - - // for UDP profile, it's only going to operate in UDP relay mode-only so this flag has no effect - if (profile.route == Acl.ALL || profile.route == Acl.BYPASS_LAN) cmd += "-D" - - if (DataStore.tcpFastOpen) cmd += "--fast-open" - - service.data.processes!!.start(cmd) - } - - fun scheduleUpdate() { - if (route !in arrayOf(Acl.ALL, Acl.CUSTOM_RULES)) AclSyncer.schedule(route) - } - - fun shutdown(scope: CoroutineScope) { - trafficMonitor?.apply { - thread.shutdown(scope) - // Make sure update total traffic when stopping the runner - try { - // profile may have host, etc. modified and thus a re-fetch is necessary (possible race condition) - val profile = ProfileManager.getProfile(profile.id) ?: return - profile.tx += current.txTotal - profile.rx += current.rxTotal - ProfileManager.updateProfile(profile) - } catch (e: IOException) { - if (!DataStore.directBootAware) throw e // we should only reach here because we're in direct boot - val profile = DirectBoot.getDeviceProfile()!!.toList().filterNotNull().single { it.id == profile.id } - profile.tx += current.txTotal - profile.rx += current.rxTotal - profile.dirty = true - DirectBoot.update(profile) - DirectBoot.listenForUnlock() - } - } - trafficMonitor = null - configFile?.delete() // remove old config possibly in device storage - configFile = null - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyService.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyService.kt deleted file mode 100644 index 4f4372ef7..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ProxyService.kt +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.app.Service -import android.content.Intent - -/** - * Shadowsocks service at its minimum. - */ -class ProxyService : Service(), BaseService.Interface { - override val data = BaseService.Data(this) - override val tag: String get() = "ShadowsocksProxyService" -// override fun createNotification(profileName: String): ServiceNotification = -// ServiceNotification(this, profileName, "service-proxy", true) - - override fun onBind(intent: Intent) = super.onBind(intent) - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int = - super.onStartCommand(intent, flags, startId) - override fun onDestroy() { - super.onDestroy() - data.binder.close() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ServiceNotification.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ServiceNotification.kt deleted file mode 100644 index 7a4ca1b39..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ServiceNotification.kt +++ /dev/null @@ -1,145 +0,0 @@ -///******************************************************************************* -// * * -// * Copyright (C) 2017 by Max Lv * -// * Copyright (C) 2017 by Mygod Studio * -// * * -// * This program is free software: you can redistribute it and/or modify * -// * it under the terms of the GNU General Public License as published by * -// * the Free Software Foundation, either version 3 of the License, or * -// * (at your option) any later version. * -// * * -// * This program is distributed in the hope that it will be useful, * -// * but WITHOUT ANY WARRANTY; without even the implied warranty of * -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -// * GNU General Public License for more details. * -// * * -// * You should have received a copy of the GNU General Public License * -// * along with this program. If not, see . * -// * * -// *******************************************************************************/ -// -//package org.amnezia.vpn.shadowsocks.core.bg -// -//import android.app.KeyguardManager -//import android.app.NotificationManager -//import android.app.PendingIntent -//import android.app.Service -//import android.content.Context -//import android.content.Intent -//import android.content.IntentFilter -//import android.os.Build -//import android.os.PowerManager -//import android.text.format.Formatter -//import androidx.core.app.NotificationCompat -//import androidx.core.content.ContextCompat -//import androidx.core.content.getSystemService -//import org.amnezia.vpn.shadowsocks.core.Core -//import org.amnezia.vpn.shadowsocks.core.aidl.IShadowsocksServiceCallback -//import org.amnezia.vpn.shadowsocks.core.aidl.TrafficStats -//import org.amnezia.vpn.shadowsocks.core.R -//import org.amnezia.vpn.shadowsocks.core.utils.Action -//import org.amnezia.vpn.shadowsocks.core.utils.broadcastReceiver -// -///** -// * Android < 8 VPN: always invisible because of VPN notification/icon -// * Android < 8 other: only invisible in (possibly unsecure) lockscreen -// * Android 8+: always visible due to system limitations -// * (user can choose to hide the notification in secure lockscreen or anywhere) -// */ -//class ServiceNotification(private val service: BaseService.Interface, profileName: String, -// channel: String, private val visible: Boolean = false) { -// private val keyGuard = (service as Context).getSystemService()!! -// private val nm by lazy { (service as Context).getSystemService()!! } -// private val callback: IShadowsocksServiceCallback by lazy { -// object : IShadowsocksServiceCallback.Stub() { -// override fun stateChanged(state: Int, profileName: String?, msg: String?) { -// when (state) { -// BaseService.State.Connected.ordinal -> { -// builder.setContentText("VPN Connected") -// } -// BaseService.State.Stopped.ordinal -> { -// builder.setContentText("VPN Disconnected") -// } -// } -// } // ignore -// override fun trafficUpdated(profileId: Long, stats: TrafficStats) { -//// if (profileId != 0L) return -//// service as Context -//// val txr = service.getString(R.string.speed, Formatter.formatFileSize(service, stats.txRate)) -//// val rxr = service.getString(R.string.speed, Formatter.formatFileSize(service, stats.rxRate)) -//// builder.setContentText("$txr↑\t$rxr↓") -//// style.bigText(service.getString(R.string.stat_summary, txr, rxr, -//// Formatter.formatFileSize(service, stats.txTotal), -//// Formatter.formatFileSize(service, stats.rxTotal))) -//// show() -// } -// override fun trafficPersisted(profileId: Long) { } -// } -// } -//// private val lockReceiver = broadcastReceiver { _, intent -> update(intent.action) } -// private var callbackRegistered = false -// -// private val builder = NotificationCompat.Builder(service as Context, channel) -// .setWhen(0) -// .setColor(ContextCompat.getColor(service, R.color.material_primary_500)) -// .setTicker(service.getString(R.string.forward_success)) -// .setContentTitle("AmneziaVPN -- testing") -// .setContentIntent(Core.configureIntent(service)) -// .setSmallIcon(R.drawable.ic_amnezia_round) -// private val style = NotificationCompat.BigTextStyle(builder).bigText("") -// private var isVisible = true -// -// init { -// service as Context -//// if (Build.VERSION.SDK_INT < 24) builder.addAction(R.drawable.ic_navigation_close, -//// service.getString(R.string.stop), PendingIntent.getBroadcast(service, 0, Intent(Action.CLOSE), 0)) -//// update(if (service.getSystemService()?.isInteractive != false) -//// Intent.ACTION_SCREEN_ON else Intent.ACTION_SCREEN_OFF, true) -//// service.registerReceiver(lockReceiver, IntentFilter().apply { -//// addAction(Intent.ACTION_SCREEN_ON) -//// addAction(Intent.ACTION_SCREEN_OFF) -//// if (visible && Build.VERSION.SDK_INT < 26) addAction(Intent.ACTION_USER_PRESENT) -//// }) -// } -// -//// private fun update(action: String?, forceShow: Boolean = false) { -//// if (forceShow || service.data.state == BaseService.State.Connected) when (action) { -//// Intent.ACTION_SCREEN_OFF -> { -//// setVisible(false, forceShow) -//// unregisterCallback() // unregister callback to save battery -//// } -//// Intent.ACTION_SCREEN_ON -> { -//// setVisible(visible && !keyGuard.isKeyguardLocked, forceShow) -//// service.data.binder.registerCallback(callback) -//// service.data.binder.startListeningForBandwidth(callback, 1000) -//// callbackRegistered = true -//// } -//// Intent.ACTION_USER_PRESENT -> setVisible(true, forceShow) -//// } -//// } -// -// private fun unregisterCallback() { -// if (callbackRegistered) { -// service.data.binder.unregisterCallback(callback) -// callbackRegistered = false -// } -// } -// -// private fun setVisible(visible: Boolean, forceShow: Boolean = false) { -// if (isVisible != visible) { -// isVisible = visible -// builder.priority = if (visible) NotificationCompat.PRIORITY_LOW else NotificationCompat.PRIORITY_MIN -// show() -// } else if (forceShow) show() -// } -// -// -// private fun show() = (service as Service).startForeground(1337, builder.build()) -// -// fun destroy() { -//// (service as Service).unregisterReceiver(lockReceiver) -// unregisterCallback() -//// service.stopForeground(true) -// nm.cancel(1337) -// } -//} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ShadowsocksVpnService.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ShadowsocksVpnService.kt deleted file mode 100644 index 403bb1a3c..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/ShadowsocksVpnService.kt +++ /dev/null @@ -1,256 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.app.Service -import android.content.Intent -import android.content.pm.PackageManager -import android.net.LocalSocket -import android.net.LocalSocketAddress -import android.net.Network -import android.os.Build -import android.os.ParcelFileDescriptor -import android.system.ErrnoException -import android.system.Os -import android.util.Log -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.R -import org.amnezia.vpn.shadowsocks.core.VpnRequestActivity -import org.amnezia.vpn.shadowsocks.core.acl.Acl -import org.amnezia.vpn.shadowsocks.core.net.ConcurrentLocalSocketListener -import org.amnezia.vpn.shadowsocks.core.net.DefaultNetworkListener -import org.amnezia.vpn.shadowsocks.core.net.Subnet -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Key -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import java.io.Closeable -import java.io.File -import java.io.FileDescriptor -import java.io.IOException -import java.net.URL -import java.util.* -import android.net.VpnService as BaseVpnService - -open class ShadowsocksVpnService : BaseVpnService(), LocalDnsService.Interface { - companion object { - private const val VPN_MTU = 1500 - private const val PRIVATE_VLAN4_CLIENT = "172.19.0.1" - private const val PRIVATE_VLAN4_ROUTER = "172.19.0.2" - private const val PRIVATE_VLAN6_CLIENT = "fdfe:dcba:9876::1" - private const val PRIVATE_VLAN6_ROUTER = "fdfe:dcba:9876::2" - - /** - * https://android.googlesource.com/platform/prebuilts/runtime/+/94fec32/appcompat/hiddenapi-light-greylist.txt#9466 - */ - private val getInt = FileDescriptor::class.java.getDeclaredMethod("getInt$") - } - - class CloseableFd(val fd: FileDescriptor) : Closeable { - override fun close() = Os.close(fd) - } - - private inner class ProtectWorker : ConcurrentLocalSocketListener("ShadowsocksVpnThread", - File(Core.deviceStorage.noBackupFilesDir, "protect_path")) { - override fun acceptInternal(socket: LocalSocket) { - socket.inputStream.read() - val fd = socket.ancillaryFileDescriptors!!.single()!! - CloseableFd(fd).use { - socket.outputStream.write(if (underlyingNetwork.let { network -> - if (network != null && Build.VERSION.SDK_INT >= 23) try { - network.bindSocket(fd) - true - } catch (e: IOException) { - // suppress ENONET (Machine is not on the network) - if ((e.cause as? ErrnoException)?.errno != 64) printLog(e) - false - } else protect(getInt.invoke(fd) as Int) - }) 0 else 1) - } - } - } - - inner class NullConnectionException : NullPointerException() { - override fun getLocalizedMessage() = getString(R.string.reboot_required) - } - - override val data = BaseService.Data(this) - override val tag: String get() = "ShadowsocksVpnService" - - val NOTIFICATION_CHANNEL_ID = "com.amnezia.vpnNotification" -// override fun createNotification(profileName: String): ServiceNotification = -// ServiceNotification(this, profileName, NOTIFICATION_CHANNEL_ID) - - private var conn: ParcelFileDescriptor? = null - private var worker: ProtectWorker? = null - private var active = false - private var metered = false - private var underlyingNetwork: Network? = null - set(value) { - field = value - if (active && Build.VERSION.SDK_INT >= 22) setUnderlyingNetworks(underlyingNetworks) - } - private val underlyingNetworks - get() = - // clearing underlyingNetworks makes Android 9+ consider the network to be metered - if (Build.VERSION.SDK_INT >= 28 && metered) null else underlyingNetwork?.let { arrayOf(it) } - - override fun onBind(intent: Intent) = when (intent.action) { - SERVICE_INTERFACE -> super.onBind(intent) - else -> super.onBind(intent) - } - - override fun onRevoke() { - stopRunner() - } - - override fun killProcesses(scope: CoroutineScope) { - super.killProcesses(scope) - active = false - scope.launch { DefaultNetworkListener.stop(this) } - worker?.shutdown(scope) - worker = null - conn?.close() - conn = null - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - if (DataStore.serviceMode == Key.modeVpn) { - if (prepare(this) != null) { - startActivity(Intent(this, VpnRequestActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) - } else return super.onStartCommand(intent, flags, startId) - } - stopRunner() - return Service.START_STICKY - } - - override suspend fun preInit() = DefaultNetworkListener.start(this) { underlyingNetwork = it } - override suspend fun resolver(host: String) = DefaultNetworkListener.get().getAllByName(host) - override suspend fun openConnection(url: URL) = DefaultNetworkListener.get().openConnection(url) - - override suspend fun startProcesses() { - worker = ProtectWorker().apply { start() } - super.startProcesses() - sendFd(startVpn()) - } - - override fun buildAdditionalArguments(cmd: ArrayList): ArrayList { - cmd += "-V" - return cmd - } - - private suspend fun startVpn(): FileDescriptor { - val profile = data.proxy!!.profile - val builder = Builder() - .setConfigureIntent(Core.configureIntent(this)) - .setSession(profile.formattedName) - .setMtu(VPN_MTU) - .addAddress(PRIVATE_VLAN4_CLIENT, 30) - .addDnsServer(PRIVATE_VLAN4_ROUTER) - - if (profile.ipv6) { - builder.addAddress(PRIVATE_VLAN6_CLIENT, 126) - builder.addRoute("::", 0) - } - val me = packageName - if (profile.proxyApps) { - profile.individual.split('\n') - .filter { it != me } - .forEach { - try { - if (profile.bypass) builder.addDisallowedApplication(it) - else builder.addAllowedApplication(it) - } catch (ex: PackageManager.NameNotFoundException) { - printLog(ex) - } - } - if (profile.bypass) { - builder.addDisallowedApplication(me) - } - } else { - builder.addDisallowedApplication(me) - } - - when (profile.route) { - Acl.ALL, Acl.BYPASS_CHN, Acl.CUSTOM_RULES -> builder.addRoute("0.0.0.0", 0) - else -> { - resources.getStringArray(R.array.bypass_private_route).forEach { - val subnet = Subnet.fromString(it)!! - builder.addRoute(subnet.address.hostAddress, subnet.prefixSize) - } - builder.addRoute(PRIVATE_VLAN4_ROUTER, 32) - } - } - - metered = profile.metered - active = true // possible race condition here? - if (Build.VERSION.SDK_INT >= 22) builder.setUnderlyingNetworks(underlyingNetworks) - - val conn = builder.establish() ?: throw NullConnectionException() - this.conn = conn - - val cmd = arrayListOf(File(applicationInfo.nativeLibraryDir, Executable.TUN2SOCKS).absolutePath, - "--netif-ipaddr", PRIVATE_VLAN4_ROUTER, - "--socks-server-addr", "${DataStore.listenAddress}:${DataStore.portProxy}", - "--tunmtu", VPN_MTU.toString(), - "--sock-path", "sock_path", - "--dnsgw", "127.0.0.1:${DataStore.portLocalDns}", - "--loglevel", "warning") - if (profile.ipv6) { - cmd += "--netif-ip6addr" - cmd += PRIVATE_VLAN6_ROUTER - } - cmd += "--enable-udprelay" - data.processes!!.start(cmd, onRestartCallback = { - try { - sendFd(conn.fileDescriptor) - } catch (e: ErrnoException) { - e.printStackTrace() - stopRunner(false, e.message) - } - }) - return conn.fileDescriptor - } - - private suspend fun sendFd(fd: FileDescriptor) { - var tries = 0 - val path = File(Core.deviceStorage.noBackupFilesDir, "sock_path").absolutePath - while (true) try { - delay(50L shl tries) - LocalSocket().use { localSocket -> - localSocket.connect(LocalSocketAddress(path, LocalSocketAddress.Namespace.FILESYSTEM)) - localSocket.setFileDescriptorsForSend(arrayOf(fd)) - localSocket.outputStream.write(42) - } - return - } catch (e: IOException) { - if (tries > 5) throw e - tries += 1 - } - } - - override fun onDestroy() { - super.onDestroy() - data.binder.close() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TrafficMonitor.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TrafficMonitor.kt deleted file mode 100644 index 1c4f25ae0..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TrafficMonitor.kt +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.net.LocalSocket -import android.os.SystemClock -import org.amnezia.vpn.shadowsocks.core.aidl.TrafficStats -import org.amnezia.vpn.shadowsocks.core.net.LocalSocketListener -import java.io.File -import java.io.IOException -import java.nio.ByteBuffer -import java.nio.ByteOrder - -class TrafficMonitor(statFile: File) { - val thread = object : LocalSocketListener("TrafficMonitor-" + statFile.name, statFile) { - private val buffer = ByteArray(16) - private val stat = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN) - override fun acceptInternal(socket: LocalSocket) { - if (socket.inputStream.read(buffer) != 16) throw IOException("Unexpected traffic stat length") - val tx = stat.getLong(0) - val rx = stat.getLong(8) - if (current.txTotal != tx) { - current.txTotal = tx - dirty = true - } - if (current.rxTotal != rx) { - current.rxTotal = rx - dirty = true - } - } - }.apply { start() } - - val current = TrafficStats() - var out = TrafficStats() - private var timestampLast = 0L - private var dirty = false - - fun requestUpdate(): Pair { - val now = SystemClock.elapsedRealtime() - val delta = now - timestampLast - timestampLast = now - var updated = false - if (delta != 0L) { - if (dirty) { - out = current.copy().apply { - txRate = (txTotal - out.txTotal) * 1000 / delta - rxRate = (rxTotal - out.rxTotal) * 1000 / delta - } - dirty = false - updated = true - } else { - if (out.txRate != 0L) { - out.txRate = 0 - updated = true - } - if (out.rxRate != 0L) { - out.rxRate = 0 - updated = true - } - } - } - return Pair(out, updated) - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TransproxyService.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TransproxyService.kt deleted file mode 100644 index 1da2d3f2b..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/bg/TransproxyService.kt +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.bg - -import android.app.Service -import android.content.Intent -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import java.io.File - -class TransproxyService : Service(), LocalDnsService.Interface { - override val data = BaseService.Data(this) - override val tag: String get() = "ShadowsocksTransproxyService" -// override fun createNotification(profileName: String): ServiceNotification = -// ServiceNotification(this, profileName, "service-transproxy", true) - - override fun onBind(intent: Intent) = super.onBind(intent) - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int = - super.onStartCommand(intent, flags, startId) - - private fun startRedsocksDaemon() { - File(Core.deviceStorage.noBackupFilesDir, "redsocks.conf").writeText( - """base { - log_debug = off; - log_info = off; - log = stderr; - daemon = off; - redirector = iptables; -} -redsocks { - local_ip = ${DataStore.listenAddress}; - local_port = ${DataStore.portTransproxy}; - ip = 127.0.0.1; - port = ${DataStore.portProxy}; - type = socks5; -} -""" - ) - data.processes!!.start( - listOf( - File(applicationInfo.nativeLibraryDir, Executable.REDSOCKS).absolutePath, - "-c", - "redsocks.conf" - ) - ) - } - - override suspend fun startProcesses() { - startRedsocksDaemon() - super.startProcesses() - } - - override fun onDestroy() { - super.onDestroy() - data.binder.close() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/KeyValuePair.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/KeyValuePair.kt deleted file mode 100644 index 58159a82e..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/KeyValuePair.kt +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.database - -import androidx.room.* -import java.io.ByteArrayOutputStream -import java.nio.ByteBuffer - -@Entity -class KeyValuePair() { - companion object { - const val TYPE_UNINITIALIZED = 0 - const val TYPE_BOOLEAN = 1 - const val TYPE_FLOAT = 2 - @Deprecated("Use TYPE_LONG.") - const val TYPE_INT = 3 - const val TYPE_LONG = 4 - const val TYPE_STRING = 5 - const val TYPE_STRING_SET = 6 - } - - @androidx.room.Dao - interface Dao { - @Query("SELECT * FROM `KeyValuePair` WHERE `key` = :key") - operator fun get(key: String): KeyValuePair? - - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun put(value: KeyValuePair): Long - - @Query("DELETE FROM `KeyValuePair` WHERE `key` = :key") - fun delete(key: String): Int - } - - @PrimaryKey - var key: String = "" - var valueType: Int = TYPE_UNINITIALIZED - var value: ByteArray = ByteArray(0) - - val boolean: Boolean? - get() = if (valueType == TYPE_BOOLEAN) ByteBuffer.wrap(value).get() != 0.toByte() else null - val float: Float? - get() = if (valueType == TYPE_FLOAT) ByteBuffer.wrap(value).float else null - @Suppress("DEPRECATION") - @Deprecated("Use long.", ReplaceWith("long")) - val int: Int? - get() = if (valueType == TYPE_INT) ByteBuffer.wrap(value).int else null - val long: Long? get() = when (valueType) { - @Suppress("DEPRECATION") - TYPE_INT -> ByteBuffer.wrap(value).int.toLong() - TYPE_LONG -> ByteBuffer.wrap(value).long - else -> null - } - val string: String? - get() = if (valueType == TYPE_STRING) String(value) else null - val stringSet: Set? - get() = if (valueType == TYPE_STRING_SET) { - val buffer = ByteBuffer.wrap(value) - val result = HashSet() - while (buffer.hasRemaining()) { - val chArr = ByteArray(buffer.int) - buffer.get(chArr) - result.add(String(chArr)) - } - result - } else null - - @Ignore - constructor(key: String) : this() { - this.key = key - } - - // putting null requires using DataStore - fun put(value: Boolean): KeyValuePair { - valueType = TYPE_BOOLEAN - this.value = ByteBuffer.allocate(1).put((if (value) 1 else 0).toByte()).array() - return this - } - fun put(value: Float): KeyValuePair { - valueType = TYPE_FLOAT - this.value = ByteBuffer.allocate(4).putFloat(value).array() - return this - } - @Suppress("DEPRECATION") - @Deprecated("Use long.") - fun put(value: Int): KeyValuePair { - valueType = TYPE_INT - this.value = ByteBuffer.allocate(4).putInt(value).array() - return this - } - fun put(value: Long): KeyValuePair { - valueType = TYPE_LONG - this.value = ByteBuffer.allocate(8).putLong(value).array() - return this - } - fun put(value: String): KeyValuePair { - valueType = TYPE_STRING - this.value = value.toByteArray() - return this - } - fun put(value: Set): KeyValuePair { - valueType = TYPE_STRING_SET - val stream = ByteArrayOutputStream() - for (v in value) { - stream.write(ByteBuffer.allocate(4).putInt(v.length).array()) - stream.write(v.toByteArray()) - } - this.value = stream.toByteArray() - return this - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PrivateDatabase.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PrivateDatabase.kt deleted file mode 100644 index 19f44d382..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PrivateDatabase.kt +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.database - -import androidx.room.Database -import androidx.room.Room -import androidx.room.RoomDatabase -import androidx.room.migration.Migration -import androidx.sqlite.db.SupportSQLiteDatabase -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.database.migration.RecreateSchemaMigration -import org.amnezia.vpn.shadowsocks.core.utils.Key - -@Database(entities = [Profile::class, KeyValuePair::class], version = 29) -abstract class PrivateDatabase : RoomDatabase() { - companion object { - private val instance by lazy { - Room.databaseBuilder(app, PrivateDatabase::class.java, Key.DB_PROFILE) - .addMigrations( - Migration26, - Migration27, - Migration28 - ) - .fallbackToDestructiveMigration() - .allowMainThreadQueries() - .build() - } - - val profileDao get() = instance.profileDao() - val kvPairDao get() = instance.keyValuePairDao() - } - abstract fun profileDao(): Profile.Dao - abstract fun keyValuePairDao(): KeyValuePair.Dao - - object Migration26 : RecreateSchemaMigration(25, 26, "Profile", - "(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `host` TEXT NOT NULL, `remotePort` INTEGER NOT NULL, `password` TEXT NOT NULL, `method` TEXT NOT NULL, `route` TEXT NOT NULL, `remoteDns` TEXT NOT NULL, `proxyApps` INTEGER NOT NULL, `bypass` INTEGER NOT NULL, `udpdns` INTEGER NOT NULL, `ipv6` INTEGER NOT NULL, `individual` TEXT NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `plugin` TEXT)", - "`id`, `name`, `host`, `remotePort`, `password`, `method`, `route`, `remoteDns`, `proxyApps`, `bypass`, `udpdns`, `ipv6`, `individual`, `tx`, `rx`, `userOrder`, `plugin`") { - override fun migrate(database: SupportSQLiteDatabase) { - super.migrate(database) - PublicDatabase.Migration3.migrate(database) - } - } - object Migration27 : Migration(26, 27) { - override fun migrate(database: SupportSQLiteDatabase) = - database.execSQL("ALTER TABLE `Profile` ADD COLUMN `udpFallback` INTEGER") - } - object Migration28 : Migration(27, 28) { - override fun migrate(database: SupportSQLiteDatabase) = - database.execSQL("ALTER TABLE `Profile` ADD COLUMN `metered` INTEGER NOT NULL DEFAULT 0") - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/Profile.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/Profile.kt deleted file mode 100644 index 16a732571..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/Profile.kt +++ /dev/null @@ -1,330 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.database - -import android.annotation.TargetApi -import android.net.Uri -import android.os.Parcelable -import android.util.Base64 -import android.util.Log -import android.util.LongSparseArray -import androidx.core.net.toUri -import androidx.room.* -import org.amnezia.vpn.shadowsocks.core.plugin.PluginConfiguration -import org.amnezia.vpn.shadowsocks.plugin.PluginOptions -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Key -import org.amnezia.vpn.shadowsocks.core.utils.asIterable -import org.amnezia.vpn.shadowsocks.core.utils.parsePort -import kotlinx.android.parcel.Parcelize -import org.json.JSONArray -import org.json.JSONObject -import org.json.JSONTokener -import java.io.Serializable -import java.net.URI -import java.net.URISyntaxException -import java.util.* - -@Entity -@Parcelize -data class Profile( - @PrimaryKey(autoGenerate = true) - var id: Long = 0, - var name: String? = "", - var host: String = "155.94.174.51", - var remotePort: Int = 444, - var password: String = "789456123", - var method: String = "aes-256-cfb", - var route: String = "all", - var remoteDns: String = "dns.google", - var proxyApps: Boolean = false, - var bypass: Boolean = false, - var udpdns: Boolean = false, - var ipv6: Boolean = true, - @TargetApi(28) - var metered: Boolean = false, - var individual: String = "", - var tx: Long = 0, - var rx: Long = 0, - var userOrder: Long = 0, - var plugin: String? = null, - var udpFallback: Long? = null, - - @Ignore // not persisted in db, only used by direct boot - var dirty: Boolean = false -) : Parcelable, Serializable { - companion object { - private const val TAG = "ShadowParser" - private const val serialVersionUID = 1L - private val pattern = - """(?i)ss://[-a-zA-Z0-9+&@#/%?=.~*'()|!:,;\[\]]*[-a-zA-Z0-9+&@#/%=.~*'()|\[\]]""".toRegex() - private val userInfoPattern = "^(.+?):(.*)$".toRegex() - private val legacyPattern = "^(.+?):(.*)@(.+?):(\\d+?)$".toRegex() - - fun findAllUrls(data: CharSequence?, feature: Profile? = null) = pattern.findAll(data ?: "").map { - val uri = it.value.toUri() - try { - if (uri.userInfo == null) { - val match = legacyPattern.matchEntire(String(Base64.decode(uri.host, Base64.NO_PADDING))) - if (match != null) { - val profile = Profile() - feature?.copyFeatureSettingsTo(profile) - profile.method = match.groupValues[1].toLowerCase() - profile.password = match.groupValues[2] - profile.host = match.groupValues[3] - profile.remotePort = match.groupValues[4].toInt() - profile.plugin = uri.getQueryParameter(Key.plugin) - profile.name = uri.fragment - profile - } else { - Log.e(TAG, "Unrecognized URI: ${it.value}") - null - } - } else { - val match = userInfoPattern.matchEntire(String(Base64.decode(uri.userInfo, - Base64.NO_PADDING or Base64.NO_WRAP or Base64.URL_SAFE))) - if (match != null) { - val profile = Profile() - feature?.copyFeatureSettingsTo(profile) - profile.method = match.groupValues[1] - profile.password = match.groupValues[2] - // bug in Android: https://code.google.com/p/android/issues/detail?id=192855 - try { - val javaURI = URI(it.value) - profile.host = javaURI.host ?: "" - if (profile.host.firstOrNull() == '[' && profile.host.lastOrNull() == ']') - profile.host = profile.host.substring(1, profile.host.length - 1) - profile.remotePort = javaURI.port - profile.plugin = uri.getQueryParameter(Key.plugin) - profile.name = uri.fragment ?: "" - profile - } catch (e: URISyntaxException) { - Log.e(TAG, "Invalid URI: ${it.value}") - null - } - } else { - Log.e(TAG, "Unknown user info: ${it.value}") - null - } - } - } catch (e: IllegalArgumentException) { - Log.e(TAG, "Invalid base64 detected: ${it.value}") - null - } - }.filterNotNull() - - private class JsonParser(private val feature: Profile? = null) : ArrayList() { - private val fallbackMap = mutableMapOf() - - private fun tryParse(json: JSONObject, fallback: Boolean = false): Profile? { - val host = json.optString("server") - if (host.isNullOrEmpty()) return null - val remotePort = json.optInt("server_port") - if (remotePort <= 0) return null - val password = json.optString("password") - if (password.isNullOrEmpty()) return null - val method = json.optString("method") - if (method.isNullOrEmpty()) return null - return Profile().also { - it.host = host - it.remotePort = remotePort - it.password = password - it.method = method - }.apply { - feature?.copyFeatureSettingsTo(this) - val id = json.optString("plugin") - if (!id.isNullOrEmpty()) { - plugin = PluginOptions(id, json.optString("plugin_opts")).toString(false) - } - name = json.optString("remarks") - route = json.optString("route", route) - if (fallback) return@apply - remoteDns = json.optString("remote_dns", remoteDns) - ipv6 = json.optBoolean("ipv6", ipv6) - metered = json.optBoolean("metered", metered) - json.optJSONObject("proxy_apps")?.also { - proxyApps = it.optBoolean("enabled", proxyApps) - bypass = it.optBoolean("bypass", bypass) - individual = it.optJSONArray("android_list")?.asIterable()?.joinToString("\n") ?: individual - } - udpdns = json.optBoolean("udpdns", udpdns) - json.optJSONObject("udp_fallback")?.let { tryParse(it, true) }?.also { fallbackMap[this] = it } - } - } - - fun process(json: Any) { - when (json) { - is JSONObject -> { - val profile = tryParse(json) - if (profile != null) add(profile) else for (key in json.keys()) process(json.get(key)) - } - is JSONArray -> json.asIterable().forEach(this::process) - // ignore other types - } - } - fun finalize(create: (Profile) -> Unit) { - val profiles = ProfileManager.getAllProfiles() ?: emptyList() - for ((profile, fallback) in fallbackMap) { - val match = profiles.firstOrNull { - fallback.host == it.host && fallback.remotePort == it.remotePort && - fallback.password == it.password && fallback.method == it.method && - it.plugin.isNullOrEmpty() - } - profile.udpFallback = if (match == null) { - create(fallback) - fallback.id - } else match.id - ProfileManager.updateProfile(profile) - } - } - } - fun parseJson(json: String, feature: Profile? = null, create: (Profile) -> Unit) = JsonParser(feature).run { - process(JSONTokener(json).nextValue()) - for (profile in this) create(profile) - finalize(create) - } - } - - @androidx.room.Dao - interface Dao { - @Query("SELECT * FROM `Profile` WHERE `id` = :id") - operator fun get(id: Long): Profile? - - @Query("SELECT * FROM `Profile` ORDER BY `userOrder`") - fun list(): List - - @Query("SELECT MAX(`userOrder`) + 1 FROM `Profile`") - fun nextOrder(): Long? - - @Query("SELECT 1 FROM `Profile` LIMIT 1") - fun isNotEmpty(): Boolean - - @Insert - fun create(value: Profile): Long - - @Update - fun update(value: Profile): Int - - @Query("DELETE FROM `Profile` WHERE `id` = :id") - fun delete(id: Long): Int - - @Query("DELETE FROM `Profile`") - fun deleteAll(): Int - } - - val formattedAddress get() = (if (host.contains(":")) "[%s]:%d" else "%s:%d").format(host, remotePort) - val formattedName get() = if (name.isNullOrEmpty()) formattedAddress else name!! - - fun copyFeatureSettingsTo(profile: Profile) { - profile.route = route - profile.ipv6 = ipv6 - profile.metered = metered - profile.proxyApps = proxyApps - profile.bypass = bypass - profile.individual = individual - profile.udpdns = udpdns - } - - fun toUri(): Uri { - val auth = Base64.encodeToString("$method:$password".toByteArray(), - Base64.NO_PADDING or Base64.NO_WRAP or Base64.URL_SAFE) - val wrappedHost = if (host.contains(':')) "[$host]" else host - val builder = Uri.Builder() - .scheme("ss") - .encodedAuthority("$auth@$wrappedHost:$remotePort") - val configuration = PluginConfiguration(plugin ?: "") - if (configuration.selected.isNotEmpty()) - builder.appendQueryParameter(Key.plugin, configuration.selectedOptions.toString(false)) - if (!name.isNullOrEmpty()) builder.fragment(name) - return builder.build() - } - override fun toString() = toUri().toString() - - fun toJson(profiles: LongSparseArray? = null): JSONObject = JSONObject().apply { - put("server", host) - put("server_port", remotePort) - put("password", password) - put("method", method) - if (profiles == null) return@apply - PluginConfiguration(plugin ?: "").selectedOptions.also { - if (it.id.isNotEmpty()) { - put("plugin", it.id) - put("plugin_opts", it.toString()) - } - } - put("remarks", name) - put("route", route) - put("remote_dns", remoteDns) - put("ipv6", ipv6) - put("metered", metered) - put("proxy_apps", JSONObject().apply { - put("enabled", proxyApps) - if (proxyApps) { - put("bypass", bypass) - // android_ prefix is used because package names are Android specific - put("android_list", JSONArray(individual.split("\n"))) - } - }) - put("udpdns", udpdns) - val fallback = profiles.get(udpFallback ?: return@apply) - if (fallback != null && fallback.plugin.isNullOrEmpty()) fallback.toJson().also { put("udp_fallback", it) } - } - - fun serialize() { - DataStore.editingId = id - DataStore.privateStore.putString(Key.name, name) - DataStore.privateStore.putString(Key.host, host) - DataStore.privateStore.putString(Key.remotePort, remotePort.toString()) - DataStore.privateStore.putString(Key.password, password) - DataStore.privateStore.putString(Key.route, route) - DataStore.privateStore.putString(Key.remoteDns, remoteDns) - DataStore.privateStore.putString(Key.method, method) - DataStore.proxyApps = proxyApps - DataStore.bypass = bypass - DataStore.privateStore.putBoolean(Key.udpdns, udpdns) - DataStore.privateStore.putBoolean(Key.ipv6, ipv6) - DataStore.privateStore.putBoolean(Key.metered, metered) - DataStore.individual = individual - DataStore.plugin = plugin ?: "" - DataStore.udpFallback = udpFallback - DataStore.privateStore.remove(Key.dirty) - } - fun deserialize() { - check(id == 0L || DataStore.editingId == id) - DataStore.editingId = null - // It's assumed that default values are never used, so 0/false/null is always used even if that isn't the case - name = DataStore.privateStore.getString(Key.name) ?: "" - host = DataStore.privateStore.getString(Key.host) ?: "" - remotePort = parsePort(DataStore.privateStore.getString(Key.remotePort), 8388, 1) - password = DataStore.privateStore.getString(Key.password) ?: "" - method = DataStore.privateStore.getString(Key.method) ?: "" - route = DataStore.privateStore.getString(Key.route) ?: "" - remoteDns = DataStore.privateStore.getString(Key.remoteDns) ?: "" - proxyApps = DataStore.proxyApps - bypass = DataStore.bypass - udpdns = DataStore.privateStore.getBoolean(Key.udpdns, false) - ipv6 = DataStore.privateStore.getBoolean(Key.ipv6, false) - metered = DataStore.privateStore.getBoolean(Key.metered, false) - individual = DataStore.individual - plugin = DataStore.plugin - udpFallback = DataStore.udpFallback - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/ProfileManager.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/ProfileManager.kt deleted file mode 100644 index 06ccf4c64..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/ProfileManager.kt +++ /dev/null @@ -1,140 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.database - -import android.database.sqlite.SQLiteCantOpenDatabaseException -import android.util.LongSparseArray -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.DirectBoot -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import org.json.JSONArray -import java.io.IOException -import java.io.InputStream -import java.sql.SQLException - -/** - * SQLExceptions are not caught (and therefore will cause crash) for insert/update transactions - * to ensure we are in a consistent state. - */ -object ProfileManager { - interface Listener { - fun onAdd(profile: Profile) - fun onRemove(profileId: Long) - fun onCleared() - } - var listener: Listener? = null - - @Throws(SQLException::class) - fun createProfile(profile: Profile = Profile()): Profile { - profile.id = 0 - profile.userOrder = PrivateDatabase.profileDao.nextOrder() ?: 0 - profile.id = PrivateDatabase.profileDao.create(profile) - listener?.onAdd(profile) - return profile - } - - fun createProfilesFromJson(jsons: Sequence, replace: Boolean = false) { - val profiles = if (replace) getAllProfiles()?.associateBy { it.formattedAddress } else null - val feature = if (replace) { - profiles?.values?.singleOrNull { it.id == DataStore.profileId } - } else Core.currentProfile?.first - val lazyClear = lazy { clear() } - var result: Exception? = null - for (json in jsons) try { - Profile.parseJson(json.bufferedReader().readText(), feature) { - if (replace) { - lazyClear.value - // if two profiles has the same address, treat them as the same profile and copy stats over - profiles?.get(it.formattedAddress)?.apply { - it.tx = tx - it.rx = rx - } - } - createProfile(it) - } - } catch (e: Exception) { - if (result == null) result = e else result.addSuppressed(e) - } - if (result != null) throw result - } - fun serializeToJson(profiles: List? = getAllProfiles()): JSONArray? { - if (profiles == null) return null - val lookup = LongSparseArray(profiles.size).apply { profiles.forEach { put(it.id, it) } } - return JSONArray(profiles.map { it.toJson(lookup) }.toTypedArray()) - } - - /** - * Note: It's caller's responsibility to update DirectBoot profile if necessary. - */ - @Throws(SQLException::class) - fun updateProfile(profile: Profile) = check(PrivateDatabase.profileDao.update(profile) == 1) - - @Throws(IOException::class) - fun getProfile(id: Long): Profile? = try { - PrivateDatabase.profileDao[id] - } catch (ex: SQLiteCantOpenDatabaseException) { - throw IOException(ex) - } catch (ex: SQLException) { - printLog(ex) - null - } - - @Throws(IOException::class) - fun expand(profile: Profile): Pair = Pair(profile, profile.udpFallback?.let { getProfile(it) }) - - @Throws(SQLException::class) - fun delProfile(id: Long) { - check(PrivateDatabase.profileDao.delete(id) == 1) - listener?.onRemove(id) - if (id in Core.activeProfileIds && DataStore.directBootAware) DirectBoot.clean() - } - - @Throws(SQLException::class) - fun clear() = PrivateDatabase.profileDao.deleteAll().also { - // listener is not called since this won't be used in mobile submodule - DirectBoot.clean() - listener?.onCleared() - } - - @Throws(IOException::class) - fun ensureNotEmpty() { - val nonEmpty = try { - PrivateDatabase.profileDao.isNotEmpty() - } catch (ex: SQLiteCantOpenDatabaseException) { - throw IOException(ex) - } catch (ex: SQLException) { - printLog(ex) - false - } - if (!nonEmpty) DataStore.profileId = createProfile().id - } - - @Throws(IOException::class) - fun getAllProfiles(): List? = try { - PrivateDatabase.profileDao.list() - } catch (ex: SQLiteCantOpenDatabaseException) { - throw IOException(ex) - } catch (ex: SQLException) { - printLog(ex) - null - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PublicDatabase.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PublicDatabase.kt deleted file mode 100644 index c2dd4169e..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/PublicDatabase.kt +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.database - -import androidx.room.Database -import androidx.room.Room -import androidx.room.RoomDatabase -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.database.migration.RecreateSchemaMigration -import org.amnezia.vpn.shadowsocks.core.utils.Key - -@Database(entities = [KeyValuePair::class], version = 4) -abstract class PublicDatabase : RoomDatabase() { - companion object { - private val instance by lazy { - Room.databaseBuilder(Core.deviceStorage, PublicDatabase::class.java, Key.DB_PUBLIC) - .allowMainThreadQueries() - .addMigrations( - Migration3 - ) - .fallbackToDestructiveMigration() - .build() - } - - val kvPairDao get() = instance.keyValuePairDao() - } - abstract fun keyValuePairDao(): KeyValuePair.Dao - - internal object Migration3 : RecreateSchemaMigration(2, 3, "KeyValuePair", - "(`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))", - "`key`, `valueType`, `value`") -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/migration/RecreateSchemaMigration.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/migration/RecreateSchemaMigration.kt deleted file mode 100644 index d13495c21..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/database/migration/RecreateSchemaMigration.kt +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2018 by Max Lv * - * Copyright (C) 2018 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.database.migration - -import androidx.room.migration.Migration -import androidx.sqlite.db.SupportSQLiteDatabase - -open class RecreateSchemaMigration(oldVersion: Int, newVersion: Int, private val table: String, - private val schema: String, private val keys: String) : - Migration(oldVersion, newVersion) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("CREATE TABLE `tmp` $schema") - database.execSQL("INSERT INTO `tmp` ($keys) SELECT $keys FROM `$table`") - database.execSQL("DROP TABLE `$table`") - database.execSQL("ALTER TABLE `tmp` RENAME TO `$table`") - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ChannelMonitor.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ChannelMonitor.kt deleted file mode 100644 index 161cc6577..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ChannelMonitor.kt +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import android.os.Build -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import kotlinx.coroutines.* -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.channels.sendBlocking -import java.io.IOException -import java.nio.ByteBuffer -import java.nio.channels.* -import kotlinx.coroutines.channels.trySendBlocking - -class ChannelMonitor : Thread("ChannelMonitor") { - private data class Registration(val channel: SelectableChannel, - val ops: Int, - val listener: (SelectionKey) -> Unit) { - val result = CompletableDeferred() - } - - private val selector = Selector.open() - private val registrationPipe = Pipe.open() - private val pendingRegistrations = Channel(Channel.UNLIMITED) - private val closeChannel = Channel(1) - @Volatile - private var running = true - - private fun registerInternal(channel: SelectableChannel, ops: Int, block: (SelectionKey) -> Unit) = - channel.register(selector, ops, block) - - init { - registrationPipe.source().apply { - configureBlocking(false) - registerInternal(this, SelectionKey.OP_READ) { - val junk = ByteBuffer.allocateDirect(1) - while (read(junk) > 0) { - pendingRegistrations.tryReceive().getOrNull()!!.apply { - try { - result.complete(registerInternal(channel, ops, listener)) - } catch (e: Exception) { - result.completeExceptionally(e) - } - } - junk.clear() - } - } - } - start() - } - - /** - * Prevent NetworkOnMainThreadException because people enable strict mode for no reasons. - */ - private suspend fun WritableByteChannel.writeCompat(src: ByteBuffer) = - if (Build.VERSION.SDK_INT <= 23) withContext(Dispatchers.Default) { write(src) } else write(src) - - suspend fun register(channel: SelectableChannel, ops: Int, block: (SelectionKey) -> Unit): SelectionKey { - val registration = Registration(channel, ops, block) - pendingRegistrations.send(registration) - ByteBuffer.allocateDirect(1).also { junk -> - loop@ while (running) when (registrationPipe.sink().writeCompat(junk)) { - 0 -> kotlinx.coroutines.yield() - 1 -> break@loop - else -> throw IOException("Failed to register in the channel") - } - } - if (!running) throw CancellationException() - return registration.result.await() - } - - suspend fun wait(channel: SelectableChannel, ops: Int) = CompletableDeferred().run { - register(channel, ops) { - if (it.isValid) try { - it.interestOps(0) // stop listening - } catch (_: CancelledKeyException) { } - complete(it) - } - await() - } - - override fun run() { - while (running) { - val num = try { - selector.select() - } catch (e: Exception) { - printLog(e) - continue - } - if (num <= 0) continue - val iterator = selector.selectedKeys().iterator() - while (iterator.hasNext()) { - val key = iterator.next() - iterator.remove() - (key.attachment() as (SelectionKey) -> Unit)(key) - } - } - closeChannel.trySendBlocking(Unit) - } - - fun close(scope: CoroutineScope) { - running = false - selector.wakeup() - scope.launch { - closeChannel.receive() - selector.keys().forEach { it.channel().close() } - selector.close() - } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ConcurrentLocalSocketListener.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ConcurrentLocalSocketListener.kt deleted file mode 100644 index adccea88e..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/ConcurrentLocalSocketListener.kt +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import android.net.LocalSocket -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import kotlinx.coroutines.* -import java.io.File - -abstract class ConcurrentLocalSocketListener(name: String, socketFile: File) : LocalSocketListener(name, socketFile), - CoroutineScope { - override val coroutineContext = Dispatchers.IO + SupervisorJob() + CoroutineExceptionHandler { _, t -> printLog(t) } - - override fun accept(socket: LocalSocket) { - launch { super.accept(socket) } - } - - override fun shutdown(scope: CoroutineScope) { - running = false - cancel() - super.shutdown(scope) - coroutineContext[Job]!!.also { job -> scope.launch { job.join() } } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/DefaultNetworkListener.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/DefaultNetworkListener.kt deleted file mode 100644 index cf606af04..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/DefaultNetworkListener.kt +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import android.annotation.TargetApi -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest -import android.os.Build -import androidx.core.content.getSystemService - -import org.amnezia.vpn.shadowsocks.core.Core.app -import kotlinx.coroutines.* -import kotlinx.coroutines.channels.actor -import java.net.UnknownHostException - -object DefaultNetworkListener { - private sealed class NetworkMessage { - class Start(val key: Any, val listener: (Network?) -> Unit) : NetworkMessage() - class Get : NetworkMessage() { - val response = CompletableDeferred() - } - class Stop(val key: Any) : NetworkMessage() - - class Put(val network: Network) : NetworkMessage() - class Update(val network: Network) : NetworkMessage() - class Lost(val network: Network) : NetworkMessage() - } - @ObsoleteCoroutinesApi - private val networkActor = GlobalScope.actor(Dispatchers.Unconfined) { - val listeners = mutableMapOf Unit>() - var network: Network? = null - val pendingRequests = arrayListOf() - for (message in channel) when (message) { - is NetworkMessage.Start -> { - if (listeners.isEmpty()) register() - listeners[message.key] = message.listener - if (network != null) message.listener(network) - } - is NetworkMessage.Get -> { - check(listeners.isNotEmpty()) { "Getting network without any listeners is not supported" } - if (network == null) pendingRequests += message else message.response.complete(network) - } - is NetworkMessage.Stop -> if (listeners.isNotEmpty() && // was not empty - listeners.remove(message.key) != null && listeners.isEmpty()) { - network = null - unregister() - } - - is NetworkMessage.Put -> { - network = message.network - pendingRequests.forEach { it.response.complete(message.network) } - pendingRequests.clear() - listeners.values.forEach { it(network) } - } - is NetworkMessage.Update -> if (network == message.network) listeners.values.forEach { it(network) } - is NetworkMessage.Lost -> if (network == message.network) { - network = null - listeners.values.forEach { it(null) } - } - } - } - - suspend fun start(key: Any, listener: (Network?) -> Unit) = networkActor.send(DefaultNetworkListener.NetworkMessage.Start(key, listener)) - suspend fun get() = if (fallback) @TargetApi(23) { - connectivity.activeNetwork ?: throw UnknownHostException() // failed to listen, return current if available - } else DefaultNetworkListener.NetworkMessage.Get().run { - networkActor.send(this) - response.await() - } - suspend fun stop(key: Any) = networkActor.send(DefaultNetworkListener.NetworkMessage.Stop(key)) - - - private object Callback: ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - runBlocking { networkActor.send(DefaultNetworkListener.NetworkMessage.Put(network)) } - } - - override fun onCapabilitiesChanged( - network: Network, - networkCapabilities: NetworkCapabilities - ) { - super.onCapabilitiesChanged(network, networkCapabilities) - // it's a good idea to refresh capabilities - runBlocking { networkActor.send(DefaultNetworkListener.NetworkMessage.Update(network)) } - } - - override fun onLost(network: Network) { - super.onLost(network) - runBlocking { - networkActor.send(DefaultNetworkListener.NetworkMessage.Lost(network)) - } - } - } - - // NB: this runs in ConnectivityThread, and this behavior cannot be changed until API 26 -// private object Callback : ConnectivityManager.NetworkCallback() { -// override fun onAvailable(network: Network) = runBlocking { networkActor.send(DefaultNetworkListener.NetworkMessage.Put(network)) } -// override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities?) { -// // it's a good idea to refresh capabilities -// runBlocking { networkActor.send(DefaultNetworkListener.NetworkMessage.Update(network)) } -// } -// override fun onLost(network: Network) = runBlocking { networkActor.send(DefaultNetworkListener.NetworkMessage.Lost(network)) } -// } - - private var fallback = false - private val connectivity = app.getSystemService()!! - private val request = NetworkRequest.Builder().apply { - addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - }.build() - /** - * Unfortunately registerDefaultNetworkCallback is going to return VPN interface since Android P DP1: - * https://android.googlesource.com/platform/frameworks/base/+/dda156ab0c5d66ad82bdcf76cda07cbc0a9c8a2e - * - * This makes doing a requestNetwork with REQUEST necessary so that we don't get ALL possible networks that - * satisfies default network capabilities but only THE default network. Unfortunately, we need to have - * android.permission.CHANGE_NETWORK_STATE to be able to call requestNetwork. - * - * Source: https://android.googlesource.com/platform/frameworks/base/+/2df4c7d/services/core/java/com/android/server/ConnectivityService.java#887 - */ - private fun register() { - if (Build.VERSION.SDK_INT in 24..27) @TargetApi(24) { - connectivity.registerDefaultNetworkCallback(Callback) - } else try { - fallback = false - // we want REQUEST here instead of LISTEN - connectivity.requestNetwork(request, Callback) - } catch (e: SecurityException) { - fallback = true - } - } - private fun unregister() = connectivity.unregisterNetworkCallback(Callback) -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/HttpsTest.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/HttpsTest.kt deleted file mode 100644 index f3b19a6e8..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/HttpsTest.kt +++ /dev/null @@ -1,124 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2018 by Max Lv * - * Copyright (C) 2018 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import android.os.Build -import android.os.SystemClock -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.acl.Acl -import org.amnezia.vpn.shadowsocks.core.R -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import org.amnezia.vpn.shadowsocks.core.utils.Key -import org.amnezia.vpn.shadowsocks.core.utils.disconnectFromMain -import kotlinx.coroutines.* -import java.io.IOException -import java.net.HttpURLConnection -import java.net.Proxy -import java.net.URL -import java.net.URLConnection - -/** - * Based on: https://android.googlesource.com/platform/frameworks/base/+/b19a838/services/core/java/com/android/server/connectivity/NetworkMonitor.java#1071 - */ -class HttpsTest : ViewModel() { - sealed class Status { - protected abstract val status: CharSequence - open fun retrieve(setStatus: (CharSequence) -> Unit, errorCallback: (String) -> Unit) = setStatus(status) - - object Idle : Status() { - override val status get() = app.getText(R.string.vpn_connected) - } - object Testing : Status() { - override val status get() = app.getText(R.string.connection_test_testing) - } - class Success(private val elapsed: Long) : Status() { - override val status get() = app.getString(R.string.connection_test_available, elapsed) - } - sealed class Error : Status() { - override val status get() = app.getText(R.string.connection_test_fail) - protected abstract val error: String - private var shown = false - override fun retrieve(setStatus: (CharSequence) -> Unit, errorCallback: (String) -> Unit) { - super.retrieve(setStatus, errorCallback) - if (shown) return - shown = true - errorCallback(error) - } - - class UnexpectedResponseCode(private val code: Int) : Error() { - override val error get() = app.getString(R.string.connection_test_error_status_code, code) - } - class IOFailure(private val e: IOException) : Error() { - override val error get() = app.getString(R.string.connection_test_error, e.message) - } - } - } - - private var running: Pair? = null - val status = MutableLiveData().apply { value = Status.Idle } - - fun testConnection() { - cancelTest() - status.value = Status.Testing - val url = URL("https", when ((Core.currentProfile ?: return).first.route) { - Acl.CHINALIST -> "www.qualcomm.cn" - else -> "www.google.com" - }, "/generate_204") - val conn = (if (DataStore.serviceMode != Key.modeVpn) { - url.openConnection(Proxy(Proxy.Type.SOCKS, DataStore.proxyAddress)) - } else url.openConnection()) as HttpURLConnection - conn.setRequestProperty("Connection", "close") - conn.instanceFollowRedirects = false - conn.useCaches = false - running = conn to GlobalScope.launch(Dispatchers.Main.immediate) { - status.value = withContext(Dispatchers.IO) { - try { - val start = SystemClock.elapsedRealtime() - val code = conn.responseCode - val elapsed = SystemClock.elapsedRealtime() - start - if (code == 204 || code == 200 && conn.responseLength == 0L) Status.Success(elapsed) - else Status.Error.UnexpectedResponseCode(code) - } catch (e: IOException) { - Status.Error.IOFailure(e) - } finally { - conn.disconnect() - } - } - } - } - - private fun cancelTest() = running?.let { (conn, job) -> - job.cancel() // ensure job is cancelled before interrupting - conn.disconnectFromMain() - running = null - } - - fun invalidate() { - cancelTest() - status.value = Status.Idle - } - - private val URLConnection.responseLength: Long - get() = if (Build.VERSION.SDK_INT >= 24) contentLengthLong else contentLength.toLong() -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalDnsServer.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalDnsServer.kt deleted file mode 100644 index 6b0cbf024..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalDnsServer.kt +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import kotlinx.coroutines.* -import org.xbill.DNS.* -import java.io.IOException -import java.net.* -import java.nio.ByteBuffer -import java.nio.channels.DatagramChannel -import java.nio.channels.SelectionKey -import java.nio.channels.SocketChannel - -/** - * A simple DNS conditional forwarder. - * - * No cache is provided as localResolver may change from time to time. We expect DNS clients to do cache themselves. - * - * Based on: - * https://github.com/bitcoinj/httpseed/blob/809dd7ad9280f4bc98a356c1ffb3d627bf6c7ec5/src/main/kotlin/dns.kt - * https://github.com/shadowsocks/overture/tree/874f22613c334a3b78e40155a55479b7b69fee04 - */ -class LocalDnsServer(private val localResolver: suspend (String) -> Array, - private val remoteDns: Socks5Endpoint, private val proxy: SocketAddress) : CoroutineScope { - /** - * Forward all requests to remote and ignore localResolver. - */ - var forwardOnly = false - /** - * Forward UDP queries to TCP. - */ - var tcp = true - var remoteDomainMatcher: Regex? = null - var localIpMatcher: List = emptyList() - - companion object { - private const val TAG = "LocalDnsServer" - private const val TIMEOUT = 10_000L - /** - * TTL returned from localResolver is set to 120. Android API does not provide TTL, - * so we suppose Android apps should not care about TTL either. - */ - private const val TTL = 120L - private const val UDP_PACKET_SIZE = 512 - - private fun prepareDnsResponse(request: Message) = Message(request.header.id).apply { - header.setFlag(Flags.QR.toInt()) // this is a response - if (request.header.getFlag(Flags.RD.toInt())) header.setFlag(Flags.RD.toInt()) - request.question?.also { addRecord(it, Section.QUESTION) } - } - } - private val monitor = ChannelMonitor() - - override val coroutineContext = SupervisorJob() + CoroutineExceptionHandler { _, t -> printLog(t) } - - suspend fun start(listen: SocketAddress) = DatagramChannel.open().run { - configureBlocking(false) - socket().bind(listen) - monitor.register(this, SelectionKey.OP_READ) { handlePacket(this) } - } - - private fun handlePacket(channel: DatagramChannel) { - val buffer = ByteBuffer.allocateDirect(UDP_PACKET_SIZE) - val source = channel.receive(buffer)!! - buffer.flip() - launch { - val reply = resolve(buffer) - while (channel.send(reply, source) <= 0) monitor.wait(channel, SelectionKey.OP_WRITE) - } - } - - private suspend fun resolve(packet: ByteBuffer): ByteBuffer { - val request = try { - Message(packet) - } catch (e: IOException) { // we cannot parse the message, do not attempt to handle it at all - printLog(e) - return forward(packet) - } - return supervisorScope { - val remote = async { withTimeout(TIMEOUT) { forward(packet) } } - try { - if (forwardOnly || request.header.opcode != Opcode.QUERY) return@supervisorScope remote.await() - val question = request.question - if (question?.type != Type.A) return@supervisorScope remote.await() - val host = question.name.toString(true) - if (remoteDomainMatcher?.containsMatchIn(host) == true) return@supervisorScope remote.await() - val localResults = try { - withTimeout(TIMEOUT) { GlobalScope.async(Dispatchers.IO) { localResolver(host) }.await() } - } catch (_: TimeoutCancellationException) { - return@supervisorScope remote.await() - } catch (_: UnknownHostException) { - return@supervisorScope remote.await() - } - if (localResults.isEmpty()) return@supervisorScope remote.await() - if (localIpMatcher.isEmpty() || localIpMatcher.any { subnet -> localResults.any(subnet::matches) }) { - remote.cancel() - ByteBuffer.wrap(prepareDnsResponse(request).apply { - header.setFlag(Flags.RA.toInt()) // recursion available - for (address in localResults) addRecord(when (address) { - is Inet4Address -> ARecord(question.name, DClass.IN, TTL, address) - is Inet6Address -> AAAARecord(question.name, DClass.IN, TTL, address) - else -> throw IllegalStateException("Unsupported address $address") - }, Section.ANSWER) - }.toWire()) - } else remote.await() - } catch (e: Exception) { - remote.cancel() - when (e) { - is CancellationException -> { } // ignore - else -> printLog(e) - } - ByteBuffer.wrap(prepareDnsResponse(request).apply { - header.rcode = Rcode.SERVFAIL - }.toWire()) - } - } - } - - @ExperimentalUnsignedTypes - private suspend fun forward(packet: ByteBuffer): ByteBuffer { - packet.position(0) // the packet might have been parsed, reset to beginning - return if (tcp) SocketChannel.open().use { channel -> - channel.configureBlocking(false) - channel.connect(proxy) - val wrapped = remoteDns.tcpWrap(packet) - while (!channel.finishConnect()) monitor.wait(channel, SelectionKey.OP_CONNECT) - while (channel.write(wrapped) >= 0 && wrapped.hasRemaining()) monitor.wait(channel, SelectionKey.OP_WRITE) - val result = remoteDns.tcpReceiveBuffer(UDP_PACKET_SIZE) - remoteDns.tcpUnwrap(result, channel::read) { monitor.wait(channel, SelectionKey.OP_READ) } - result - } else DatagramChannel.open().use { channel -> - channel.configureBlocking(false) - monitor.wait(channel, SelectionKey.OP_WRITE) - check(channel.send(remoteDns.udpWrap(packet), proxy) > 0) - val result = remoteDns.udpReceiveBuffer(UDP_PACKET_SIZE) - while (isActive) { - monitor.wait(channel, SelectionKey.OP_READ) - if (channel.receive(result) == proxy) break - result.clear() - } - result.flip() - remoteDns.udpUnwrap(result) - result - } - } - - fun shutdown(scope: CoroutineScope) { - cancel() - monitor.close(scope) - coroutineContext[Job]!!.also { job -> scope.launch { job.join() } } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt deleted file mode 100644 index 600e8e026..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/LocalSocketListener.kt +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import android.net.LocalServerSocket -import android.net.LocalSocket -import android.net.LocalSocketAddress -import android.system.ErrnoException -import android.system.Os -import android.system.OsConstants -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.channels.sendBlocking -import kotlinx.coroutines.launch -import java.io.File -import java.io.IOException -import kotlinx.coroutines.channels.trySendBlocking - -abstract class LocalSocketListener(name: String, socketFile: File) : Thread(name) { - private val localSocket = LocalSocket().apply { - socketFile.delete() // It's a must-have to close and reuse previous local socket. - bind(LocalSocketAddress(socketFile.absolutePath, LocalSocketAddress.Namespace.FILESYSTEM)) - } - private val serverSocket = LocalServerSocket(localSocket.fileDescriptor) - private val closeChannel = Channel(1) - @Volatile - protected var running = true - - /** - * Inherited class do not need to close input/output streams as they will be closed automatically. - */ - protected open fun accept(socket: LocalSocket) = socket.use { acceptInternal(socket) } - protected abstract fun acceptInternal(socket: LocalSocket) - final override fun run() { - localSocket.use { - while (running) { - try { - accept(serverSocket.accept()) - } catch (e: IOException) { - if (running) printLog(e) - continue - } - } - } - closeChannel.trySendBlocking(Unit) - } - - open fun shutdown(scope: CoroutineScope) { - running = false - localSocket.fileDescriptor?.apply { - // see also: https://issuetracker.google.com/issues/36945762#comment15 - if (valid()) try { - Os.shutdown(this, OsConstants.SHUT_RDWR) - } catch (e: ErrnoException) { - // suppress fd inactive or already closed - if (e.errno != OsConstants.EBADF && e.errno != OsConstants.ENOTCONN) throw IOException(e) - } - } - scope.launch { closeChannel.receive() } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Socks5Endpoint.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Socks5Endpoint.kt deleted file mode 100644 index b815ccf02..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Socks5Endpoint.kt +++ /dev/null @@ -1,123 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2019 by Max Lv * - * Copyright (C) 2019 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import org.amnezia.vpn.shadowsocks.core.utils.parseNumericAddress -import net.sourceforge.jsocks.Socks4Message -import net.sourceforge.jsocks.Socks5Message -import java.io.EOFException -import java.io.IOException -import java.net.Inet4Address -import java.net.Inet6Address -import java.nio.ByteBuffer -import kotlin.math.max - -class Socks5Endpoint(host: String, port: Int) { - private val dest = host.parseNumericAddress().let { numeric -> - val bytes = numeric?.address ?: host.toByteArray().apply { check(size < 256) { "Hostname too long" } } - val type = when (numeric) { - null -> Socks5Message.SOCKS_ATYP_DOMAINNAME - is Inet4Address -> Socks5Message.SOCKS_ATYP_IPV4 - is Inet6Address -> Socks5Message.SOCKS_ATYP_IPV6 - else -> throw IllegalStateException("Unsupported address type") - } - ByteBuffer.allocate(bytes.size + (if (numeric == null) 1 else 0) + 3).apply { - put(type.toByte()) - if (numeric == null) put(bytes.size.toByte()) - put(bytes) - putShort(port.toShort()) - } - }.array() - private val headerReserved = max(3 + 3 + 16, 3 + dest.size) - - fun tcpWrap(message: ByteBuffer): ByteBuffer { - check(message.remaining() < 65536) { "TCP message too large" } - return ByteBuffer.allocateDirect(8 + dest.size + message.remaining()).apply { - put(Socks5Message.SOCKS_VERSION.toByte()) - put(1) // nmethods - put(0) // no authentication required - // header - put(Socks5Message.SOCKS_VERSION.toByte()) - put(Socks4Message.REQUEST_CONNECT.toByte()) - put(0) // reserved - put(dest) - // data - putShort(message.remaining().toShort()) - put(message) - flip() - } - } - fun tcpReceiveBuffer(size: Int) = ByteBuffer.allocateDirect(headerReserved + 4 + size) - @ExperimentalUnsignedTypes - suspend fun tcpUnwrap(buffer: ByteBuffer, reader: (ByteBuffer) -> Int, wait: suspend () -> Unit) { - suspend fun readBytes(till: Int) { - if (buffer.position() >= till) return - while (reader(buffer) >= 0 && buffer.position() < till) wait() - if (buffer.position() < till) throw EOFException("${buffer.position()} < $till") - } - suspend fun read(index: Int): Byte { - readBytes(index + 1) - return buffer[index] - } - check(read(0) == Socks5Message.SOCKS_VERSION.toByte()) { "Unsupported SOCKS version" } - if (read(1) != 0.toByte()) throw IOException("Unsupported authentication ${buffer[1]}") - check(read(2) == Socks5Message.SOCKS_VERSION.toByte()) { "Unsupported SOCKS version" } - if (read(3) != 0.toByte()) throw IOException("SOCKS5 server returned error ${buffer[3]}") - val dataOffset = when (read(5)) { - Socks5Message.SOCKS_ATYP_IPV4.toByte() -> 4 - Socks5Message.SOCKS_ATYP_DOMAINNAME.toByte() -> 1 + read(6) - Socks5Message.SOCKS_ATYP_IPV6.toByte() -> 16 - else -> throw IllegalStateException("Unsupported address type ${buffer[5]}") - } + 8 - readBytes(dataOffset + 2) - buffer.limit(buffer.position()) // store old position to update mark - buffer.position(dataOffset) - val dataLength = buffer.short.toUShort().toInt() - val end = buffer.position() + dataLength - check(end <= buffer.capacity()) { "Buffer too small to contain the message" } - buffer.mark() - buffer.position(buffer.limit()) // restore old position - buffer.limit(end) - readBytes(buffer.limit()) - buffer.reset() - } - - fun udpWrap(packet: ByteBuffer) = ByteBuffer.allocateDirect(3 + dest.size + packet.remaining()).apply { - // header - putShort(0) // reserved - put(0) // fragment number - put(dest) - // data - put(packet) - flip() - } - fun udpReceiveBuffer(size: Int) = ByteBuffer.allocateDirect(headerReserved + size) - fun udpUnwrap(packet: ByteBuffer) { - packet.position(3) - packet.position(6 + when (packet.get()) { - Socks5Message.SOCKS_ATYP_IPV4.toByte() -> 4 - Socks5Message.SOCKS_ATYP_DOMAINNAME.toByte() -> 1 + packet.get() - Socks5Message.SOCKS_ATYP_IPV6.toByte() -> 16 - else -> throw IllegalStateException("Unsupported address type") - }) - packet.mark() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Subnet.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Subnet.kt deleted file mode 100644 index a907e5b89..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/Subnet.kt +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import org.amnezia.vpn.shadowsocks.core.utils.parseNumericAddress -import java.net.InetAddress -import java.util.* - -class Subnet(val address: InetAddress, val prefixSize: Int) : Comparable { - companion object { - fun fromString(value: String): Subnet? { - @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") - val parts = (value as java.lang.String).split("/", 2) - val addr = parts[0].parseNumericAddress() ?: return null - return if (parts.size == 2) try { - val prefixSize = parts[1].toInt() - if (prefixSize < 0 || prefixSize > addr.address.size shl 3) null else Subnet(addr, prefixSize) - } catch (_: NumberFormatException) { - null - } else Subnet(addr, addr.address.size shl 3) - } - } - - private val addressLength get() = address.address.size shl 3 - - init { - if (prefixSize < 0 || prefixSize > addressLength) throw IllegalArgumentException("prefixSize: $prefixSize") - } - - fun matches(other: InetAddress): Boolean { - if (address.javaClass != other.javaClass) return false - // TODO optimize? - val a = address.address - val b = other.address - var i = 0 - while (i * 8 < prefixSize && i * 8 + 8 <= prefixSize) { - if (a[i] != b[i]) return false - ++i - } - if (i * 8 == prefixSize) return true - val mask = 256 - (1 shl (i * 8 + 8 - prefixSize)) - return (a[i].toInt() and mask) == (b[i].toInt() and mask) - } - - override fun toString(): String = - if (prefixSize == addressLength) address.hostAddress else address.hostAddress + '/' + prefixSize - - private fun Byte.unsigned() = toInt() and 0xFF - override fun compareTo(other: Subnet): Int { - val addrThis = address.address - val addrThat = other.address.address - var result = addrThis.size.compareTo(addrThat.size) // IPv4 address goes first - if (result != 0) return result - for ((x, y) in addrThis zip addrThat) { - result = x.unsigned().compareTo(y.unsigned()) // undo sign extension of signed byte - if (result != 0) return result - } - return prefixSize.compareTo(other.prefixSize) - } - - override fun equals(other: Any?): Boolean { - val that = other as? Subnet - return address == that?.address && prefixSize == that.prefixSize - } - override fun hashCode(): Int = Objects.hash(address, prefixSize) -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/TcpFastOpen.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/TcpFastOpen.kt deleted file mode 100644 index 5f694b9f2..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/net/TcpFastOpen.kt +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.net - -import org.amnezia.vpn.shadowsocks.core.utils.readableMessage -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withTimeoutOrNull -import java.io.File -import java.io.IOException - -object TcpFastOpen { - private const val PATH = "/proc/sys/net/ipv4/tcp_fastopen" - - /** - * Is kernel version >= 3.7.1. - */ - val supported by lazy { - if (File(PATH).canRead()) return@lazy true - val match = """^(\d+)\.(\d+)\.(\d+)""".toRegex().find(System.getProperty("os.version") ?: "") - if (match == null) false else when (match.groupValues[1].toInt()) { - in Int.MIN_VALUE..2 -> false - 3 -> when (match.groupValues[2].toInt()) { - in Int.MIN_VALUE..6 -> false - 7 -> match.groupValues[3].toInt() >= 1 - else -> true - } - else -> true - } - } - - val sendEnabled: Boolean get() { - val file = File(PATH) - // File.readText doesn't work since this special file will return length 0 - // on Android containers like Chrome OS, this file does not exist so we simply judge by the kernel version - return if (file.canRead()) file.bufferedReader().use { it.readText() }.trim().toInt() and 1 > 0 else supported - } - - fun enable(): String? { - return try { - ProcessBuilder("su", "-c", "echo 3 > $PATH").redirectErrorStream(true).start() - .inputStream.bufferedReader().readText() - } catch (e: IOException) { - e.readableMessage - } - } - fun enableTimeout() = runBlocking { withTimeoutOrNull(1000) { enable() } } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NativePlugin.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NativePlugin.kt deleted file mode 100644 index 6c4d1ae6f..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NativePlugin.kt +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.plugin - -import android.content.pm.ResolveInfo -import android.os.Bundle - -class NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) { - init { - check(resolveInfo.providerInfo != null) - } - - override val metaData: Bundle get() = resolveInfo.providerInfo.metaData - override val packageName: String get() = resolveInfo.providerInfo.packageName -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NoPlugin.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NoPlugin.kt deleted file mode 100644 index 1dd438d8e..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/NoPlugin.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.plugin - -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.R - -object NoPlugin : Plugin() { - override val id: String get() = "" - override val label: CharSequence get() = app.getText(R.string.plugin_disabled) -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/Plugin.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/Plugin.kt deleted file mode 100644 index ee01c65dd..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/Plugin.kt +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.plugin - -import android.graphics.drawable.Drawable - -abstract class Plugin { - abstract val id: String - abstract val label: CharSequence - open val icon: Drawable? get() = null - open val defaultConfig: String? get() = null - open val packageName: String get() = "" - open val trusted: Boolean get() = true -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginConfiguration.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginConfiguration.kt deleted file mode 100644 index 2c367a442..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginConfiguration.kt +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.plugin - -import org.amnezia.vpn.shadowsocks.core.utils.Commandline -import org.amnezia.vpn.shadowsocks.plugin.PluginOptions -import java.util.* - -class PluginConfiguration(val pluginsOptions: Map, val selected: String) { - private constructor(plugins: List) : this( - plugins.filter { it.id.isNotEmpty() }.associate { it.id to it }, - if (plugins.isEmpty()) "" else plugins[0].id) - constructor(plugin: String) : this(plugin.split('\n').map { line -> - if (line.startsWith("kcptun ")) { - val opt = PluginOptions() - opt.id = "kcptun" - try { - val iterator = Commandline.translateCommandline(line).drop(1).iterator() - while (iterator.hasNext()) { - val option = iterator.next() - when { - option == "--nocomp" -> opt["nocomp"] = null - option.startsWith("--") -> opt[option.substring(2)] = iterator.next() - else -> throw IllegalArgumentException("Unknown kcptun parameter: $option") - } - } - } catch (exc: Exception) { - } - opt - } else PluginOptions(line) - }) - - fun getOptions(id: String): PluginOptions = if (id.isEmpty()) PluginOptions() else - pluginsOptions[id] ?: PluginOptions(id, PluginManager.fetchPlugins()[id]?.defaultConfig) - val selectedOptions: PluginOptions get() = getOptions(selected) - - override fun toString(): String { - val result = LinkedList() - for ((id, opt) in pluginsOptions) if (id == this.selected) result.addFirst(opt) else result.addLast(opt) - if (!pluginsOptions.contains(selected)) result.addFirst(selectedOptions) - return result.joinToString("\n") { it.toString(false) } - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginManager.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginManager.kt deleted file mode 100644 index ef9e8aea0..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/PluginManager.kt +++ /dev/null @@ -1,193 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.plugin - -import android.annotation.SuppressLint -import android.content.BroadcastReceiver -import android.content.ContentResolver -import android.content.Intent -import android.content.pm.PackageManager -import android.content.pm.Signature -import android.database.Cursor -import android.net.Uri -import android.system.Os -import android.util.Base64 -import androidx.core.os.bundleOf - -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.R -import org.amnezia.vpn.shadowsocks.core.utils.printLog -import org.amnezia.vpn.shadowsocks.core.utils.signaturesCompat -import org.amnezia.vpn.shadowsocks.plugin.PluginContract -import org.amnezia.vpn.shadowsocks.plugin.PluginOptions -import java.io.File -import java.io.FileNotFoundException - -object PluginManager { - class PluginNotFoundException(private val plugin: String) : FileNotFoundException(plugin) { - override fun getLocalizedMessage() = app.getString(R.string.plugin_unknown, plugin) - } - - /** - * Trusted signatures by the app. Third-party fork should add their public key to their fork if the developer wishes - * to publish or has published plugins for this app. You can obtain your public key by executing: - * - * $ keytool -export -alias key-alias -keystore /path/to/keystore.jks -rfc - * - * If you don't plan to publish any plugin but is developing/has developed some, it's not necessary to add your - * public key yet since it will also automatically trust packages signed by the same signatures, e.g. debug keys. - */ - val trustedSignatures by lazy { - Core.packageInfo.signaturesCompat.toSet() + - Signature(Base64.decode( // @Mygod - """ - |MIIDWzCCAkOgAwIBAgIEUzfv8DANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJD - |TjEOMAwGA1UECBMFTXlnb2QxDjAMBgNVBAcTBU15Z29kMQ4wDAYDVQQKEwVNeWdv - |ZDEOMAwGA1UECxMFTXlnb2QxDjAMBgNVBAMTBU15Z29kMCAXDTE0MDUwMjA5MjQx - |OVoYDzMwMTMwOTAyMDkyNDE5WjBdMQswCQYDVQQGEwJDTjEOMAwGA1UECBMFTXln - |b2QxDjAMBgNVBAcTBU15Z29kMQ4wDAYDVQQKEwVNeWdvZDEOMAwGA1UECxMFTXln - |b2QxDjAMBgNVBAMTBU15Z29kMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC - |AQEAjm5ikHoP3w6zavvZU5bRo6Birz41JL/nZidpdww21q/G9APA+IiJMUeeocy0 - |L7/QY8MQZABVwNq79LXYWJBcmmFXM9xBPgDqQP4uh9JsvazCI9bvDiMn92mz9HiS - |Sg9V4KGg0AcY0r230KIFo7hz+2QBp1gwAAE97myBfA3pi3IzJM2kWsh4LWkKQMfL - |M6KDhpb4mdDQnHlgi4JWe3SYbLtpB6whnTqjHaOzvyiLspx1tmrb0KVxssry9KoX - |YQzl56scfE/QJX0jJ5qYmNAYRCb4PibMuNSGB2NObDabSOMAdT4JLueOcHZ/x9tw - |agGQ9UdymVZYzf8uqc+29ppKdQIDAQABoyEwHzAdBgNVHQ4EFgQUBK4uJ0cqmnho - |6I72VmOVQMvVCXowDQYJKoZIhvcNAQELBQADggEBABZQ3yNESQdgNJg+NRIcpF9l - |YSKZvrBZ51gyrC7/2ZKMpRIyXruUOIrjuTR5eaONs1E4HI/uA3xG1eeW2pjPxDnO - |zgM4t7EPH6QbzibihoHw1MAB/mzECzY8r11PBhDQlst0a2hp+zUNR8CLbpmPPqTY - |RSo6EooQ7+NBejOXysqIF1q0BJs8Y5s/CaTOmgbL7uPCkzArB6SS/hzXgDk5gw6v - |wkGeOtzcj1DlbUTvt1s5GlnwBTGUmkbLx+YUje+n+IBgMbohLUDYBtUHylRVgMsc - |1WS67kDqeJiiQZvrxvyW6CZZ/MIGI+uAkkj3DqJpaZirkwPgvpcOIrjZy0uFvQM= - """, Base64.DEFAULT)) + - Signature(Base64.decode( // @madeye - """ - |MIICQzCCAaygAwIBAgIETV9OhjANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJjbjERMA8GA1UE - |CBMIU2hhbmdoYWkxDzANBgNVBAcTBlB1ZG9uZzEUMBIGA1UEChMLRnVkYW4gVW5pdi4xDDAKBgNV - |BAsTA1BQSTEPMA0GA1UEAxMGTWF4IEx2MB4XDTExMDIxOTA1MDA1NFoXDTM2MDIxMzA1MDA1NFow - |ZjELMAkGA1UEBhMCY24xETAPBgNVBAgTCFNoYW5naGFpMQ8wDQYDVQQHEwZQdWRvbmcxFDASBgNV - |BAoTC0Z1ZGFuIFVuaXYuMQwwCgYDVQQLEwNQUEkxDzANBgNVBAMTBk1heCBMdjCBnzANBgkqhkiG - |9w0BAQEFAAOBjQAwgYkCgYEAq6lA8LqdeEI+es9SDX85aIcx8LoL3cc//iRRi+2mFIWvzvZ+bLKr - |4Wd0rhu/iU7OeMm2GvySFyw/GdMh1bqh5nNPLiRxAlZxpaZxLOdRcxuvh5Nc5yzjM+QBv8ECmuvu - |AOvvT3UDmA0AMQjZqSCmxWIxc/cClZ/0DubreBo2st0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAQ - |Iqonxpwk2ay+Dm5RhFfZyG9SatM/JNFx2OdErU16WzuK1ItotXGVJaxCZv3u/tTwM5aaMACGED5n - |AvHaDGCWynY74oDAopM4liF/yLe1wmZDu6Zo/7fXrH+T03LBgj2fcIkUfN1AA4dvnBo8XWAm9VrI - |1iNuLIssdhDz3IL9Yg== - """, Base64.DEFAULT)) - } - - private var receiver: BroadcastReceiver? = null - private var cachedPlugins: Map? = null - fun fetchPlugins(): Map = synchronized(this) { - if (receiver == null) receiver = Core.listenForPackageChanges { - synchronized(this) { - receiver = null - cachedPlugins = null - } - } - if (cachedPlugins == null) { - val pm = app.packageManager - cachedPlugins = (pm.queryIntentContentProviders(Intent(PluginContract.ACTION_NATIVE_PLUGIN), - PackageManager.GET_META_DATA).map { NativePlugin(it) } + NoPlugin).associate { it.id to it } - } - cachedPlugins!! - } - - private fun buildUri(id: String) = Uri.Builder() - .scheme(PluginContract.SCHEME) - .authority(PluginContract.AUTHORITY) - .path("/$id") - .build() - fun buildIntent(id: String, action: String): Intent = Intent(action, buildUri(id)) - - // the following parts are meant to be used by :bg - @Throws(Throwable::class) - fun init(options: PluginOptions): String? { - if (options.id.isEmpty()) return null - var throwable: Throwable? = null - - try { - val path = initNative(options) - if (path != null) return path - } catch (t: Throwable) { - if (throwable == null) throwable = t else printLog(t) - } - - // add other plugin types here - - throw throwable ?: PluginNotFoundException(options.id) - } - - private fun initNative(options: PluginOptions): String? { - val providers = app.packageManager.queryIntentContentProviders( - Intent(PluginContract.ACTION_NATIVE_PLUGIN, buildUri(options.id)), 0) - if (providers.isEmpty()) return null - val uri = Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(providers.single().providerInfo.authority) - .build() - val cr = app.contentResolver - return try { - initNativeFast(cr, options, uri) - } catch (t: Throwable) { - printLog(t) - initNativeSlow(cr, options, uri) - } - } - - private fun initNativeFast(cr: ContentResolver, options: PluginOptions, uri: Uri): String { - val result = cr.call(uri, PluginContract.METHOD_GET_EXECUTABLE, null, - bundleOf(Pair(PluginContract.EXTRA_OPTIONS, options.id)))!!.getString(PluginContract.EXTRA_ENTRY)!! - check(File(result).canExecute()) - return result - } - - @SuppressLint("Recycle") - private fun initNativeSlow(cr: ContentResolver, options: PluginOptions, uri: Uri): String? { - var initialized = false - fun entryNotFound(): Nothing = throw IndexOutOfBoundsException("Plugin entry binary not found") - val pluginDir = File(Core.deviceStorage.noBackupFilesDir, "plugin") - (cr.query(uri, arrayOf(PluginContract.COLUMN_PATH, PluginContract.COLUMN_MODE), null, null, null) - ?: return null).use { cursor -> - if (!cursor.moveToFirst()) entryNotFound() - pluginDir.deleteRecursively() - if (!pluginDir.mkdirs()) throw FileNotFoundException("Unable to create plugin directory") - val pluginDirPath = pluginDir.absolutePath + '/' - do { - val path = cursor.getString(0) - val file = File(pluginDir, path) - check(file.absolutePath.startsWith(pluginDirPath)) - cr.openInputStream(uri.buildUpon().path(path).build())!!.use { inStream -> - file.outputStream().use { outStream -> inStream.copyTo(outStream) } - } - Os.chmod(file.absolutePath, when (cursor.getType(1)) { - Cursor.FIELD_TYPE_INTEGER -> cursor.getInt(1) - Cursor.FIELD_TYPE_STRING -> cursor.getString(1).toInt(8) - else -> throw IllegalArgumentException("File mode should be of type int") - }) - if (path == options.id) initialized = true - } while (cursor.moveToNext()) - } - if (!initialized) entryNotFound() - return File(pluginDir, options.id).absolutePath - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/ResolvedPlugin.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/ResolvedPlugin.kt deleted file mode 100644 index 7ac646bb8..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/plugin/ResolvedPlugin.kt +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.plugin - -import android.content.pm.ResolveInfo -import android.graphics.drawable.Drawable -import android.os.Bundle -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.utils.signaturesCompat -import org.amnezia.vpn.shadowsocks.plugin.PluginContract - -abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() { - protected abstract val metaData: Bundle - - override val id: String by lazy { metaData.getString(PluginContract.METADATA_KEY_ID)!! } - override val label: CharSequence by lazy { resolveInfo.loadLabel(app.packageManager) } - override val icon: Drawable by lazy { resolveInfo.loadIcon(app.packageManager) } - override val defaultConfig: String by lazy { metaData.getString(PluginContract.METADATA_KEY_DEFAULT_CONFIG)!! } - override val packageName: String get() = resolveInfo.resolvePackageName - override val trusted by lazy { - Core.getPackageInfo(packageName).signaturesCompat.any(PluginManager.trustedSignatures::contains) - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/DataStore.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/DataStore.kt deleted file mode 100644 index 214f17b29..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/DataStore.kt +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.preference - -import android.os.Binder -import androidx.preference.PreferenceDataStore -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.database.PrivateDatabase -import org.amnezia.vpn.shadowsocks.core.database.PublicDatabase -import org.amnezia.vpn.shadowsocks.core.net.TcpFastOpen -import org.amnezia.vpn.shadowsocks.core.utils.DirectBoot -import org.amnezia.vpn.shadowsocks.core.utils.Key -import org.amnezia.vpn.shadowsocks.core.utils.parsePort -import java.net.InetSocketAddress -import java.net.NetworkInterface -import java.net.SocketException - -object DataStore : OnPreferenceDataStoreChangeListener { - val publicStore = RoomPreferenceDataStore(PublicDatabase.kvPairDao) - // privateStore will only be used as temp storage for ProfileConfigFragment - val privateStore = RoomPreferenceDataStore(PrivateDatabase.kvPairDao) - - init { - publicStore.registerChangeListener(this) - } - - override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String?) { - when (key) { - Key.id -> if (directBootAware) DirectBoot.update() - } - } - - // hopefully hashCode = mHandle doesn't change, currently this is true from KitKat to Nougat - private val userIndex by lazy { Binder.getCallingUserHandle().hashCode() } - private fun getLocalPort(key: String, default: Int): Int { - val value = publicStore.getInt(key) - return if (value != null) { - publicStore.putString(key, value.toString()) - value - } else parsePort(publicStore.getString(key), default + userIndex) - } - - var profileId: Long - get() = publicStore.getLong(Key.id) ?: 0 - set(value) = publicStore.putLong(Key.id, value) - val canToggleLocked: Boolean get() = publicStore.getBoolean(Key.directBootAware) == true - val directBootAware: Boolean get() = Core.directBootSupported && canToggleLocked - val tcpFastOpen: Boolean get() = TcpFastOpen.sendEnabled && publicStore.getBoolean(Key.tfo, true) - val serviceMode get() = publicStore.getString(Key.serviceMode) ?: Key.modeVpn - - /** - * An alternative way to detect this interface could be checking MAC address = 00:ff:aa:00:00:55, but there is no - * reliable way of getting MAC address for now. - */ - val hasArc0 by lazy { - var retry = 0 - while (retry < 5) { - try { - return@lazy NetworkInterface.getByName("arc0") != null - } catch (_: SocketException) { } - retry++ - Thread.sleep(100L shl retry) - } - false - } - /** - * Binding bogus IP address 100.115.92.2 in Chrome OS directly does not seem to work reliably. It might be due to - * the IP may not be available when the device is not connected to any network. - */ - val listenAddress get() = if (publicStore.getBoolean(Key.shareOverLan, hasArc0)) "0.0.0.0" else "127.0.0.1" - var portProxy: Int - get() = getLocalPort(Key.portProxy, 1080) - set(value) = publicStore.putString(Key.portProxy, value.toString()) - val proxyAddress get() = InetSocketAddress("127.0.0.1", portProxy) - var portLocalDns: Int - get() = getLocalPort(Key.portLocalDns, 5450) - set(value) = publicStore.putString(Key.portLocalDns, value.toString()) - var portTransproxy: Int - get() = getLocalPort(Key.portTransproxy, 8200) - set(value) = publicStore.putString(Key.portTransproxy, value.toString()) - - /** - * Initialize settings that have complicated default values. - */ - fun initGlobal() { - if (publicStore.getBoolean(Key.tfo) == null) publicStore.putBoolean(Key.tfo, tcpFastOpen) - if (publicStore.getString(Key.portProxy) == null) portProxy = portProxy - if (publicStore.getString(Key.portLocalDns) == null) portLocalDns = portLocalDns - if (publicStore.getString(Key.portTransproxy) == null) portTransproxy = portTransproxy - } - - var editingId: Long? - get() = privateStore.getLong(Key.id) - set(value) = privateStore.putLong(Key.id, value) - var proxyApps: Boolean - get() = privateStore.getBoolean(Key.proxyApps) ?: false - set(value) = privateStore.putBoolean(Key.proxyApps, value) - var bypass: Boolean - get() = privateStore.getBoolean(Key.bypass) ?: false - set(value) = privateStore.putBoolean(Key.bypass, value) - var individual: String - get() = privateStore.getString(Key.individual) ?: "" - set(value) = privateStore.putString(Key.individual, value) - var plugin: String - get() = privateStore.getString(Key.plugin) ?: "" - set(value) = privateStore.putString(Key.plugin, value) - var udpFallback: Long? - get() = privateStore.getLong(Key.udpFallback) - set(value) = privateStore.putLong(Key.udpFallback, value) - var dirty: Boolean - get() = privateStore.getBoolean(Key.dirty) ?: false - set(value) = privateStore.putBoolean(Key.dirty, value) -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/OnPreferenceDataStoreChangeListener.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/OnPreferenceDataStoreChangeListener.kt deleted file mode 100644 index a89423152..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/OnPreferenceDataStoreChangeListener.kt +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.preference - -import androidx.preference.PreferenceDataStore - -interface OnPreferenceDataStoreChangeListener { - fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String?) -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/RoomPreferenceDataStore.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/RoomPreferenceDataStore.kt deleted file mode 100644 index b7dc4467b..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/preference/RoomPreferenceDataStore.kt +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.preference - -import androidx.preference.PreferenceDataStore -import org.amnezia.vpn.shadowsocks.core.database.KeyValuePair -import java.util.HashSet - -@Suppress("MemberVisibilityCanBePrivate", "unused") -open class RoomPreferenceDataStore(private val kvPairDao: KeyValuePair.Dao) : PreferenceDataStore() { - fun getBoolean(key: String) = kvPairDao[key]?.boolean - fun getFloat(key: String) = kvPairDao[key]?.float - fun getInt(key: String) = kvPairDao[key]?.long?.toInt() - fun getLong(key: String) = kvPairDao[key]?.long - fun getString(key: String) = kvPairDao[key]?.string - fun getStringSet(key: String) = kvPairDao[key]?.stringSet - - override fun getBoolean(key: String, defValue: Boolean) = getBoolean(key) ?: defValue - override fun getFloat(key: String, defValue: Float) = getFloat(key) ?: defValue - override fun getInt(key: String, defValue: Int) = getInt(key) ?: defValue - override fun getLong(key: String, defValue: Long) = getLong(key) ?: defValue - override fun getString(key: String, defValue: String?) = getString(key) ?: defValue - override fun getStringSet(key: String, defValue: MutableSet?) = getStringSet(key) ?: defValue - - fun putBoolean(key: String, value: Boolean?) = if (value == null) remove(key) else putBoolean(key, value) - fun putFloat(key: String, value: Float?) = if (value == null) remove(key) else putFloat(key, value) - fun putInt(key: String, value: Int?) = if (value == null) remove(key) else putLong(key, value.toLong()) - fun putLong(key: String, value: Long?) = if (value == null) remove(key) else putLong(key, value) - override fun putBoolean(key: String, value: Boolean) { - kvPairDao.put(KeyValuePair(key).put(value)) - fireChangeListener(key) - } - override fun putFloat(key: String, value: Float) { - kvPairDao.put(KeyValuePair(key).put(value)) - fireChangeListener(key) - } - override fun putInt(key: String, value: Int) { - kvPairDao.put(KeyValuePair(key).put(value.toLong())) - fireChangeListener(key) - } - override fun putLong(key: String, value: Long) { - kvPairDao.put(KeyValuePair(key).put(value)) - fireChangeListener(key) - } - override fun putString(key: String, value: String?) = if (value == null) remove(key) else { - kvPairDao.put(KeyValuePair(key).put(value)) - fireChangeListener(key) - } - override fun putStringSet(key: String, values: MutableSet?) = if (values == null) remove(key) else { - kvPairDao.put(KeyValuePair(key).put(values)) - fireChangeListener(key) - } - - fun remove(key: String) { - kvPairDao.delete(key) - fireChangeListener(key) - } - - private val listeners = HashSet() - private fun fireChangeListener(key: String) = listeners.forEach { it.onPreferenceDataStoreChanged(this, key) } - fun registerChangeListener(listener: OnPreferenceDataStoreChangeListener) = listeners.add(listener) - fun unregisterChangeListener(listener: OnPreferenceDataStoreChangeListener) = listeners.remove(listener) -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/ArrayIterator.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/ArrayIterator.kt deleted file mode 100644 index b63c3cb99..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/ArrayIterator.kt +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2018 by Max Lv * - * Copyright (C) 2018 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.utils - -import android.content.ClipData -import androidx.recyclerview.widget.SortedList -import org.json.JSONArray - -private sealed class ArrayIterator : Iterator { - abstract val size: Int - abstract operator fun get(index: Int): T - private var count = 0 - override fun hasNext() = count < size - override fun next(): T = if (hasNext()) this[count++] else throw NoSuchElementException() -} - -private class ClipDataIterator(private val data: ClipData) : ArrayIterator() { - override val size get() = data.itemCount - override fun get(index: Int) = data.getItemAt(index) -} -fun ClipData.asIterable() = Iterable { ClipDataIterator(this) } - -private class JSONArrayIterator(private val arr: JSONArray) : ArrayIterator() { - override val size get() = arr.length() - override fun get(index: Int) = arr.get(index) -} -fun JSONArray.asIterable() = Iterable { JSONArrayIterator(this) } - -private class SortedListIterator(private val list: SortedList) : ArrayIterator() { - override val size get() = list.size() - override fun get(index: Int) = list[index] -} -fun SortedList.asIterable() = Iterable { SortedListIterator(this) } diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Commandline.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Commandline.kt deleted file mode 100644 index d70ff6916..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Commandline.kt +++ /dev/null @@ -1,173 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.utils - -import java.util.* - -/** - * Commandline objects help handling command lines specifying processes to - * execute. - * - * The class can be used to define a command line as nested elements or as a - * helper to define a command line by an application. - * - * - * ` - *

- *   

- *     

- *     

- *     

- *   


- *


-` * - * - * Based on: https://github.com/apache/ant/blob/588ce1f/src/main/org/apache/tools/ant/types/Commandline.java - * - * Adds support for escape character '\'. - */ -object Commandline { - - /** - * Quote the parts of the given array in way that makes them - * usable as command line arguments. - * @param args the list of arguments to quote. - * @return empty string for null or no command, else every argument split - * by spaces and quoted by quoting rules. - */ - fun toString(args: Iterable?): String { - // empty path return empty string - if (args == null) { - return "" - } - // path containing one or more elements - val result = StringBuilder() - for (arg in args) { - if (result.isNotEmpty()) result.append(' ') - (0 until arg.length) - .map { arg[it] } - .forEach { - when (it) { - ' ', '\\', '"', '\'' -> { - result.append('\\') // intentionally no break - result.append(it) - } - else -> result.append(it) - } - } - } - return result.toString() - } - - /** - * Quote the parts of the given array in way that makes them - * usable as command line arguments. - * @param args the list of arguments to quote. - * @return empty string for null or no command, else every argument split - * by spaces and quoted by quoting rules. - */ - fun toString(args: Array) = toString(args.asIterable()) // thanks to Java, arrays aren't iterable - - /** - * Crack a command line. - * @param toProcess the command line to process. - * @return the command line broken into strings. - * An empty or null toProcess parameter results in a zero sized array. - */ - fun translateCommandline(toProcess: String?): Array { - if (toProcess == null || toProcess.isEmpty()) { - //no command? no string - return arrayOf() - } - // parse with a simple finite state machine - - val normal = 0 - val inQuote = 1 - val inDoubleQuote = 2 - var state = normal - val tok = StringTokenizer(toProcess, "\\\"\' ", true) - val result = ArrayList() - val current = StringBuilder() - var lastTokenHasBeenQuoted = false - var lastTokenIsSlash = false - - while (tok.hasMoreTokens()) { - val nextTok = tok.nextToken() - when (state) { - inQuote -> if ("\'" == nextTok) { - lastTokenHasBeenQuoted = true - state = normal - } else { - current.append(nextTok) - } - inDoubleQuote -> if ("\"" == nextTok) { - if (lastTokenIsSlash) { - current.append(nextTok) - lastTokenIsSlash = false - } else { - lastTokenHasBeenQuoted = true - state = normal - } - } else if ("\\" == nextTok) { - lastTokenIsSlash = if (lastTokenIsSlash) { - current.append(nextTok) - false - } else - true - } else { - if (lastTokenIsSlash) { - current.append("\\") // unescaped - lastTokenIsSlash = false - } - current.append(nextTok) - } - else -> { - if (lastTokenIsSlash) { - current.append(nextTok) - lastTokenIsSlash = false - } else if ("\\" == nextTok) - lastTokenIsSlash = true - else if ("\'" == nextTok) { - state = inQuote - } else if ("\"" == nextTok) { - state = inDoubleQuote - } else if (" " == nextTok) { - if (lastTokenHasBeenQuoted || current.isNotEmpty()) { - result.add(current.toString()) - current.setLength(0) - } - } else { - current.append(nextTok) - } - lastTokenHasBeenQuoted = false - } - } - } - if (lastTokenHasBeenQuoted || current.isNotEmpty()) { - result.add(current.toString()) - } - if (state == inQuote || state == inDoubleQuote) { - throw IllegalArgumentException("unbalanced quotes in $toProcess") - } - if (lastTokenIsSlash) throw IllegalArgumentException("escape character following nothing in $toProcess") - return result.toTypedArray() - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Constants.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Constants.kt deleted file mode 100644 index 7ffdca9e6..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Constants.kt +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.utils - -object Key { - /** - * Public config that doesn't need to be kept secret. - */ - const val DB_PUBLIC = "config.db" - const val DB_PROFILE = "profile.db" - - const val id = "profileId" - const val name = "profileName" - - const val individual = "Proxied" - - const val serviceMode = "serviceMode" - const val modeProxy = "proxy" - const val modeVpn = "vpn" - const val modeTransproxy = "transproxy" - const val shareOverLan = "shareOverLan" - const val portProxy = "portProxy" - const val portLocalDns = "portLocalDns" - const val portTransproxy = "portTransproxy" - - const val route = "route" - - const val isAutoConnect = "isAutoConnect" - const val directBootAware = "directBootAware" - - const val proxyApps = "isProxyApps" - const val bypass = "isBypassApps" - const val udpdns = "isUdpDns" - const val ipv6 = "isIpv6" - const val metered = "metered" - - const val host = "proxy" - const val password = "sitekey" - const val method = "encMethod" - const val remotePort = "remotePortNum" - const val remoteDns = "remoteDns" - - const val plugin = "plugin" - const val pluginConfigure = "plugin.configure" - const val udpFallback = "udpFallback" - - const val dirty = "profileDirty" - - const val tfo = "tcp_fastopen" - const val assetUpdateTime = "assetUpdateTime" - - // TV specific values - const val controlStats = "control.stats" - const val controlImport = "control.import" - const val controlExport = "control.export" - const val about = "about" -} - -object Action { - const val SERVICE = "org.amnezia.vpn.shadowsocks.SERVICE" - const val CLOSE = "org.amnezia.vpn.shadowsocks.CLOSE" - const val RELOAD = "org.amnezia.vpn.shadowsocks.RELOAD" - - const val EXTRA_PROFILE_ID = "org.amnezia.vpn.shadowsocks.EXTRA_PROFILE_ID" -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DeviceStorageApp.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DeviceStorageApp.kt deleted file mode 100644 index b941ccee2..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DeviceStorageApp.kt +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.utils - -import android.annotation.SuppressLint -import android.annotation.TargetApi -import android.app.Application -import android.content.Context - -@SuppressLint("Registered") -@TargetApi(24) -class DeviceStorageApp(context: Context) : Application() { - init { - attachBaseContext(context.createDeviceProtectedStorageContext()) - } - - /** - * Thou shalt not get the REAL underlying application context which would no longer be operating under device - * protected storage. - */ - override fun getApplicationContext() = this -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DirectBoot.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DirectBoot.kt deleted file mode 100644 index 0e7e82c3c..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/DirectBoot.kt +++ /dev/null @@ -1,59 +0,0 @@ -package org.amnezia.vpn.shadowsocks.core.utils - -import android.annotation.TargetApi -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import org.amnezia.vpn.shadowsocks.core.Core -import org.amnezia.vpn.shadowsocks.core.Core.app -import org.amnezia.vpn.shadowsocks.core.bg.BaseService -import org.amnezia.vpn.shadowsocks.core.database.Profile -import org.amnezia.vpn.shadowsocks.core.database.ProfileManager -import org.amnezia.vpn.shadowsocks.core.preference.DataStore -import java.io.File -import java.io.IOException -import java.io.ObjectInputStream -import java.io.ObjectOutputStream - -@TargetApi(24) -object DirectBoot : BroadcastReceiver() { - private val file = File(Core.deviceStorage.noBackupFilesDir, "directBootProfile") - private var registered = false - - fun getDeviceProfile(): Pair? = try { - ObjectInputStream(file.inputStream()).use { it.readObject() as? Pair } - } catch (_: IOException) { null } - - fun clean() { - file.delete() - File(Core.deviceStorage.noBackupFilesDir, BaseService.CONFIG_FILE).delete() - File(Core.deviceStorage.noBackupFilesDir, BaseService.CONFIG_FILE_UDP).delete() - } - - /** - * app.currentProfile will call this. - */ - fun update(profile: Profile? = ProfileManager.getProfile(DataStore.profileId)) = - if (profile == null) clean() - else ObjectOutputStream(file.outputStream()).use { it.writeObject(ProfileManager.expand(profile)) } - - fun flushTrafficStats() { - getDeviceProfile()?.also { (profile, fallback) -> - if (profile.dirty) ProfileManager.updateProfile(profile) - if (fallback?.dirty == true) ProfileManager.updateProfile(fallback) - } - update() - } - - fun listenForUnlock() { - if (registered) return - app.registerReceiver(this, IntentFilter(Intent.ACTION_BOOT_COMPLETED)) - registered = true - } - override fun onReceive(context: Context, intent: Intent) { - flushTrafficStats() - app.unregisterReceiver(this) - registered = false - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Utils.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Utils.kt deleted file mode 100644 index 15e2dc030..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/utils/Utils.kt +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2018 by Max Lv * - * Copyright (C) 2018 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.core.utils - -import android.content.BroadcastReceiver -import android.content.ContentResolver -import android.content.Context -import android.content.Intent -import android.content.pm.PackageInfo -import android.content.res.Resources -import android.graphics.BitmapFactory -import android.graphics.ImageDecoder -import android.net.Uri -import android.os.Build -import android.system.Os -import android.system.OsConstants -import android.util.TypedValue -import androidx.annotation.AttrRes -import androidx.preference.Preference - -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import java.net.HttpURLConnection -import java.net.InetAddress - -val Throwable.readableMessage get() = localizedMessage ?: javaClass.name - -private val parseNumericAddress by lazy { - InetAddress::class.java.getDeclaredMethod("parseNumericAddress", String::class.java).apply { - isAccessible = true - } -} -/** - * A slightly more performant variant of InetAddress.parseNumericAddress. - * - * Bug: https://issuetracker.google.com/issues/123456213 - */ -fun String?.parseNumericAddress(): InetAddress? = Os.inet_pton(OsConstants.AF_INET, this) - ?: Os.inet_pton(OsConstants.AF_INET6, this)?.let { parseNumericAddress.invoke(null, this) as InetAddress } - -fun HttpURLConnection.disconnectFromMain() { - if (Build.VERSION.SDK_INT >= 26) disconnect() else GlobalScope.launch(Dispatchers.IO) { disconnect() } -} - -fun parsePort(str: String?, default: Int, min: Int = 1025): Int { - val value = str?.toIntOrNull() ?: default - return if (value < min || value > 65535) default else value -} - -fun broadcastReceiver(callback: (Context, Intent) -> Unit): BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) = callback(context, intent) -} - -fun ContentResolver.openBitmap(uri: Uri) = - if (Build.VERSION.SDK_INT >= 28) ImageDecoder.decodeBitmap(ImageDecoder.createSource(this, uri)) - else BitmapFactory.decodeStream(openInputStream(uri)) - -val PackageInfo.signaturesCompat get() = - if (Build.VERSION.SDK_INT >= 28) signingInfo.apkContentsSigners else @Suppress("DEPRECATION") signatures - -/** - * Based on: https://stackoverflow.com/a/26348729/2245107 - */ -fun Resources.Theme.resolveResourceId(@AttrRes resId: Int): Int { - val typedValue = TypedValue() - if (!resolveAttribute(resId, typedValue, true)) throw Resources.NotFoundException() - return typedValue.resourceId -} - -val Intent.datas get() = listOfNotNull(data) + (clipData?.asIterable()?.mapNotNull { it.uri } ?: emptyList()) - -fun printLog(t: Throwable) { - t.printStackTrace() -} - -fun Preference.remove() = parent!!.removePreference(this) diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/NativePluginProvider.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/NativePluginProvider.kt deleted file mode 100644 index 3fd80cc7d..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/NativePluginProvider.kt +++ /dev/null @@ -1,97 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.plugin - -import android.content.ContentProvider -import android.content.ContentValues -import android.database.Cursor -import android.database.MatrixCursor -import android.net.Uri -import android.os.Bundle -import android.os.ParcelFileDescriptor -import androidx.core.os.bundleOf - -/** - * Base class for a native plugin provider. A native plugin provider offers read-only access to files that are required - * to run a plugin, such as binary files and other configuration files. To create a native plugin provider, extend this - * class, implement the abstract methods, and add it to your manifest like this: - * - *

<manifest>
- *    ...
- *    <application>
- *        ...
- *        <provider android:name="org.amnezia.vpn.shadowsocks.$PLUGIN_ID.BinaryProvider"
- *                     android:authorities="org.amnezia.vpn.shadowsocks.plugin.$PLUGIN_ID.BinaryProvider">
- *            <intent-filter>
- *                <category android:name="org.amnezia.vpn.shadowsocks.plugin.ACTION_NATIVE_PLUGIN" />
- *            </intent-filter>
- *        </provider>
- *        ...
- *    </application>
- *</manifest>
- */ -abstract class NativePluginProvider : ContentProvider() { - override fun getType(p0: Uri): String = "application/x-elf" - - override fun onCreate(): Boolean = true - - /** - * Provide all files needed for native plugin. - * - * @param provider A helper object to use to add files. - */ - protected abstract fun populateFiles(provider: PathProvider) - - override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, - sortOrder: String?): Cursor { - check(selection == null && selectionArgs == null && sortOrder == null) - val result = MatrixCursor(projection) - populateFiles(PathProvider(uri, result)) - return result - } - - /** - * Returns executable entry absolute path. This is used if plugin is sharing UID with the host. - * - * Default behavior is throwing UnsupportedOperationException. If you don't wish to use this feature, use the - * default behavior. - * - * @return Absolute path for executable entry. - */ - open fun getExecutable(): String = throw UnsupportedOperationException() - - abstract fun openFile(uri: Uri?): ParcelFileDescriptor - override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor { - check(mode == "r") - return openFile(uri) - } - - override fun call(method: String, arg: String?, extras: Bundle?): Bundle? = when (method) { - PluginContract.METHOD_GET_EXECUTABLE -> bundleOf(Pair(PluginContract.EXTRA_ENTRY, getExecutable())) - else -> super.call(method, arg, extras) - } - - // Methods that should not be used - override fun insert(p0: Uri, p1: ContentValues?): Uri = throw UnsupportedOperationException() - override fun update(p0: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = - throw UnsupportedOperationException() - override fun delete(uri: Uri, p1: String?, p2: Array?): Int = throw UnsupportedOperationException() -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PathProvider.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PathProvider.kt deleted file mode 100644 index f7ebe1e4a..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PathProvider.kt +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.plugin - -import android.database.MatrixCursor -import android.net.Uri -import java.io.File - -/** - * Helper class to provide relative paths of files to copy. - */ -class PathProvider internal constructor(baseUri: Uri, private val cursor: MatrixCursor) { - private val basePath = baseUri.path?.trim('/') ?: "" - - fun addPath(path: String, mode: Int = 0b110100100): PathProvider { - val trimmed = path.trim('/') - if (trimmed.startsWith(basePath)) cursor.newRow() - .add(PluginContract.COLUMN_PATH, trimmed) - .add(PluginContract.COLUMN_MODE, mode) - return this - } - fun addTo(file: File, to: String = "", mode: Int = 0b110100100): PathProvider { - var sub = to + file.name - if (basePath.startsWith(sub)) if (file.isDirectory) { - sub += '/' - file.listFiles().forEach { addTo(it, sub, mode) } - } else addPath(sub, mode) - return this - } - fun addAt(file: File, at: String = "", mode: Int = 0b110100100): PathProvider { - if (basePath.startsWith(at)) - if (file.isDirectory) file.listFiles().forEach { addTo(it, at, mode) } else addPath(at, mode) - return this - } -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginContract.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginContract.kt deleted file mode 100644 index 418e50863..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginContract.kt +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.plugin - -/** - * The contract between the plugin provider and host. Contains definitions for the supported actions, extras, etc. - * - * This class is written in Java to keep Java interoperability. - */ -object PluginContract { - /** - * ContentProvider Action: Used for NativePluginProvider. - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.ACTION_NATIVE_PLUGIN" - */ - const val ACTION_NATIVE_PLUGIN = "org.amnezia.vpn.shadowsocks.plugin.ACTION_NATIVE_PLUGIN" - - /** - * Activity Action: Used for ConfigurationActivity. - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.ACTION_CONFIGURE" - */ - const val ACTION_CONFIGURE = "org.amnezia.vpn.shadowsocks.plugin.ACTION_CONFIGURE" - /** - * Activity Action: Used for HelpActivity or HelpCallback. - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.ACTION_HELP" - */ - const val ACTION_HELP = "org.amnezia.vpn.shadowsocks.plugin.ACTION_HELP" - - /** - * The lookup key for a string that provides the plugin entry binary. - * - * Example: "/data/data/org.amnezia.vpn.shadowsocks.plugin.obfs_local/lib/libobfs-local.so" - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.EXTRA_ENTRY" - */ - const val EXTRA_ENTRY = "org.amnezia.vpn.shadowsocks.plugin.EXTRA_ENTRY" - /** - * The lookup key for a string that provides the options as a string. - * - * Example: "obfs=http;obfs-host=www.baidu.com" - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.EXTRA_OPTIONS" - */ - const val EXTRA_OPTIONS = "org.amnezia.vpn.shadowsocks.plugin.EXTRA_OPTIONS" - /** - * The lookup key for a CharSequence that provides user relevant help message. - * - * Example: "obfs=|tls> Enable obfuscating: HTTP or TLS (Experimental). - * obfs-host= Hostname for obfuscating (Experimental)." - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.EXTRA_HELP_MESSAGE" - */ - const val EXTRA_HELP_MESSAGE = "org.amnezia.vpn.shadowsocks.plugin.EXTRA_HELP_MESSAGE" - - /** - * The metadata key to retrieve plugin id. Required for plugins. - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.id" - */ - const val METADATA_KEY_ID = "org.amnezia.vpn.shadowsocks.plugin.id" - /** - * The metadata key to retrieve default configuration. Default value is empty. - * - * Constant Value: "org.amnezia.vpn.shadowsocks.plugin.default_config" - */ - const val METADATA_KEY_DEFAULT_CONFIG = "org.amnezia.vpn.shadowsocks.plugin.default_config" - - const val METHOD_GET_EXECUTABLE = "shadowsocks:getExecutable" - - /** ConfigurationActivity result: fallback to manual edit mode. */ - const val RESULT_FALLBACK = 1 - - /** - * Relative to the file to be copied. This column is required. - * - * Example: "kcptun", "doc/help.txt" - * - * Type: String - */ - const val COLUMN_PATH = "path" - /** - * File mode bits. Default value is "644". - * - * Example: "755" - * - * Type: String - */ - const val COLUMN_MODE = "mode" - - /** - * The scheme for general plugin actions. - */ - const val SCHEME = "plugin" - /** - * The authority for general plugin actions. - */ - const val AUTHORITY = "org.amnezia.vpn.shadowsocks" -} diff --git a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginOptions.kt b/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginOptions.kt deleted file mode 100644 index a11ffdd0c..000000000 --- a/client/android/shadowsocks/src/main/java/org/amnezia/vpn/shadowsocks/core/widget/PluginOptions.kt +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - * * - * Copyright (C) 2017 by Max Lv * - * Copyright (C) 2017 by Mygod Studio * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -package org.amnezia.vpn.shadowsocks.plugin - -import java.util.* - -/** - * Helper class for processing plugin options. - * - * Based on: https://github.com/apache/ant/blob/588ce1f/src/main/org/apache/tools/ant/types/Commandline.java - */ -class PluginOptions : HashMap { - var id = "" - - constructor() : super() - constructor(initialCapacity: Int) : super(initialCapacity) - constructor(initialCapacity: Int, loadFactor: Float) : super(initialCapacity, loadFactor) - - private constructor(options: String?, parseId: Boolean) : this() { - @Suppress("NAME_SHADOWING") - var parseId = parseId - if (options.isNullOrEmpty()) return - check(options.all { !it.isISOControl() }) { "No control characters allowed." } - val tokenizer = StringTokenizer("$options;", "\\=;", true) - val current = StringBuilder() - var key: String? = null - while (tokenizer.hasMoreTokens()) when (val nextToken = tokenizer.nextToken()) { - "\\" -> current.append(tokenizer.nextToken()) - "=" -> if (key == null) { - key = current.toString() - current.setLength(0) - } else current.append(nextToken) - ";" -> { - if (key != null) { - put(key, current.toString()) - key = null - } else if (current.isNotEmpty()) - if (parseId) id = current.toString() else put(current.toString(), null) - current.setLength(0) - parseId = false - } - else -> current.append(nextToken) - } - } - - constructor(options: String?) : this(options, true) - constructor(id: String, options: String?) : this(options, false) { - this.id = id - } - - /** - * Put but if value is null or default, the entry is deleted. - * - * @return Old value before put. - */ - fun putWithDefault(key: String, value: String?, default: String? = null) = - if (value == null || value == default) remove(key) else put(key, value) - - private fun append(result: StringBuilder, str: String) = (0 until str.length) - .map { str[it] } - .forEach { - when (it) { - '\\', '=', ';' -> { - result.append('\\') // intentionally no break - result.append(it) - } - else -> result.append(it) - } - } - - fun toString(trimId: Boolean): String { - val result = StringBuilder() - if (!trimId) if (id.isEmpty()) return "" else append(result, id) - for ((key, value) in entries) { - if (result.isNotEmpty()) result.append(';') - append(result, key) - if (value != null) { - result.append('=') - append(result, value) - } - } - return result.toString() - } - - override fun toString(): String = toString(true) - - override fun equals(other: Any?): Boolean { - if (this === other) return true - return javaClass == other?.javaClass && super.equals(other) && id == (other as PluginOptions).id - } - override fun hashCode(): Int = Objects.hash(super.hashCode(), id) -} diff --git a/client/android/shadowsocks/src/main/res/drawable/ic_navigation_close.xml b/client/android/shadowsocks/src/main/res/drawable/ic_navigation_close.xml deleted file mode 100644 index 7caff12f8..000000000 --- a/client/android/shadowsocks/src/main/res/drawable/ic_navigation_close.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/client/android/shadowsocks/src/main/res/layout/toolbar_light_dark.xml b/client/android/shadowsocks/src/main/res/layout/toolbar_light_dark.xml deleted file mode 100644 index 005fad066..000000000 --- a/client/android/shadowsocks/src/main/res/layout/toolbar_light_dark.xml +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/client/android/shadowsocks/src/main/res/raw/china_ip_list.txt b/client/android/shadowsocks/src/main/res/raw/china_ip_list.txt deleted file mode 100644 index 3f9951462..000000000 --- a/client/android/shadowsocks/src/main/res/raw/china_ip_list.txt +++ /dev/null @@ -1,5215 +0,0 @@ -1.0.1.0/24 -1.0.2.0/23 -1.0.8.0/21 -1.0.32.0/19 -1.1.0.0/24 -1.1.2.0/23 -1.1.4.0/22 -1.1.8.0/21 -1.1.16.0/20 -1.1.32.0/19 -1.2.0.0/23 -1.2.2.0/24 -1.2.4.0/22 -1.2.8.0/21 -1.2.16.0/20 -1.2.32.0/19 -1.2.64.0/18 -1.3.0.0/16 -1.4.1.0/24 -1.4.2.0/23 -1.4.4.0/22 -1.4.8.0/21 -1.4.16.0/20 -1.4.32.0/19 -1.4.64.0/18 -1.8.0.0/16 -1.10.0.0/21 -1.10.8.0/23 -1.10.11.0/24 -1.10.12.0/22 -1.10.16.0/20 -1.10.32.0/19 -1.10.64.0/18 -1.12.0.0/14 -1.24.0.0/13 -1.45.0.0/16 -1.48.0.0/14 -1.56.0.0/13 -1.68.0.0/14 -1.80.0.0/12 -1.116.0.0/14 -1.180.0.0/14 -1.184.0.0/15 -1.188.0.0/14 -1.192.0.0/13 -1.202.0.0/15 -1.204.0.0/14 -8.128.0.0/10 -8.208.0.0/12 -14.0.0.0/21 -14.0.12.0/22 -14.1.0.0/22 -14.1.24.0/22 -14.1.96.0/22 -14.1.108.0/22 -14.16.0.0/12 -14.102.128.0/22 -14.102.156.0/22 -14.102.180.0/22 -14.103.0.0/16 -14.104.0.0/13 -14.112.0.0/12 -14.130.0.0/15 -14.134.0.0/15 -14.144.0.0/12 -14.192.56.0/21 -14.192.76.0/22 -14.196.0.0/15 -14.204.0.0/15 -14.208.0.0/12 -20.134.160.0/20 -20.139.160.0/20 -27.0.128.0/21 -27.0.160.0/21 -27.0.188.0/22 -27.0.204.0/22 -27.0.208.0/21 -27.8.0.0/13 -27.16.0.0/12 -27.34.232.0/21 -27.36.0.0/14 -27.40.0.0/13 -27.50.40.0/21 -27.50.128.0/17 -27.54.72.0/21 -27.54.152.0/21 -27.54.192.0/18 -27.98.208.0/20 -27.98.224.0/19 -27.99.128.0/17 -27.103.0.0/16 -27.106.128.0/18 -27.106.204.0/22 -27.109.32.0/19 -27.109.124.0/22 -27.112.0.0/18 -27.112.80.0/20 -27.112.112.0/21 -27.113.128.0/18 -27.115.0.0/17 -27.116.44.0/22 -27.121.72.0/21 -27.121.120.0/21 -27.123.232.0/22 -27.128.0.0/15 -27.131.220.0/22 -27.144.0.0/16 -27.148.0.0/14 -27.152.0.0/13 -27.184.0.0/13 -27.192.0.0/11 -27.224.0.0/14 -36.0.0.0/22 -36.0.8.0/21 -36.0.16.0/20 -36.0.32.0/19 -36.0.64.0/18 -36.0.128.0/17 -36.1.0.0/16 -36.4.0.0/14 -36.16.0.0/12 -36.32.0.0/14 -36.36.0.0/16 -36.37.0.0/19 -36.37.36.0/23 -36.37.39.0/24 -36.37.40.0/21 -36.37.48.0/20 -36.40.0.0/13 -36.48.0.0/15 -36.51.0.0/16 -36.56.0.0/13 -36.96.0.0/11 -36.128.0.0/10 -36.192.0.0/11 -36.248.0.0/14 -36.254.0.0/16 -36.255.116.0/22 -36.255.128.0/22 -36.255.164.0/22 -36.255.172.0/22 -36.255.176.0/22 -36.255.220.0/22 -39.0.0.0/24 -39.0.2.0/23 -39.0.4.0/22 -39.0.8.0/21 -39.0.16.0/20 -39.0.32.0/19 -39.0.64.0/18 -39.0.128.0/17 -39.64.0.0/11 -39.96.0.0/13 -39.104.0.0/14 -39.108.0.0/16 -39.109.120.0/23 -39.128.0.0/10 -40.0.176.0/20 -40.0.247.0/24 -40.0.248.0/22 -40.0.252.0/23 -40.0.255.0/24 -40.72.0.0/15 -40.125.128.0/17 -40.126.64.0/18 -40.198.10.0/24 -40.198.16.0/21 -40.198.24.0/23 -40.251.225.0/24 -40.251.227.0/24 -42.0.0.0/22 -42.0.8.0/21 -42.0.16.0/21 -42.0.24.0/22 -42.0.32.0/19 -42.0.128.0/17 -42.1.0.0/19 -42.1.32.0/20 -42.1.48.0/21 -42.1.56.0/22 -42.1.128.0/17 -42.4.0.0/14 -42.48.0.0/13 -42.56.0.0/14 -42.62.0.0/17 -42.62.128.0/19 -42.62.160.0/20 -42.62.180.0/22 -42.62.184.0/21 -42.63.0.0/16 -42.80.0.0/15 -42.83.64.0/20 -42.83.80.0/22 -42.83.88.0/21 -42.83.96.0/19 -42.83.128.0/17 -42.84.0.0/14 -42.88.0.0/13 -42.96.64.0/19 -42.96.96.0/21 -42.96.108.0/22 -42.96.112.0/20 -42.96.128.0/17 -42.97.0.0/16 -42.99.0.0/18 -42.99.64.0/19 -42.99.96.0/20 -42.99.112.0/22 -42.99.120.0/21 -42.100.0.0/14 -42.120.0.0/15 -42.122.0.0/16 -42.123.0.0/19 -42.123.36.0/22 -42.123.40.0/21 -42.123.48.0/20 -42.123.64.0/18 -42.123.128.0/17 -42.128.0.0/12 -42.156.0.0/19 -42.156.36.0/22 -42.156.40.0/21 -42.156.48.0/20 -42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/16 -42.158.0.0/15 -42.160.0.0/12 -42.176.0.0/13 -42.184.0.0/15 -42.186.0.0/16 -42.187.0.0/18 -42.187.64.0/19 -42.187.96.0/20 -42.187.112.0/21 -42.187.120.0/22 -42.187.128.0/17 -42.192.0.0/13 -42.201.0.0/17 -42.202.0.0/15 -42.204.0.0/14 -42.208.0.0/12 -42.224.0.0/12 -42.240.0.0/16 -42.242.0.0/15 -42.244.0.0/14 -42.248.0.0/13 -43.224.12.0/22 -43.224.24.0/22 -43.224.44.0/22 -43.224.52.0/22 -43.224.56.0/22 -43.224.64.0/21 -43.224.72.0/22 -43.224.80.0/22 -43.224.100.0/22 -43.224.144.0/22 -43.224.160.0/22 -43.224.176.0/22 -43.224.184.0/22 -43.224.200.0/21 -43.224.208.0/21 -43.224.216.0/22 -43.224.224.0/22 -43.224.240.0/22 -43.225.76.0/22 -43.225.84.0/22 -43.225.120.0/21 -43.225.140.0/22 -43.225.172.0/22 -43.225.180.0/22 -43.225.208.0/22 -43.225.216.0/21 -43.225.224.0/20 -43.225.240.0/21 -43.225.252.0/22 -43.226.32.0/19 -43.226.64.0/19 -43.226.96.0/20 -43.226.112.0/21 -43.226.120.0/22 -43.226.128.0/18 -43.226.192.0/20 -43.226.208.0/21 -43.226.236.0/22 -43.226.240.0/20 -43.227.0.0/21 -43.227.8.0/22 -43.227.32.0/19 -43.227.64.0/19 -43.227.96.0/21 -43.227.104.0/22 -43.227.136.0/21 -43.227.144.0/22 -43.227.152.0/21 -43.227.160.0/20 -43.227.176.0/21 -43.227.188.0/22 -43.227.192.0/19 -43.227.232.0/22 -43.227.248.0/21 -43.228.0.0/18 -43.228.64.0/21 -43.228.76.0/22 -43.228.100.0/22 -43.228.116.0/22 -43.228.120.0/22 -43.228.132.0/22 -43.228.136.0/22 -43.228.148.0/22 -43.228.152.0/22 -43.228.188.0/22 -43.229.16.0/22 -43.229.40.0/22 -43.229.48.0/22 -43.229.56.0/22 -43.229.96.0/22 -43.229.120.0/22 -43.229.136.0/21 -43.229.144.0/22 -43.229.168.0/21 -43.229.176.0/20 -43.229.192.0/21 -43.229.216.0/21 -43.229.232.0/21 -43.230.20.0/22 -43.230.32.0/22 -43.230.68.0/22 -43.230.72.0/22 -43.230.84.0/22 -43.230.124.0/22 -43.230.136.0/22 -43.230.168.0/22 -43.230.220.0/22 -43.230.224.0/19 -43.231.12.0/22 -43.231.32.0/20 -43.231.80.0/20 -43.231.96.0/20 -43.231.136.0/21 -43.231.144.0/20 -43.231.160.0/20 -43.231.176.0/21 -43.236.0.0/15 -43.238.0.0/16 -43.239.0.0/19 -43.239.32.0/20 -43.239.48.0/22 -43.239.116.0/22 -43.239.120.0/22 -43.239.172.0/22 -43.239.176.0/22 -43.240.0.0/22 -43.240.48.0/22 -43.240.56.0/21 -43.240.68.0/22 -43.240.72.0/21 -43.240.84.0/22 -43.240.124.0/22 -43.240.128.0/21 -43.240.136.0/22 -43.240.156.0/22 -43.240.160.0/19 -43.240.192.0/19 -43.240.236.0/22 -43.240.240.0/20 -43.241.0.0/20 -43.241.16.0/21 -43.241.48.0/22 -43.241.76.0/22 -43.241.80.0/20 -43.241.112.0/22 -43.241.168.0/21 -43.241.176.0/21 -43.241.184.0/22 -43.241.196.0/22 -43.241.208.0/20 -43.241.224.0/20 -43.241.240.0/22 -43.241.248.0/21 -43.242.8.0/21 -43.242.16.0/20 -43.242.44.0/22 -43.242.48.0/20 -43.242.64.0/22 -43.242.72.0/21 -43.242.80.0/20 -43.242.96.0/22 -43.242.144.0/20 -43.242.160.0/21 -43.242.168.0/22 -43.242.180.0/22 -43.242.188.0/22 -43.242.192.0/21 -43.242.204.0/22 -43.242.216.0/21 -43.242.252.0/22 -43.243.4.0/22 -43.243.8.0/21 -43.243.16.0/22 -43.243.24.0/22 -43.243.88.0/22 -43.243.128.0/22 -43.243.136.0/22 -43.243.144.0/21 -43.243.156.0/22 -43.243.168.0/22 -43.243.180.0/22 -43.243.188.0/22 -43.243.228.0/22 -43.243.232.0/22 -43.243.244.0/22 -43.246.0.0/18 -43.246.64.0/19 -43.246.96.0/22 -43.246.112.0/22 -43.246.212.0/22 -43.246.228.0/22 -43.247.4.0/22 -43.247.8.0/22 -43.247.44.0/22 -43.247.48.0/22 -43.247.68.0/22 -43.247.76.0/22 -43.247.84.0/22 -43.247.88.0/21 -43.247.96.0/21 -43.247.108.0/22 -43.247.112.0/22 -43.247.148.0/22 -43.247.152.0/22 -43.247.176.0/20 -43.247.196.0/22 -43.247.200.0/21 -43.247.208.0/20 -43.247.224.0/19 -43.248.0.0/21 -43.248.20.0/22 -43.248.28.0/22 -43.248.48.0/22 -43.248.76.0/22 -43.248.80.0/20 -43.248.96.0/19 -43.248.128.0/20 -43.248.144.0/21 -43.248.176.0/20 -43.248.192.0/20 -43.248.208.0/22 -43.248.228.0/22 -43.248.232.0/22 -43.248.244.0/22 -43.249.0.0/21 -43.249.8.0/22 -43.249.24.0/22 -43.249.120.0/22 -43.249.132.0/22 -43.249.136.0/22 -43.249.144.0/20 -43.249.160.0/21 -43.249.168.0/22 -43.249.192.0/22 -43.249.236.0/22 -43.250.4.0/22 -43.250.12.0/22 -43.250.16.0/21 -43.250.28.0/22 -43.250.32.0/21 -43.250.72.0/22 -43.250.96.0/20 -43.250.112.0/21 -43.250.128.0/22 -43.250.144.0/21 -43.250.160.0/22 -43.250.168.0/21 -43.250.176.0/22 -43.250.200.0/22 -43.250.212.0/22 -43.250.216.0/21 -43.250.236.0/22 -43.250.244.0/22 -43.251.4.0/22 -43.251.8.0/21 -43.251.36.0/22 -43.251.100.0/22 -43.251.116.0/22 -43.251.192.0/22 -43.251.232.0/21 -43.251.244.0/22 -43.252.40.0/22 -43.252.48.0/22 -43.252.56.0/22 -43.252.224.0/22 -43.254.0.0/21 -43.254.8.0/22 -43.254.24.0/22 -43.254.36.0/22 -43.254.44.0/22 -43.254.52.0/22 -43.254.64.0/22 -43.254.72.0/22 -43.254.84.0/22 -43.254.88.0/21 -43.254.100.0/22 -43.254.104.0/22 -43.254.112.0/21 -43.254.128.0/22 -43.254.136.0/21 -43.254.144.0/20 -43.254.168.0/21 -43.254.180.0/22 -43.254.184.0/21 -43.254.192.0/21 -43.254.200.0/22 -43.254.208.0/22 -43.254.220.0/22 -43.254.224.0/20 -43.254.240.0/22 -43.254.248.0/21 -43.255.0.0/21 -43.255.8.0/22 -43.255.16.0/22 -43.255.48.0/22 -43.255.64.0/20 -43.255.84.0/22 -43.255.96.0/22 -43.255.108.0/22 -43.255.144.0/22 -43.255.168.0/22 -43.255.176.0/22 -43.255.184.0/22 -43.255.192.0/22 -43.255.200.0/21 -43.255.208.0/21 -43.255.224.0/21 -43.255.232.0/22 -43.255.244.0/22 -45.40.192.0/18 -45.65.16.0/20 -45.112.132.0/22 -45.112.188.0/22 -45.112.208.0/20 -45.112.228.0/22 -45.112.232.0/21 -45.113.12.0/22 -45.113.16.0/20 -45.113.40.0/22 -45.113.52.0/22 -45.113.56.0/22 -45.113.72.0/22 -45.113.144.0/21 -45.113.168.0/22 -45.113.176.0/22 -45.113.184.0/22 -45.113.200.0/21 -45.113.208.0/20 -45.113.228.0/22 -45.113.240.0/22 -45.113.252.0/22 -45.114.0.0/22 -45.114.12.0/22 -45.114.32.0/22 -45.114.40.0/22 -45.114.52.0/22 -45.114.96.0/22 -45.114.104.0/21 -45.114.124.0/22 -45.114.136.0/22 -45.114.196.0/22 -45.114.200.0/22 -45.114.228.0/22 -45.114.236.0/22 -45.114.252.0/22 -45.115.44.0/22 -45.115.100.0/22 -45.115.120.0/22 -45.115.132.0/22 -45.115.144.0/22 -45.115.156.0/22 -45.115.164.0/22 -45.115.200.0/22 -45.115.212.0/22 -45.115.216.0/22 -45.115.228.0/22 -45.115.236.0/22 -45.115.244.0/22 -45.115.248.0/22 -45.116.12.0/22 -45.116.16.0/21 -45.116.24.0/22 -45.116.32.0/21 -45.116.52.0/22 -45.116.96.0/21 -45.116.140.0/22 -45.116.152.0/22 -45.116.208.0/22 -45.117.8.0/22 -45.117.20.0/22 -45.117.68.0/22 -45.117.124.0/22 -45.117.252.0/22 -45.119.52.0/22 -45.119.60.0/22 -45.119.64.0/21 -45.119.72.0/22 -45.119.104.0/22 -45.119.116.0/22 -45.119.232.0/22 -45.120.100.0/22 -45.120.140.0/22 -45.120.164.0/22 -45.120.220.0/22 -45.120.240.0/22 -45.121.20.0/22 -45.121.52.0/22 -45.121.64.0/21 -45.121.72.0/22 -45.121.92.0/22 -45.121.96.0/22 -45.121.104.0/22 -45.121.172.0/22 -45.121.176.0/22 -45.121.212.0/22 -45.121.240.0/20 -45.122.0.0/19 -45.122.32.0/21 -45.122.40.0/22 -45.122.60.0/22 -45.122.64.0/19 -45.122.96.0/20 -45.122.112.0/21 -45.122.160.0/19 -45.122.192.0/20 -45.122.208.0/21 -45.122.216.0/22 -45.123.28.0/22 -45.123.32.0/21 -45.123.44.0/22 -45.123.48.0/20 -45.123.64.0/20 -45.123.80.0/21 -45.123.88.0/22 -45.123.120.0/22 -45.123.128.0/21 -45.123.136.0/22 -45.123.148.0/22 -45.123.152.0/21 -45.123.164.0/22 -45.123.168.0/21 -45.123.176.0/21 -45.123.184.0/22 -45.123.204.0/22 -45.123.212.0/22 -45.123.224.0/19 -45.124.0.0/22 -45.124.20.0/22 -45.124.28.0/22 -45.124.32.0/21 -45.124.44.0/22 -45.124.68.0/22 -45.124.76.0/22 -45.124.80.0/22 -45.124.100.0/22 -45.124.124.0/22 -45.124.172.0/22 -45.124.176.0/22 -45.124.208.0/22 -45.124.248.0/21 -45.125.12.0/22 -45.125.16.0/22 -45.125.24.0/21 -45.125.32.0/22 -45.125.44.0/22 -45.125.52.0/22 -45.125.56.0/22 -45.125.76.0/22 -45.125.80.0/20 -45.125.96.0/21 -45.125.104.0/22 -45.125.136.0/22 -45.126.48.0/21 -45.126.100.0/22 -45.126.108.0/22 -45.126.112.0/21 -45.126.120.0/22 -45.126.212.0/22 -45.126.220.0/22 -45.127.8.0/21 -45.127.96.0/22 -45.127.116.0/22 -45.127.124.0/22 -45.127.128.0/22 -45.127.144.0/21 -45.127.156.0/22 -45.127.216.0/22 -45.248.8.0/22 -45.248.80.0/21 -45.248.88.0/22 -45.248.96.0/20 -45.248.128.0/21 -45.248.204.0/22 -45.248.208.0/20 -45.248.224.0/19 -45.249.0.0/21 -45.249.12.0/22 -45.249.16.0/20 -45.249.32.0/21 -45.249.92.0/22 -45.249.112.0/22 -45.249.180.0/22 -45.249.188.0/22 -45.249.192.0/20 -45.249.208.0/21 -45.250.12.0/22 -45.250.16.0/22 -45.250.28.0/22 -45.250.32.0/21 -45.250.40.0/22 -45.250.76.0/22 -45.250.80.0/20 -45.250.96.0/22 -45.250.104.0/21 -45.250.112.0/20 -45.250.128.0/20 -45.250.144.0/21 -45.250.152.0/22 -45.250.164.0/22 -45.250.180.0/22 -45.250.184.0/21 -45.250.192.0/22 -45.251.0.0/22 -45.251.8.0/22 -45.251.16.0/21 -45.251.52.0/22 -45.251.84.0/22 -45.251.88.0/21 -45.251.96.0/21 -45.251.120.0/21 -45.251.136.0/21 -45.251.144.0/20 -45.251.160.0/19 -45.251.192.0/19 -45.251.224.0/22 -45.252.0.0/19 -45.252.32.0/20 -45.252.48.0/22 -45.252.60.0/22 -45.252.84.0/22 -45.252.88.0/21 -45.252.96.0/19 -45.252.128.0/19 -45.252.160.0/20 -45.252.176.0/22 -45.252.192.0/19 -45.252.224.0/21 -45.252.232.0/22 -45.253.0.0/18 -45.253.64.0/20 -45.253.80.0/21 -45.253.92.0/22 -45.253.96.0/20 -45.253.112.0/21 -45.253.120.0/22 -45.253.130.0/23 -45.253.132.0/22 -45.253.136.0/21 -45.253.144.0/20 -45.253.160.0/19 -45.253.192.0/18 -45.254.0.0/19 -45.254.40.0/22 -45.254.48.0/20 -45.254.64.0/18 -45.254.128.0/18 -45.254.192.0/19 -45.254.224.0/21 -45.254.236.0/22 -45.254.240.0/22 -45.254.248.0/22 -45.255.0.0/17 -45.255.132.0/22 -45.255.136.0/21 -45.255.144.0/20 -45.255.160.0/19 -45.255.192.0/19 -45.255.224.0/20 -45.255.240.0/21 -45.255.248.0/22 -46.61.179.170/31 -46.248.24.0/23 -47.92.0.0/14 -47.96.0.0/11 -49.4.0.0/14 -49.51.0.0/16 -49.52.0.0/14 -49.64.0.0/11 -49.112.0.0/13 -49.120.0.0/14 -49.128.0.0/24 -49.128.2.0/23 -49.128.4.0/22 -49.140.0.0/15 -49.152.0.0/14 -49.208.0.0/14 -49.220.0.0/14 -49.232.0.0/14 -49.239.0.0/18 -49.239.192.0/18 -49.246.224.0/19 -52.80.0.0/14 -52.94.249.0/27 -52.95.216.104/30 -52.130.0.0/15 -54.222.0.0/15 -54.231.208.0/20 -54.240.224.0/24 -57.92.96.0/20 -58.14.0.0/15 -58.16.0.0/13 -58.24.0.0/15 -58.30.0.0/15 -58.32.0.0/11 -58.65.232.0/21 -58.66.0.0/15 -58.68.128.0/17 -58.82.0.0/17 -58.83.0.0/16 -58.87.64.0/18 -58.99.128.0/17 -58.100.0.0/15 -58.116.0.0/14 -58.128.0.0/13 -58.144.0.0/16 -58.154.0.0/15 -58.192.0.0/11 -58.240.0.0/12 -59.32.0.0/11 -59.64.0.0/12 -59.80.0.0/14 -59.107.0.0/16 -59.108.0.0/14 -59.151.0.0/17 -59.152.16.0/20 -59.152.32.0/21 -59.152.64.0/20 -59.152.112.0/21 -59.153.4.0/22 -59.153.32.0/22 -59.153.60.0/22 -59.153.64.0/21 -59.153.72.0/22 -59.153.92.0/22 -59.153.116.0/22 -59.153.136.0/22 -59.153.152.0/21 -59.153.164.0/22 -59.153.168.0/21 -59.153.176.0/20 -59.153.192.0/22 -59.155.0.0/16 -59.172.0.0/14 -59.191.0.0/17 -59.191.240.0/20 -59.192.0.0/10 -60.0.0.0/11 -60.55.0.0/16 -60.63.0.0/16 -60.160.0.0/11 -60.194.0.0/15 -60.200.0.0/13 -60.208.0.0/12 -60.232.0.0/15 -60.235.0.0/16 -60.245.128.0/17 -60.247.0.0/16 -60.252.0.0/16 -60.253.128.0/17 -60.255.0.0/16 -61.4.80.0/20 -61.4.176.0/20 -61.8.160.0/20 -61.14.4.0/22 -61.14.212.0/22 -61.14.216.0/21 -61.14.240.0/21 -61.28.0.0/17 -61.29.128.0/17 -61.45.128.0/18 -61.45.224.0/20 -61.47.128.0/18 -61.48.0.0/13 -61.87.192.0/18 -61.128.0.0/10 -61.213.145.106/32 -61.232.0.0/14 -61.236.0.0/15 -61.240.0.0/14 -62.234.0.0/16 -64.85.27.0/24 -68.79.0.0/18 -69.230.192.0/18 -69.231.128.0/18 -69.234.192.0/18 -69.235.128.0/18 -71.131.192.0/18 -71.132.0.0/18 -71.136.64.0/18 -71.137.0.0/18 -72.163.248.0/22 -81.68.0.0/14 -82.156.0.0/15 -87.254.207.0/24 -93.183.14.0/24 -93.183.18.0/24 -94.191.0.0/17 -101.0.0.0/22 -101.1.0.0/22 -101.2.172.0/22 -101.4.0.0/14 -101.16.0.0/12 -101.32.0.0/12 -101.48.0.0/15 -101.50.8.0/21 -101.50.56.0/22 -101.52.0.0/16 -101.53.100.0/22 -101.54.0.0/16 -101.55.224.0/21 -101.64.0.0/13 -101.72.0.0/14 -101.76.0.0/15 -101.78.0.0/22 -101.78.32.0/19 -101.80.0.0/12 -101.96.0.0/21 -101.96.8.0/22 -101.96.16.0/20 -101.96.128.0/17 -101.99.96.0/19 -101.101.64.0/19 -101.101.100.0/24 -101.101.102.0/23 -101.101.104.0/21 -101.101.112.0/20 -101.102.64.0/19 -101.102.100.0/23 -101.102.102.0/24 -101.102.104.0/21 -101.102.112.0/20 -101.104.0.0/14 -101.110.64.0/19 -101.110.96.0/20 -101.110.116.0/22 -101.110.120.0/21 -101.120.0.0/14 -101.124.0.0/15 -101.126.0.0/16 -101.128.0.0/22 -101.128.8.0/21 -101.128.16.0/20 -101.128.32.0/19 -101.129.0.0/16 -101.130.0.0/15 -101.132.0.0/14 -101.144.0.0/12 -101.192.0.0/13 -101.200.0.0/15 -101.203.128.0/19 -101.203.160.0/21 -101.203.172.0/22 -101.203.176.0/20 -101.204.0.0/14 -101.224.0.0/13 -101.232.0.0/15 -101.234.64.0/21 -101.234.76.0/22 -101.234.80.0/20 -101.234.96.0/19 -101.236.0.0/14 -101.240.0.0/13 -101.248.0.0/15 -101.251.0.0/22 -101.251.8.0/21 -101.251.16.0/20 -101.251.32.0/19 -101.251.64.0/18 -101.251.128.0/17 -101.252.0.0/15 -101.254.0.0/16 -103.1.8.0/22 -103.1.20.0/22 -103.1.24.0/22 -103.1.72.0/22 -103.1.88.0/22 -103.1.168.0/22 -103.2.108.0/22 -103.2.156.0/22 -103.2.164.0/22 -103.2.200.0/21 -103.2.208.0/21 -103.3.84.0/22 -103.3.88.0/21 -103.3.96.0/19 -103.3.128.0/20 -103.3.148.0/22 -103.3.152.0/21 -103.4.56.0/22 -103.4.168.0/22 -103.4.184.0/22 -103.4.224.0/22 -103.5.36.0/22 -103.5.52.0/22 -103.5.56.0/22 -103.5.152.0/22 -103.5.168.0/22 -103.5.192.0/22 -103.5.252.0/22 -103.6.76.0/22 -103.6.108.0/22 -103.6.120.0/22 -103.6.220.0/22 -103.6.228.0/22 -103.7.4.0/22 -103.7.28.0/22 -103.7.140.0/22 -103.7.212.0/22 -103.7.216.0/21 -103.8.0.0/21 -103.8.8.0/22 -103.8.32.0/22 -103.8.52.0/22 -103.8.68.0/22 -103.8.108.0/22 -103.8.156.0/22 -103.8.200.0/21 -103.8.220.0/22 -103.9.8.0/22 -103.9.24.0/22 -103.9.108.0/22 -103.9.152.0/22 -103.9.192.0/22 -103.9.248.0/21 -103.10.0.0/22 -103.10.16.0/22 -103.10.84.0/22 -103.10.111.0/24 -103.10.140.0/22 -103.11.16.0/22 -103.11.168.0/22 -103.11.180.0/22 -103.12.32.0/22 -103.12.68.0/22 -103.12.92.0/22 -103.12.136.0/22 -103.12.184.0/22 -103.12.232.0/22 -103.13.12.0/22 -103.13.72.0/23 -103.13.124.0/22 -103.13.144.0/22 -103.13.196.0/22 -103.13.220.0/22 -103.13.244.0/22 -103.14.32.0/22 -103.14.84.0/22 -103.14.100.0/22 -103.14.132.0/22 -103.14.136.0/22 -103.14.156.0/22 -103.14.240.0/22 -103.15.4.0/22 -103.15.8.0/22 -103.15.16.0/22 -103.15.96.0/22 -103.15.200.0/22 -103.16.52.0/22 -103.16.80.0/21 -103.16.88.0/22 -103.16.108.0/22 -103.16.124.0/22 -103.17.40.0/22 -103.17.64.0/22 -103.17.120.0/22 -103.17.136.0/22 -103.17.160.0/22 -103.17.204.0/22 -103.17.228.0/22 -103.18.192.0/22 -103.18.208.0/21 -103.18.224.0/22 -103.19.0.0/22 -103.19.12.0/22 -103.19.40.0/21 -103.19.64.0/21 -103.19.72.0/22 -103.19.232.0/22 -103.20.12.0/22 -103.20.32.0/22 -103.20.44.0/22 -103.20.68.0/22 -103.20.112.0/22 -103.20.128.0/22 -103.20.160.0/22 -103.20.248.0/22 -103.21.112.0/21 -103.21.136.0/21 -103.21.176.0/22 -103.21.208.0/22 -103.21.240.0/22 -103.22.0.0/18 -103.22.64.0/19 -103.22.100.0/22 -103.22.104.0/21 -103.22.112.0/20 -103.22.188.0/22 -103.22.228.0/22 -103.22.252.0/22 -103.23.8.0/22 -103.23.56.0/22 -103.23.160.0/21 -103.23.176.0/22 -103.23.228.0/22 -103.24.24.0/22 -103.24.116.0/22 -103.24.128.0/22 -103.24.144.0/22 -103.24.176.0/22 -103.24.184.0/22 -103.24.220.0/22 -103.24.228.0/22 -103.24.248.0/21 -103.25.8.0/23 -103.25.20.0/22 -103.25.24.0/21 -103.25.32.0/21 -103.25.40.0/22 -103.25.48.0/22 -103.25.64.0/21 -103.25.148.0/22 -103.25.156.0/22 -103.25.216.0/22 -103.26.0.0/22 -103.26.64.0/22 -103.26.76.0/22 -103.26.116.0/22 -103.26.132.0/22 -103.26.156.0/22 -103.26.160.0/22 -103.26.228.0/22 -103.26.240.0/22 -103.27.4.0/22 -103.27.12.0/22 -103.27.24.0/22 -103.27.56.0/22 -103.27.96.0/22 -103.27.184.0/22 -103.27.208.0/21 -103.27.240.0/22 -103.28.4.0/22 -103.28.8.0/22 -103.28.184.0/22 -103.28.204.0/22 -103.28.212.0/22 -103.29.16.0/22 -103.29.128.0/21 -103.29.136.0/22 -103.30.20.0/22 -103.30.96.0/22 -103.30.148.0/22 -103.30.200.0/22 -103.30.228.0/22 -103.30.234.0/24 -103.30.236.0/22 -103.31.0.0/22 -103.31.48.0/20 -103.31.64.0/21 -103.31.72.0/24 -103.31.148.0/22 -103.31.160.0/22 -103.31.168.0/22 -103.31.200.0/22 -103.31.236.0/22 -103.32.0.0/15 -103.34.0.0/16 -103.35.0.0/19 -103.35.32.0/20 -103.35.48.0/22 -103.35.104.0/22 -103.35.116.0/22 -103.35.180.0/22 -103.35.200.0/22 -103.35.220.0/22 -103.36.20.0/22 -103.36.28.0/22 -103.36.36.0/22 -103.36.56.0/21 -103.36.64.0/22 -103.36.72.0/22 -103.36.96.0/22 -103.36.132.0/22 -103.36.136.0/22 -103.36.160.0/19 -103.36.192.0/19 -103.36.224.0/20 -103.36.240.0/21 -103.37.0.0/22 -103.37.12.0/22 -103.37.16.0/22 -103.37.24.0/22 -103.37.44.0/22 -103.37.52.0/22 -103.37.56.0/22 -103.37.72.0/22 -103.37.100.0/22 -103.37.104.0/22 -103.37.124.0/22 -103.37.136.0/21 -103.37.144.0/20 -103.37.160.0/21 -103.37.172.0/22 -103.37.176.0/22 -103.37.188.0/22 -103.37.208.0/20 -103.37.248.0/21 -103.38.0.0/22 -103.38.32.0/22 -103.38.40.0/21 -103.38.56.0/22 -103.38.76.0/22 -103.38.84.0/22 -103.38.92.0/22 -103.38.96.0/22 -103.38.116.0/22 -103.38.132.0/22 -103.38.140.0/22 -103.38.220.0/22 -103.38.224.0/21 -103.38.232.0/22 -103.38.252.0/22 -103.39.16.0/22 -103.39.64.0/22 -103.39.88.0/22 -103.39.100.0/22 -103.39.104.0/21 -103.39.160.0/19 -103.39.200.0/21 -103.39.208.0/20 -103.39.224.0/21 -103.39.232.0/22 -103.40.12.0/22 -103.40.16.0/20 -103.40.32.0/20 -103.40.88.0/22 -103.40.100.0/22 -103.40.112.0/22 -103.40.192.0/22 -103.40.212.0/22 -103.40.220.0/22 -103.40.228.0/22 -103.40.232.0/21 -103.40.240.0/20 -103.41.0.0/22 -103.41.16.0/22 -103.41.52.0/22 -103.41.140.0/22 -103.41.148.0/22 -103.41.152.0/22 -103.41.160.0/21 -103.41.220.0/22 -103.41.224.0/21 -103.41.232.0/22 -103.42.8.0/22 -103.42.24.0/21 -103.42.32.0/22 -103.42.64.0/21 -103.42.76.0/22 -103.42.104.0/22 -103.42.180.0/22 -103.42.232.0/22 -103.43.16.0/22 -103.43.26.0/23 -103.43.84.0/22 -103.43.96.0/21 -103.43.104.0/22 -103.43.124.0/22 -103.43.184.0/22 -103.43.192.0/21 -103.43.208.0/22 -103.43.220.0/22 -103.43.224.0/22 -103.43.232.0/22 -103.43.240.0/22 -103.44.56.0/22 -103.44.80.0/22 -103.44.88.0/22 -103.44.120.0/21 -103.44.132.0/22 -103.44.144.0/22 -103.44.152.0/22 -103.44.168.0/22 -103.44.176.0/20 -103.44.192.0/20 -103.44.224.0/22 -103.44.236.0/22 -103.44.240.0/20 -103.45.0.0/18 -103.45.72.0/21 -103.45.80.0/20 -103.45.96.0/19 -103.45.128.0/18 -103.45.192.0/19 -103.45.224.0/22 -103.45.248.0/22 -103.46.0.0/22 -103.46.12.0/22 -103.46.16.0/20 -103.46.32.0/19 -103.46.64.0/18 -103.46.128.0/21 -103.46.136.0/22 -103.46.152.0/21 -103.46.160.0/20 -103.46.176.0/21 -103.46.244.0/22 -103.46.248.0/22 -103.47.4.0/22 -103.47.20.0/22 -103.47.36.0/22 -103.47.40.0/22 -103.47.48.0/22 -103.47.80.0/22 -103.47.96.0/22 -103.47.108.0/22 -103.47.116.0/22 -103.47.120.0/22 -103.47.136.0/21 -103.47.212.0/22 -103.48.20.0/22 -103.48.52.0/22 -103.48.92.0/22 -103.48.144.0/20 -103.48.202.0/23 -103.48.216.0/21 -103.48.224.0/20 -103.48.240.0/21 -103.49.12.0/22 -103.49.20.0/22 -103.49.72.0/21 -103.49.92.0/22 -103.49.96.0/22 -103.49.108.0/22 -103.49.128.0/22 -103.49.176.0/21 -103.49.196.0/22 -103.49.248.0/22 -103.50.36.0/22 -103.50.44.0/22 -103.50.48.0/20 -103.50.64.0/21 -103.50.72.0/22 -103.50.92.0/22 -103.50.108.0/22 -103.50.112.0/20 -103.50.132.0/22 -103.50.136.0/21 -103.50.172.0/22 -103.50.176.0/20 -103.50.192.0/21 -103.50.200.0/22 -103.50.220.0/22 -103.50.224.0/20 -103.50.240.0/21 -103.50.248.0/22 -103.52.40.0/22 -103.52.72.0/21 -103.52.80.0/21 -103.52.96.0/21 -103.52.104.0/22 -103.52.160.0/21 -103.52.172.0/22 -103.52.176.0/22 -103.52.184.0/22 -103.52.196.0/22 -103.53.4.0/22 -103.53.64.0/21 -103.53.92.0/22 -103.53.100.0/22 -103.53.124.0/22 -103.53.128.0/20 -103.53.144.0/22 -103.53.160.0/22 -103.53.180.0/22 -103.53.204.0/22 -103.53.208.0/21 -103.53.216.0/22 -103.53.236.0/22 -103.53.248.0/22 -103.54.8.0/22 -103.54.48.0/22 -103.54.60.0/22 -103.54.160.0/21 -103.54.212.0/22 -103.54.228.0/22 -103.54.240.0/22 -103.55.24.0/22 -103.55.80.0/22 -103.55.120.0/22 -103.55.152.0/22 -103.55.172.0/22 -103.55.204.0/22 -103.55.208.0/22 -103.55.228.0/22 -103.55.236.0/22 -103.55.240.0/22 -103.56.8.0/22 -103.56.16.0/21 -103.56.32.0/22 -103.56.52.0/22 -103.56.56.0/21 -103.56.72.0/21 -103.56.140.0/22 -103.56.152.0/22 -103.56.184.0/22 -103.56.200.0/22 -103.57.12.0/22 -103.57.52.0/22 -103.57.56.0/22 -103.57.76.0/22 -103.57.136.0/22 -103.57.196.0/22 -103.58.24.0/22 -103.58.182.0/23 -103.59.76.0/22 -103.59.100.0/22 -103.59.112.0/20 -103.59.128.0/22 -103.59.148.0/22 -103.59.164.0/22 -103.60.32.0/22 -103.60.44.0/22 -103.60.164.0/22 -103.60.228.0/22 -103.60.236.0/22 -103.61.60.0/22 -103.61.104.0/22 -103.61.140.0/22 -103.61.152.0/21 -103.61.160.0/22 -103.61.172.0/22 -103.61.176.0/22 -103.61.184.0/21 -103.62.24.0/22 -103.62.52.0/22 -103.62.72.0/21 -103.62.80.0/21 -103.62.88.0/22 -103.62.96.0/19 -103.62.128.0/21 -103.62.156.0/22 -103.62.160.0/19 -103.62.192.0/22 -103.62.204.0/22 -103.62.208.0/20 -103.62.224.0/22 -103.63.32.0/19 -103.63.64.0/20 -103.63.80.0/21 -103.63.88.0/22 -103.63.140.0/22 -103.63.144.0/22 -103.63.152.0/22 -103.63.160.0/20 -103.63.176.0/21 -103.63.184.0/22 -103.63.192.0/20 -103.63.208.0/22 -103.63.240.0/20 -103.64.0.0/21 -103.64.24.0/21 -103.64.32.0/19 -103.64.64.0/18 -103.64.140.0/22 -103.64.144.0/22 -103.64.152.0/21 -103.64.160.0/19 -103.64.192.0/18 -103.65.0.0/20 -103.65.16.0/22 -103.65.36.0/22 -103.65.40.0/22 -103.65.48.0/20 -103.65.64.0/19 -103.65.100.0/22 -103.65.104.0/21 -103.65.112.0/20 -103.65.128.0/21 -103.65.136.0/22 -103.65.144.0/20 -103.65.160.0/20 -103.66.32.0/22 -103.66.40.0/22 -103.66.92.0/22 -103.66.108.0/22 -103.66.200.0/22 -103.66.216.0/22 -103.66.240.0/20 -103.67.0.0/21 -103.67.8.0/22 -103.67.40.0/21 -103.67.48.0/20 -103.67.64.0/18 -103.67.128.0/20 -103.67.144.0/21 -103.67.172.0/22 -103.67.192.0/22 -103.67.212.0/22 -103.67.252.0/22 -103.68.64.0/22 -103.68.88.0/22 -103.68.100.0/22 -103.68.128.0/22 -103.68.192.0/22 -103.69.16.0/22 -103.69.116.0/22 -103.69.132.0/22 -103.69.152.0/22 -103.69.212.0/22 -103.70.8.0/22 -103.70.148.0/22 -103.70.184.0/22 -103.70.220.0/22 -103.70.224.0/22 -103.70.236.0/22 -103.70.252.0/22 -103.71.0.0/22 -103.71.32.0/22 -103.71.48.0/22 -103.71.68.0/22 -103.71.72.0/22 -103.71.80.0/21 -103.71.88.0/22 -103.71.120.0/21 -103.71.128.0/22 -103.71.144.0/22 -103.71.196.0/22 -103.71.200.0/22 -103.71.232.0/22 -103.72.12.0/22 -103.72.16.0/20 -103.72.32.0/20 -103.72.48.0/21 -103.72.112.0/20 -103.72.128.0/21 -103.72.144.0/21 -103.72.172.0/22 -103.72.180.0/22 -103.72.224.0/19 -103.73.0.0/19 -103.73.48.0/22 -103.73.88.0/22 -103.73.96.0/22 -103.73.116.0/22 -103.73.120.0/22 -103.73.128.0/20 -103.73.144.0/22 -103.73.168.0/22 -103.73.176.0/22 -103.73.204.0/22 -103.73.208.0/22 -103.73.240.0/21 -103.73.248.0/22 -103.74.24.0/21 -103.74.32.0/20 -103.74.48.0/22 -103.74.56.0/21 -103.74.80.0/22 -103.74.124.0/22 -103.74.148.0/22 -103.74.152.0/21 -103.74.204.0/22 -103.74.232.0/22 -103.75.16.0/22 -103.75.87.0/24 -103.75.88.0/21 -103.75.104.0/21 -103.75.112.0/22 -103.75.120.0/22 -103.75.128.0/22 -103.75.144.0/22 -103.75.152.0/22 -103.75.236.0/24 -103.76.60.0/22 -103.76.64.0/21 -103.76.72.0/22 -103.76.84.0/22 -103.76.92.0/22 -103.76.104.0/22 -103.76.216.0/21 -103.76.224.0/22 -103.77.28.0/22 -103.77.52.0/22 -103.77.56.0/22 -103.77.72.0/22 -103.77.88.0/21 -103.77.132.0/22 -103.77.148.0/22 -103.77.220.0/22 -103.78.56.0/21 -103.78.64.0/21 -103.78.124.0/22 -103.78.172.0/22 -103.78.176.0/22 -103.78.196.0/22 -103.78.228.0/22 -103.79.24.0/21 -103.79.36.0/22 -103.79.40.0/21 -103.79.52.0/22 -103.79.56.0/21 -103.79.64.0/21 -103.79.80.0/21 -103.79.120.0/22 -103.79.136.0/22 -103.79.188.0/22 -103.79.192.0/20 -103.79.208.0/21 -103.79.240.0/22 -103.80.24.0/21 -103.80.44.0/22 -103.80.72.0/22 -103.80.176.0/21 -103.80.184.0/22 -103.80.192.0/22 -103.80.200.0/22 -103.80.232.0/22 -103.81.4.0/22 -103.81.8.0/22 -103.81.16.0/21 -103.81.44.0/22 -103.81.48.0/22 -103.81.96.0/22 -103.81.120.0/22 -103.81.148.0/22 -103.81.164.0/22 -103.81.168.0/22 -103.81.183.0/24 -103.81.184.0/22 -103.81.200.0/22 -103.81.232.0/22 -103.82.52.0/22 -103.82.60.0/22 -103.82.68.0/22 -103.82.84.0/22 -103.82.104.0/22 -103.82.224.0/22 -103.82.236.0/22 -103.83.44.0/22 -103.83.52.0/22 -103.83.60.0/22 -103.83.64.0/22 -103.83.72.0/22 -103.83.112.0/22 -103.83.120.0/22 -103.83.132.0/22 -103.83.180.0/22 -103.84.0.0/22 -103.84.12.0/22 -103.84.16.0/20 -103.84.48.0/22 -103.84.56.0/22 -103.84.64.0/22 -103.84.72.0/22 -103.84.92.0/22 -103.84.108.0/22 -103.84.136.0/22 -103.85.20.0/22 -103.85.24.0/22 -103.85.44.0/22 -103.85.48.0/21 -103.85.56.0/22 -103.85.84.0/22 -103.85.136.0/22 -103.85.144.0/22 -103.85.164.0/22 -103.85.168.0/21 -103.85.176.0/22 -103.85.224.0/22 -103.86.28.0/22 -103.86.32.0/22 -103.86.44.0/22 -103.86.60.0/22 -103.86.68.0/22 -103.86.80.0/21 -103.86.88.0/22 -103.86.129.0/24 -103.86.204.0/22 -103.86.208.0/20 -103.86.224.0/19 -103.87.0.0/21 -103.87.20.0/22 -103.87.32.0/22 -103.87.72.0/22 -103.87.96.0/22 -103.87.132.0/22 -103.87.180.0/22 -103.87.224.0/22 -103.88.4.0/22 -103.88.8.0/21 -103.88.16.0/21 -103.88.32.0/21 -103.88.60.0/22 -103.88.64.0/22 -103.88.72.0/22 -103.88.96.0/21 -103.88.152.0/23 -103.88.164.0/22 -103.88.176.0/22 -103.88.184.0/21 -103.88.212.0/22 -103.89.28.0/22 -103.89.96.0/20 -103.89.112.0/21 -103.89.148.0/22 -103.89.172.0/22 -103.89.184.0/21 -103.89.192.0/19 -103.89.224.0/21 -103.90.52.0/22 -103.90.92.0/22 -103.90.100.0/22 -103.90.104.0/21 -103.90.112.0/20 -103.90.128.0/21 -103.90.152.0/22 -103.90.168.0/22 -103.90.173.0/24 -103.90.176.0/22 -103.90.188.0/22 -103.90.192.0/22 -103.91.36.0/22 -103.91.40.0/22 -103.91.108.0/22 -103.91.152.0/22 -103.91.176.0/22 -103.91.200.0/22 -103.91.208.0/21 -103.91.219.0/24 -103.91.236.0/22 -103.91.252.0/22 -103.92.0.0/20 -103.92.48.0/20 -103.92.64.0/20 -103.92.80.0/22 -103.92.86.0/24 -103.92.88.0/22 -103.92.108.0/22 -103.92.124.0/22 -103.92.128.0/24 -103.92.132.0/22 -103.92.156.0/22 -103.92.164.0/22 -103.92.168.0/21 -103.92.176.0/20 -103.92.192.0/22 -103.92.236.0/22 -103.92.240.0/20 -103.93.0.0/21 -103.93.28.0/22 -103.93.76.0/22 -103.93.84.0/22 -103.93.121.0/24 -103.93.152.0/22 -103.93.180.0/22 -103.93.204.0/22 -103.94.12.0/22 -103.94.20.0/22 -103.94.28.0/22 -103.94.32.0/20 -103.94.72.0/22 -103.94.88.0/22 -103.94.116.0/22 -103.94.160.0/22 -103.94.180.0/22 -103.94.200.0/22 -103.95.28.0/22 -103.95.52.0/22 -103.95.64.0/21 -103.95.88.0/21 -103.95.116.0/22 -103.95.128.0/22 -103.95.136.0/21 -103.95.144.0/22 -103.95.152.0/22 -103.95.207.0/24 -103.95.216.0/21 -103.95.224.0/22 -103.95.236.0/22 -103.95.240.0/20 -103.96.0.0/22 -103.96.8.0/22 -103.96.80.0/22 -103.96.124.0/22 -103.96.136.0/22 -103.96.140.0/24 -103.96.148.0/22 -103.96.152.0/21 -103.96.160.0/19 -103.96.192.0/20 -103.96.208.0/21 -103.96.216.0/22 -103.97.8.0/21 -103.97.16.0/20 -103.97.32.0/21 -103.97.40.0/22 -103.97.56.0/21 -103.97.64.0/21 -103.97.72.0/22 -103.97.80.0/22 -103.97.112.0/21 -103.97.128.0/22 -103.97.144.0/21 -103.97.188.0/22 -103.97.192.0/22 -103.97.224.0/22 -103.97.228.0/23 -103.98.28.0/23 -103.98.40.0/21 -103.98.48.0/22 -103.98.56.0/22 -103.98.80.0/22 -103.98.88.0/21 -103.98.96.0/21 -103.98.124.0/22 -103.98.136.0/21 -103.98.144.0/22 -103.98.164.0/22 -103.98.168.0/22 -103.98.180.0/22 -103.98.196.0/22 -103.98.216.0/21 -103.98.224.0/21 -103.98.232.0/22 -103.98.240.0/20 -103.99.40.0/23 -103.99.52.0/22 -103.99.56.0/21 -103.99.76.0/22 -103.99.104.0/22 -103.99.116.0/22 -103.99.120.0/22 -103.99.132.0/22 -103.99.136.0/21 -103.99.144.0/22 -103.99.152.0/22 -103.99.220.0/22 -103.99.232.0/21 -103.100.0.0/22 -103.100.32.0/22 -103.100.40.0/22 -103.100.48.0/20 -103.100.64.0/21 -103.100.88.0/22 -103.100.116.0/22 -103.100.140.0/22 -103.100.144.0/22 -103.100.236.0/22 -103.100.240.0/22 -103.100.248.0/21 -103.101.4.0/22 -103.101.8.0/21 -103.101.28.0/22 -103.101.60.0/22 -103.101.120.0/21 -103.101.144.0/21 -103.101.153.0/24 -103.101.180.0/22 -103.101.184.0/22 -103.102.76.0/22 -103.102.80.0/22 -103.102.163.0/24 -103.102.168.0/21 -103.102.180.0/22 -103.102.184.0/21 -103.102.192.0/21 -103.102.200.0/22 -103.102.208.0/21 -103.103.12.0/22 -103.103.16.0/22 -103.103.36.0/22 -103.103.68.0/22 -103.103.72.0/22 -103.103.176.0/22 -103.103.188.0/22 -103.103.200.0/21 -103.103.220.0/22 -103.103.224.0/21 -103.103.232.0/22 -103.103.248.0/21 -103.104.0.0/21 -103.104.36.0/22 -103.104.40.0/22 -103.104.64.0/22 -103.104.104.0/22 -103.104.152.0/22 -103.104.168.0/21 -103.104.188.0/22 -103.104.198.0/23 -103.104.252.0/22 -103.105.0.0/21 -103.105.12.0/22 -103.105.16.0/22 -103.105.23.0/24 -103.105.56.0/21 -103.105.116.0/22 -103.105.132.0/22 -103.105.180.0/22 -103.105.184.0/22 -103.105.200.0/21 -103.105.220.0/22 -103.106.36.0/22 -103.106.40.0/21 -103.106.60.0/22 -103.106.68.0/22 -103.106.96.0/22 -103.106.120.0/22 -103.106.128.0/21 -103.106.160.0/22 -103.106.188.0/22 -103.106.196.0/22 -103.106.202.0/23 -103.106.212.0/22 -103.106.244.0/22 -103.106.252.0/22 -103.107.0.0/22 -103.107.8.0/24 -103.107.28.0/22 -103.107.32.0/22 -103.107.44.0/22 -103.107.72.0/22 -103.107.108.0/22 -103.107.164.0/22 -103.107.168.0/22 -103.107.188.0/22 -103.107.192.0/22 -103.107.208.0/20 -103.108.52.0/22 -103.108.64.0/22 -103.108.160.0/21 -103.108.184.0/23 -103.108.188.0/23 -103.108.192.0/21 -103.108.208.0/21 -103.108.224.0/22 -103.108.244.0/22 -103.108.251.0/24 -103.109.20.0/22 -103.109.48.0/22 -103.109.88.0/22 -103.109.106.0/23 -103.109.248.0/22 -103.110.32.0/22 -103.110.80.0/23 -103.110.92.0/22 -103.110.100.0/22 -103.110.116.0/22 -103.110.127.0/24 -103.110.128.0/23 -103.110.131.0/24 -103.110.132.0/22 -103.110.136.0/22 -103.110.152.0/21 -103.110.188.0/22 -103.110.204.0/22 -103.111.38.0/23 -103.111.64.0/22 -103.111.172.0/22 -103.111.252.0/22 -103.112.28.0/22 -103.112.68.0/22 -103.112.72.0/22 -103.112.88.0/21 -103.112.96.0/22 -103.112.108.0/22 -103.112.112.0/21 -103.112.140.0/22 -103.112.172.0/22 -103.112.184.0/22 -103.112.208.0/22 -103.113.4.0/22 -103.113.92.0/22 -103.113.144.0/22 -103.113.220.0/22 -103.113.232.0/21 -103.114.4.0/22 -103.114.28.0/22 -103.114.68.0/22 -103.114.72.0/22 -103.114.100.0/22 -103.114.132.0/22 -103.114.148.0/22 -103.114.156.0/22 -103.114.176.0/22 -103.114.212.0/22 -103.114.236.0/22 -103.114.240.0/22 -103.115.16.0/22 -103.115.40.0/21 -103.115.48.0/20 -103.115.64.0/21 -103.115.92.0/22 -103.115.120.0/22 -103.115.148.0/22 -103.115.204.0/23 -103.115.248.0/22 -103.116.20.0/22 -103.116.40.0/22 -103.116.64.0/22 -103.116.72.0/21 -103.116.92.0/22 -103.116.120.0/22 -103.116.128.0/22 -103.116.132.0/23 -103.116.148.0/22 -103.116.184.0/22 -103.116.206.0/23 -103.116.220.0/22 -103.116.224.0/21 -103.117.16.0/22 -103.117.72.0/22 -103.117.88.0/22 -103.117.132.0/22 -103.117.136.0/22 -103.117.188.0/22 -103.117.220.0/22 -103.118.19.0/24 -103.118.36.0/22 -103.118.52.0/22 -103.118.56.0/21 -103.118.64.0/21 -103.118.72.0/22 -103.118.88.0/22 -103.118.173.0/24 -103.118.192.0/19 -103.118.240.0/20 -103.119.0.0/22 -103.119.12.0/22 -103.119.16.0/22 -103.119.28.0/22 -103.119.44.0/22 -103.119.104.0/22 -103.119.115.0/24 -103.119.156.0/22 -103.119.180.0/22 -103.192.0.0/19 -103.192.48.0/21 -103.192.56.0/22 -103.192.84.0/22 -103.192.88.0/21 -103.192.96.0/20 -103.192.112.0/22 -103.192.128.0/20 -103.192.144.0/22 -103.192.164.0/22 -103.192.188.0/22 -103.192.208.0/21 -103.192.216.0/22 -103.192.252.0/22 -103.193.40.0/21 -103.193.120.0/21 -103.193.140.0/22 -103.193.144.0/21 -103.193.160.0/22 -103.193.188.0/22 -103.193.192.0/22 -103.193.212.0/22 -103.193.216.0/21 -103.193.224.0/20 -103.193.240.0/22 -103.194.16.0/22 -103.194.230.0/23 -103.195.104.0/22 -103.195.112.0/22 -103.195.136.0/22 -103.195.148.0/22 -103.195.152.0/22 -103.195.160.0/22 -103.195.192.0/22 -103.196.60.0/22 -103.196.64.0/22 -103.196.72.0/22 -103.196.88.0/21 -103.196.96.0/22 -103.196.168.0/22 -103.196.185.0/24 -103.196.186.0/23 -103.196.204.0/22 -103.197.180.0/22 -103.197.228.0/22 -103.197.253.0/24 -103.197.254.0/23 -103.198.20.0/22 -103.198.60.0/22 -103.198.64.0/22 -103.198.72.0/22 -103.198.124.0/22 -103.198.156.0/22 -103.198.180.0/22 -103.198.196.0/22 -103.198.200.0/22 -103.198.216.0/21 -103.198.224.0/20 -103.198.240.0/21 -103.199.164.0/22 -103.199.196.0/22 -103.199.228.0/22 -103.199.248.0/21 -103.200.28.0/22 -103.200.32.0/22 -103.200.52.0/22 -103.200.64.0/21 -103.200.136.0/21 -103.200.144.0/20 -103.200.160.0/19 -103.200.192.0/22 -103.200.220.0/22 -103.200.224.0/19 -103.201.0.0/20 -103.201.16.0/21 -103.201.28.0/22 -103.201.32.0/19 -103.201.64.0/22 -103.201.76.0/22 -103.201.80.0/20 -103.201.96.0/20 -103.201.112.0/21 -103.201.120.0/22 -103.201.152.0/21 -103.201.160.0/19 -103.201.192.0/18 -103.202.0.0/19 -103.202.32.0/20 -103.202.56.0/21 -103.202.64.0/18 -103.202.128.0/20 -103.202.144.0/22 -103.202.152.0/21 -103.202.160.0/19 -103.202.192.0/20 -103.202.212.0/22 -103.202.228.0/22 -103.202.236.0/22 -103.202.240.0/20 -103.203.0.0/19 -103.203.32.0/22 -103.203.52.0/22 -103.203.56.0/22 -103.203.96.0/19 -103.203.128.0/22 -103.203.140.0/22 -103.203.164.0/22 -103.203.168.0/22 -103.203.192.0/22 -103.203.200.0/22 -103.203.212.0/22 -103.203.216.0/22 -103.204.24.0/22 -103.204.72.0/22 -103.204.88.0/22 -103.204.112.0/22 -103.204.136.0/21 -103.204.144.0/21 -103.204.152.0/22 -103.204.196.0/22 -103.204.232.0/21 -103.205.4.0/22 -103.205.8.0/22 -103.205.40.0/21 -103.205.52.0/22 -103.205.108.0/22 -103.205.116.0/22 -103.205.120.0/22 -103.205.136.0/22 -103.205.162.0/24 -103.205.188.0/22 -103.205.192.0/21 -103.205.200.0/22 -103.205.236.0/22 -103.205.248.0/21 -103.206.0.0/22 -103.206.44.0/22 -103.206.108.0/22 -103.206.148.0/22 -103.207.48.0/22 -103.207.104.0/22 -103.207.164.0/22 -103.207.184.0/21 -103.207.192.0/20 -103.207.208.0/21 -103.207.220.0/22 -103.207.228.0/22 -103.207.232.0/22 -103.208.12.0/22 -103.208.16.0/22 -103.208.28.0/22 -103.208.40.0/21 -103.208.48.0/22 -103.208.148.0/22 -103.209.112.0/22 -103.209.136.0/22 -103.209.200.0/22 -103.209.208.0/22 -103.209.216.0/22 -103.210.0.0/22 -103.210.20.0/22 -103.210.96.0/22 -103.210.156.0/22 -103.210.160.0/19 -103.210.216.0/22 -103.211.44.0/22 -103.211.96.0/21 -103.211.156.0/22 -103.211.164.0/22 -103.211.168.0/22 -103.211.192.0/22 -103.211.220.0/22 -103.211.224.0/22 -103.211.248.0/22 -103.212.0.0/20 -103.212.32.0/22 -103.212.44.0/22 -103.212.48.0/22 -103.212.84.0/22 -103.212.100.0/22 -103.212.104.0/21 -103.212.148.0/22 -103.212.164.0/22 -103.212.196.0/22 -103.212.200.0/22 -103.212.228.0/22 -103.212.252.0/22 -103.213.40.0/21 -103.213.48.0/20 -103.213.64.0/19 -103.213.96.0/22 -103.213.132.0/22 -103.213.136.0/21 -103.213.144.0/20 -103.213.160.0/19 -103.213.248.0/21 -103.214.32.0/22 -103.214.48.0/22 -103.214.84.0/22 -103.214.168.0/22 -103.214.212.0/22 -103.214.240.0/21 -103.215.28.0/22 -103.215.32.0/21 -103.215.44.0/22 -103.215.48.0/22 -103.215.100.0/22 -103.215.104.0/21 -103.215.116.0/22 -103.215.120.0/22 -103.215.140.0/22 -103.215.184.0/22 -103.215.228.0/22 -103.216.4.0/22 -103.216.8.0/21 -103.216.16.0/20 -103.216.32.0/20 -103.216.64.0/22 -103.216.108.0/22 -103.216.136.0/22 -103.216.152.0/22 -103.216.224.0/21 -103.216.240.0/20 -103.217.0.0/18 -103.217.168.0/22 -103.217.180.0/22 -103.217.184.0/21 -103.217.192.0/20 -103.218.0.0/22 -103.218.8.0/21 -103.218.16.0/21 -103.218.28.0/22 -103.218.32.0/19 -103.218.64.0/19 -103.218.184.0/22 -103.218.192.0/20 -103.218.208.0/21 -103.218.216.0/22 -103.219.24.0/21 -103.219.32.0/21 -103.219.64.0/22 -103.219.84.0/22 -103.219.88.0/21 -103.219.96.0/21 -103.219.176.0/22 -103.219.184.0/22 -103.220.48.0/20 -103.220.64.0/22 -103.220.92.0/22 -103.220.96.0/20 -103.220.116.0/22 -103.220.120.0/21 -103.220.128.0/20 -103.220.144.0/21 -103.220.152.0/22 -103.220.160.0/19 -103.220.192.0/21 -103.220.200.0/22 -103.220.240.0/20 -103.221.0.0/19 -103.221.32.0/20 -103.221.48.0/22 -103.221.88.0/21 -103.221.96.0/19 -103.221.128.0/18 -103.221.192.0/20 -103.222.0.0/20 -103.222.16.0/22 -103.222.24.0/21 -103.222.32.0/19 -103.222.64.0/18 -103.222.128.0/18 -103.222.192.0/19 -103.222.224.0/21 -103.222.232.0/22 -103.222.240.0/21 -103.223.16.0/20 -103.223.32.0/19 -103.223.64.0/18 -103.223.128.0/21 -103.223.140.0/22 -103.223.144.0/20 -103.223.160.0/20 -103.223.176.0/21 -103.223.188.0/22 -103.223.192.0/18 -103.224.0.0/22 -103.224.40.0/21 -103.224.60.0/22 -103.224.80.0/22 -103.224.220.0/22 -103.224.224.0/21 -103.224.232.0/22 -103.225.84.0/22 -103.226.16.0/22 -103.226.40.0/22 -103.226.56.0/21 -103.226.80.0/22 -103.226.116.0/22 -103.226.132.0/22 -103.226.156.0/22 -103.226.180.0/22 -103.226.196.0/22 -103.227.48.0/22 -103.227.72.0/21 -103.227.80.0/22 -103.227.100.0/22 -103.227.120.0/22 -103.227.132.0/22 -103.227.136.0/22 -103.227.196.0/22 -103.227.204.0/22 -103.227.212.0/22 -103.227.228.0/22 -103.228.12.0/22 -103.228.28.0/22 -103.228.68.0/22 -103.228.88.0/22 -103.228.128.0/22 -103.228.136.0/22 -103.228.160.0/22 -103.228.176.0/22 -103.228.204.0/22 -103.228.208.0/22 -103.228.228.0/22 -103.228.232.0/22 -103.229.20.0/22 -103.229.60.0/22 -103.229.136.0/22 -103.229.148.0/22 -103.229.172.0/22 -103.229.212.0/22 -103.229.216.0/21 -103.229.228.0/22 -103.229.236.0/22 -103.229.240.0/22 -103.230.0.0/22 -103.230.28.0/22 -103.230.40.0/21 -103.230.96.0/22 -103.230.196.0/22 -103.230.200.0/21 -103.230.212.0/22 -103.230.236.0/22 -103.231.16.0/21 -103.231.64.0/21 -103.231.144.0/22 -103.231.180.0/22 -103.231.184.0/22 -103.231.244.0/22 -103.232.4.0/22 -103.232.144.0/22 -103.232.188.0/22 -103.232.212.0/22 -103.233.4.0/22 -103.233.44.0/22 -103.233.52.0/22 -103.233.104.0/22 -103.233.128.0/22 -103.233.136.0/22 -103.233.228.0/22 -103.234.0.0/22 -103.234.20.0/22 -103.234.56.0/22 -103.234.124.0/22 -103.234.128.0/22 -103.234.172.0/22 -103.234.180.0/22 -103.234.244.0/22 -103.235.16.0/22 -103.235.48.0/22 -103.235.56.0/21 -103.235.80.0/21 -103.235.128.0/20 -103.235.144.0/21 -103.235.184.0/22 -103.235.192.0/22 -103.235.200.0/22 -103.235.220.0/22 -103.235.224.0/19 -103.236.0.0/18 -103.236.64.0/19 -103.236.96.0/22 -103.236.120.0/22 -103.236.184.0/22 -103.236.220.0/22 -103.236.232.0/22 -103.236.240.0/20 -103.237.0.0/20 -103.237.24.0/21 -103.237.68.0/22 -103.237.88.0/22 -103.237.152.0/22 -103.237.176.0/20 -103.237.192.0/18 -103.238.0.0/21 -103.238.16.0/20 -103.238.32.0/20 -103.238.48.0/21 -103.238.56.0/22 -103.238.88.0/21 -103.238.96.0/22 -103.238.132.0/22 -103.238.140.0/22 -103.238.144.0/22 -103.238.160.0/19 -103.238.196.0/22 -103.238.204.0/22 -103.238.252.0/22 -103.239.0.0/22 -103.239.44.0/22 -103.239.68.0/22 -103.239.96.0/22 -103.239.152.0/21 -103.239.176.0/21 -103.239.184.0/22 -103.239.192.0/21 -103.239.204.0/22 -103.239.208.0/22 -103.239.224.0/22 -103.239.244.0/22 -103.240.16.0/22 -103.240.36.0/22 -103.240.72.0/22 -103.240.84.0/22 -103.240.124.0/22 -103.240.156.0/22 -103.240.172.0/22 -103.240.188.0/22 -103.240.244.0/22 -103.241.12.0/22 -103.241.72.0/22 -103.241.92.0/22 -103.241.96.0/22 -103.241.160.0/22 -103.241.184.0/21 -103.241.220.0/22 -103.242.64.0/22 -103.242.128.0/21 -103.242.160.0/22 -103.242.168.0/21 -103.242.176.0/22 -103.242.200.0/22 -103.242.212.0/22 -103.242.220.0/22 -103.242.240.0/22 -103.243.136.0/22 -103.243.252.0/22 -103.244.16.0/22 -103.244.58.0/23 -103.244.60.0/22 -103.244.64.0/20 -103.244.80.0/21 -103.244.116.0/22 -103.244.164.0/22 -103.244.232.0/22 -103.244.252.0/22 -103.245.23.0/24 -103.245.52.0/22 -103.245.60.0/22 -103.245.80.0/22 -103.245.124.0/22 -103.245.128.0/22 -103.246.8.0/21 -103.246.120.0/21 -103.246.132.0/22 -103.246.152.0/21 -103.247.168.0/21 -103.247.176.0/22 -103.247.200.0/22 -103.247.212.0/22 -103.248.0.0/23 -103.248.64.0/22 -103.248.100.0/22 -103.248.124.0/22 -103.248.152.0/22 -103.248.168.0/22 -103.248.192.0/22 -103.248.212.0/22 -103.248.220.0/22 -103.248.224.0/21 -103.249.8.0/21 -103.249.52.0/22 -103.249.104.0/22 -103.249.128.0/22 -103.249.136.0/22 -103.249.144.0/22 -103.249.164.0/22 -103.249.168.0/21 -103.249.176.0/22 -103.249.188.0/22 -103.249.192.0/22 -103.249.244.0/22 -103.249.252.0/22 -103.250.32.0/22 -103.250.104.0/22 -103.250.124.0/22 -103.250.180.0/22 -103.250.192.0/22 -103.250.216.0/22 -103.250.224.0/22 -103.250.236.0/22 -103.250.248.0/21 -103.251.32.0/21 -103.251.84.0/22 -103.251.96.0/22 -103.251.124.0/22 -103.251.128.0/22 -103.251.160.0/22 -103.251.192.0/22 -103.251.204.0/22 -103.251.236.0/22 -103.251.240.0/22 -103.252.28.0/22 -103.252.36.0/22 -103.252.64.0/22 -103.252.96.0/22 -103.252.104.0/22 -103.252.172.0/22 -103.252.204.0/22 -103.252.208.0/22 -103.252.232.0/22 -103.252.248.0/22 -103.253.4.0/22 -103.253.60.0/22 -103.253.204.0/22 -103.253.220.0/22 -103.253.224.0/22 -103.253.232.0/22 -103.254.8.0/22 -103.254.20.0/22 -103.254.64.0/20 -103.254.112.0/22 -103.254.176.0/22 -103.254.188.0/22 -103.254.196.0/24 -103.254.220.0/22 -103.255.56.0/22 -103.255.68.0/22 -103.255.88.0/21 -103.255.136.0/21 -103.255.184.0/22 -103.255.200.0/22 -103.255.208.0/21 -103.255.228.0/22 -104.166.103.0/24 -104.222.196.0/24 -106.0.0.0/24 -106.0.2.0/23 -106.0.4.0/22 -106.0.8.0/21 -106.0.16.0/20 -106.0.44.0/22 -106.0.64.0/18 -106.2.0.0/15 -106.4.0.0/14 -106.8.0.0/15 -106.11.0.0/16 -106.12.0.0/14 -106.16.0.0/12 -106.32.0.0/12 -106.48.0.0/15 -106.50.0.0/16 -106.52.0.0/14 -106.56.0.0/13 -106.74.0.0/15 -106.80.0.0/12 -106.108.0.0/14 -106.112.0.0/12 -106.224.0.0/12 -107.153.91.0/24 -107.153.92.0/23 -109.71.4.0/24 -109.244.0.0/16 -110.6.0.0/15 -110.16.0.0/14 -110.34.40.0/21 -110.40.0.0/14 -110.44.12.0/22 -110.44.144.0/20 -110.48.0.0/16 -110.51.0.0/16 -110.52.0.0/15 -110.56.0.0/13 -110.64.0.0/15 -110.72.0.0/15 -110.75.0.0/16 -110.76.0.0/18 -110.76.132.0/22 -110.76.156.0/22 -110.76.184.0/22 -110.76.192.0/18 -110.77.0.0/17 -110.80.0.0/13 -110.88.0.0/14 -110.92.68.0/22 -110.93.32.0/19 -110.94.0.0/15 -110.96.0.0/11 -110.152.0.0/14 -110.156.0.0/15 -110.165.32.0/19 -110.166.0.0/15 -110.172.192.0/18 -110.173.0.0/19 -110.173.32.0/20 -110.173.64.0/18 -110.173.192.0/19 -110.176.0.0/12 -110.192.0.0/11 -110.228.0.0/14 -110.232.32.0/19 -110.236.0.0/15 -110.240.0.0/12 -111.0.0.0/10 -111.66.0.0/16 -111.67.192.0/20 -111.68.64.0/19 -111.72.0.0/13 -111.85.0.0/16 -111.91.192.0/19 -111.92.248.0/21 -111.112.0.0/14 -111.116.0.0/15 -111.118.200.0/21 -111.119.64.0/18 -111.119.128.0/19 -111.120.0.0/14 -111.124.0.0/16 -111.126.0.0/15 -111.128.0.0/11 -111.160.0.0/13 -111.170.0.0/16 -111.172.0.0/14 -111.176.0.0/13 -111.186.0.0/15 -111.192.0.0/12 -111.208.0.0/13 -111.221.28.0/24 -111.221.128.0/17 -111.222.0.0/16 -111.223.4.0/22 -111.223.8.0/21 -111.223.16.0/22 -111.223.240.0/22 -111.223.248.0/22 -111.224.0.0/13 -111.235.96.0/19 -111.235.156.0/22 -111.235.160.0/19 -112.0.0.0/10 -112.64.0.0/14 -112.73.0.0/16 -112.74.0.0/15 -112.80.0.0/12 -112.96.0.0/13 -112.109.128.0/17 -112.111.0.0/16 -112.112.0.0/14 -112.116.0.0/15 -112.122.0.0/15 -112.124.0.0/14 -112.128.0.0/14 -112.132.0.0/16 -112.137.48.0/21 -112.192.0.0/14 -112.224.0.0/11 -113.0.0.0/13 -113.8.0.0/15 -113.11.192.0/19 -113.12.0.0/14 -113.16.0.0/15 -113.18.0.0/16 -113.21.232.0/21 -113.24.0.0/14 -113.31.0.0/16 -113.44.0.0/14 -113.48.0.0/14 -113.52.160.0/19 -113.52.228.0/22 -113.54.0.0/15 -113.56.0.0/15 -113.58.0.0/16 -113.59.0.0/17 -113.59.224.0/22 -113.62.0.0/15 -113.64.0.0/10 -113.128.0.0/15 -113.130.96.0/20 -113.130.112.0/21 -113.132.0.0/14 -113.136.0.0/13 -113.194.0.0/15 -113.197.100.0/22 -113.200.0.0/15 -113.202.0.0/16 -113.204.0.0/14 -113.208.96.0/19 -113.208.128.0/17 -113.209.0.0/16 -113.212.0.0/18 -113.212.100.0/22 -113.212.184.0/21 -113.213.0.0/17 -113.214.0.0/15 -113.218.0.0/15 -113.220.0.0/14 -113.224.0.0/12 -113.240.0.0/13 -113.248.0.0/14 -114.28.0.0/16 -114.31.64.0/21 -114.54.0.0/15 -114.60.0.0/14 -114.64.0.0/14 -114.68.0.0/16 -114.79.64.0/18 -114.80.0.0/12 -114.96.0.0/13 -114.104.0.0/14 -114.110.0.0/20 -114.110.64.0/18 -114.111.0.0/19 -114.111.160.0/19 -114.112.0.0/13 -114.132.0.0/16 -114.135.0.0/16 -114.138.0.0/15 -114.141.64.0/21 -114.141.80.0/21 -114.141.128.0/18 -114.196.0.0/15 -114.198.248.0/21 -114.208.0.0/12 -114.224.0.0/11 -115.24.0.0/14 -115.28.0.0/15 -115.31.64.0/20 -115.32.0.0/14 -115.42.56.0/22 -115.44.0.0/14 -115.48.0.0/12 -115.69.64.0/20 -115.84.0.0/18 -115.84.192.0/19 -115.85.192.0/18 -115.100.0.0/14 -115.104.0.0/14 -115.120.0.0/14 -115.124.16.0/20 -115.148.0.0/14 -115.152.0.0/13 -115.166.64.0/19 -115.168.0.0/13 -115.180.0.0/14 -115.187.0.0/20 -115.190.0.0/15 -115.192.0.0/11 -115.224.0.0/12 -116.0.8.0/21 -116.0.24.0/21 -116.1.0.0/16 -116.2.0.0/15 -116.4.0.0/14 -116.8.0.0/14 -116.13.0.0/16 -116.16.0.0/12 -116.50.0.0/20 -116.52.0.0/14 -116.56.0.0/15 -116.58.128.0/20 -116.58.208.0/20 -116.60.0.0/14 -116.66.0.0/17 -116.66.176.0/22 -116.68.136.0/21 -116.68.176.0/21 -116.69.0.0/16 -116.70.0.0/17 -116.76.0.0/14 -116.85.0.0/16 -116.89.144.0/20 -116.89.240.0/22 -116.90.80.0/20 -116.90.184.0/21 -116.95.0.0/16 -116.112.0.0/14 -116.116.0.0/15 -116.128.0.0/10 -116.192.0.0/16 -116.193.16.0/20 -116.193.32.0/19 -116.193.152.0/22 -116.193.164.0/22 -116.193.176.0/21 -116.194.0.0/15 -116.196.0.0/16 -116.197.160.0/21 -116.197.180.0/23 -116.198.0.0/16 -116.199.0.0/17 -116.199.128.0/19 -116.204.0.0/15 -116.206.92.0/22 -116.206.100.0/22 -116.206.176.0/22 -116.207.0.0/16 -116.208.0.0/14 -116.212.160.0/20 -116.213.44.0/22 -116.213.64.0/18 -116.213.128.0/17 -116.214.32.0/19 -116.214.64.0/20 -116.214.128.0/17 -116.215.0.0/16 -116.216.0.0/14 -116.224.0.0/12 -116.242.0.0/15 -116.244.0.0/14 -116.248.0.0/15 -116.251.64.0/18 -116.252.0.0/15 -116.254.104.0/21 -116.254.128.0/17 -116.255.128.0/17 -117.8.0.0/13 -117.21.0.0/16 -117.22.0.0/15 -117.24.0.0/13 -117.32.0.0/13 -117.40.0.0/14 -117.44.0.0/15 -117.48.0.0/14 -117.53.48.0/20 -117.53.176.0/20 -117.57.0.0/16 -117.58.0.0/17 -117.59.0.0/16 -117.60.0.0/14 -117.64.0.0/13 -117.72.0.0/15 -117.74.64.0/19 -117.74.128.0/17 -117.75.0.0/16 -117.76.0.0/14 -117.80.0.0/12 -117.100.0.0/15 -117.103.16.0/20 -117.103.40.0/21 -117.103.72.0/21 -117.103.128.0/20 -117.104.168.0/21 -117.106.0.0/15 -117.112.0.0/13 -117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 -117.121.128.0/18 -117.121.192.0/21 -117.122.128.0/17 -117.124.0.0/14 -117.128.0.0/10 -118.24.0.0/15 -118.26.0.0/16 -118.28.0.0/14 -118.64.0.0/15 -118.66.0.0/16 -118.67.112.0/20 -118.72.0.0/13 -118.80.0.0/15 -118.84.0.0/15 -118.88.32.0/19 -118.88.64.0/18 -118.88.128.0/17 -118.89.0.0/16 -118.91.240.0/20 -118.102.16.0/20 -118.102.32.0/21 -118.103.164.0/22 -118.103.168.0/21 -118.103.176.0/22 -118.103.245.0/24 -118.103.246.0/23 -118.107.180.0/22 -118.112.0.0/13 -118.120.0.0/14 -118.124.0.0/15 -118.126.0.0/16 -118.127.128.0/19 -118.132.0.0/14 -118.144.0.0/14 -118.178.0.0/16 -118.180.0.0/14 -118.184.0.0/16 -118.186.0.0/15 -118.188.0.0/16 -118.190.0.0/15 -118.192.0.0/16 -118.193.0.0/20 -118.193.32.0/19 -118.193.64.0/20 -118.193.96.0/19 -118.193.128.0/17 -118.194.0.0/15 -118.196.0.0/14 -118.202.0.0/15 -118.204.0.0/14 -118.212.0.0/15 -118.215.192.0/18 -118.224.0.0/14 -118.228.0.0/15 -118.230.0.0/16 -118.239.0.0/16 -118.242.0.0/16 -118.244.0.0/14 -118.248.0.0/13 -119.0.0.0/15 -119.2.0.0/19 -119.2.128.0/17 -119.3.0.0/16 -119.4.0.0/14 -119.8.0.0/16 -119.10.0.0/17 -119.15.136.0/21 -119.16.0.0/16 -119.18.192.0/20 -119.18.208.0/21 -119.18.224.0/19 -119.19.0.0/16 -119.20.0.0/14 -119.27.64.0/18 -119.27.128.0/17 -119.28.0.0/15 -119.30.48.0/20 -119.31.192.0/19 -119.32.0.0/13 -119.40.0.0/18 -119.40.64.0/20 -119.40.128.0/17 -119.41.0.0/16 -119.42.0.0/19 -119.42.52.0/22 -119.42.128.0/20 -119.42.224.0/19 -119.44.0.0/15 -119.48.0.0/13 -119.57.0.0/16 -119.58.0.0/16 -119.59.128.0/17 -119.60.0.0/15 -119.62.0.0/16 -119.63.32.0/19 -119.75.208.0/20 -119.78.0.0/15 -119.80.0.0/16 -119.82.208.0/20 -119.84.0.0/14 -119.88.0.0/14 -119.96.0.0/13 -119.108.0.0/15 -119.112.0.0/12 -119.128.0.0/12 -119.144.0.0/14 -119.148.160.0/19 -119.151.192.0/18 -119.160.200.0/21 -119.161.120.0/21 -119.161.128.0/17 -119.162.0.0/15 -119.164.0.0/14 -119.176.0.0/12 -119.232.0.0/15 -119.235.128.0/18 -119.248.0.0/14 -119.252.96.0/21 -119.252.240.0/20 -119.253.0.0/16 -119.254.0.0/15 -120.0.0.0/12 -120.24.0.0/14 -120.30.0.0/15 -120.32.0.0/12 -120.48.0.0/15 -120.52.0.0/14 -120.64.0.0/13 -120.72.32.0/19 -120.72.128.0/17 -120.76.0.0/14 -120.80.0.0/13 -120.88.8.0/21 -120.90.0.0/15 -120.92.0.0/16 -120.94.0.0/15 -120.128.0.0/13 -120.136.16.0/21 -120.136.128.0/18 -120.137.0.0/17 -120.143.128.0/19 -120.192.0.0/10 -121.0.8.0/21 -121.0.16.0/20 -121.4.0.0/15 -121.8.0.0/13 -121.16.0.0/12 -121.32.0.0/13 -121.40.0.0/14 -121.46.0.0/18 -121.46.76.0/22 -121.46.128.0/17 -121.47.0.0/16 -121.48.0.0/15 -121.50.8.0/21 -121.51.0.0/16 -121.52.160.0/19 -121.52.208.0/20 -121.52.224.0/19 -121.54.176.0/21 -121.54.188.0/22 -121.55.0.0/18 -121.56.0.0/15 -121.58.0.0/17 -121.58.136.0/21 -121.58.144.0/20 -121.58.160.0/21 -121.59.0.0/16 -121.60.0.0/14 -121.68.0.0/14 -121.76.0.0/15 -121.79.128.0/18 -121.89.0.0/16 -121.100.128.0/17 -121.101.0.0/18 -121.101.208.0/20 -121.192.0.0/13 -121.200.192.0/21 -121.201.0.0/16 -121.204.0.0/14 -121.224.0.0/12 -121.248.0.0/14 -121.255.0.0/16 -122.0.64.0/18 -122.0.128.0/17 -122.4.0.0/14 -122.8.0.0/15 -122.10.128.0/17 -122.11.0.0/17 -122.12.0.0/15 -122.14.0.0/16 -122.48.0.0/16 -122.49.0.0/18 -122.51.0.0/16 -122.64.0.0/11 -122.96.0.0/15 -122.98.144.0/20 -122.98.160.0/21 -122.98.172.0/22 -122.98.176.0/20 -122.98.192.0/21 -122.98.232.0/21 -122.98.240.0/20 -122.102.0.0/20 -122.102.64.0/19 -122.112.0.0/14 -122.119.0.0/16 -122.128.100.0/22 -122.128.120.0/21 -122.136.0.0/13 -122.144.128.0/17 -122.152.192.0/18 -122.156.0.0/14 -122.188.0.0/14 -122.192.0.0/14 -122.198.0.0/16 -122.200.40.0/21 -122.200.64.0/18 -122.201.48.0/20 -122.204.0.0/14 -122.224.0.0/12 -122.240.0.0/13 -122.248.24.0/21 -122.248.48.0/20 -122.255.64.0/21 -123.0.128.0/18 -123.4.0.0/14 -123.8.0.0/13 -123.49.128.0/17 -123.50.160.0/19 -123.52.0.0/14 -123.56.0.0/14 -123.60.0.0/15 -123.62.0.0/16 -123.64.0.0/11 -123.96.0.0/15 -123.98.0.0/17 -123.99.128.0/17 -123.100.0.0/19 -123.100.232.0/24 -123.101.0.0/16 -123.103.0.0/17 -123.108.128.0/20 -123.108.208.0/20 -123.112.0.0/12 -123.128.0.0/13 -123.136.80.0/20 -123.137.0.0/16 -123.138.0.0/15 -123.144.0.0/12 -123.160.0.0/12 -123.176.60.0/22 -123.176.80.0/20 -123.177.0.0/16 -123.178.0.0/15 -123.180.0.0/14 -123.184.0.0/13 -123.196.0.0/15 -123.199.128.0/17 -123.206.0.0/15 -123.232.0.0/14 -123.242.0.0/17 -123.242.192.0/21 -123.244.0.0/14 -123.249.0.0/16 -123.253.0.0/16 -123.254.96.0/21 -124.6.64.0/18 -124.14.0.0/15 -124.16.0.0/15 -124.20.0.0/14 -124.28.192.0/18 -124.29.0.0/17 -124.31.0.0/16 -124.40.112.0/20 -124.40.128.0/18 -124.40.192.0/19 -124.40.240.0/22 -124.42.0.0/16 -124.47.0.0/18 -124.64.0.0/15 -124.66.0.0/17 -124.67.0.0/16 -124.68.0.0/14 -124.72.0.0/13 -124.88.0.0/13 -124.108.8.0/21 -124.108.40.0/21 -124.109.96.0/21 -124.112.0.0/13 -124.126.0.0/15 -124.128.0.0/13 -124.147.128.0/17 -124.150.137.0/24 -124.151.0.0/16 -124.152.0.0/16 -124.156.0.0/16 -124.160.0.0/13 -124.172.0.0/14 -124.192.0.0/15 -124.196.0.0/16 -124.200.0.0/13 -124.220.0.0/14 -124.224.0.0/12 -124.240.0.0/17 -124.240.128.0/18 -124.242.0.0/16 -124.243.192.0/18 -124.248.0.0/17 -124.249.0.0/16 -124.250.0.0/15 -124.254.0.0/18 -125.31.192.0/18 -125.32.0.0/12 -125.58.128.0/17 -125.61.128.0/17 -125.62.0.0/18 -125.64.0.0/11 -125.96.0.0/15 -125.98.0.0/16 -125.104.0.0/13 -125.112.0.0/12 -125.169.0.0/16 -125.171.0.0/16 -125.208.0.0/18 -125.210.0.0/15 -125.213.0.0/17 -125.214.96.0/19 -125.215.0.0/18 -125.216.0.0/13 -125.254.128.0/17 -128.108.0.0/16 -129.28.0.0/16 -129.204.0.0/16 -129.211.0.0/16 -129.223.254.0/24 -129.226.0.0/16 -130.214.218.0/23 -131.228.96.0/24 -132.232.0.0/16 -132.237.134.0/24 -132.237.150.0/24 -134.175.0.0/16 -135.159.208.0/20 -135.244.80.0/20 -137.59.59.0/24 -137.59.88.0/22 -138.32.244.0/22 -139.5.56.0/21 -139.5.80.0/22 -139.5.92.0/22 -139.5.108.0/22 -139.5.128.0/22 -139.5.160.0/22 -139.5.192.0/22 -139.5.204.0/22 -139.5.208.0/21 -139.5.244.0/22 -139.9.0.0/16 -139.129.0.0/16 -139.148.0.0/16 -139.155.0.0/16 -139.159.0.0/16 -139.170.0.0/16 -139.176.0.0/16 -139.183.0.0/16 -139.186.0.0/16 -139.189.0.0/16 -139.196.0.0/14 -139.200.0.0/13 -139.208.0.0/13 -139.217.0.0/16 -139.219.0.0/16 -139.220.0.0/15 -139.224.0.0/16 -139.226.0.0/15 -140.75.0.0/16 -140.101.208.0/24 -140.143.0.0/16 -140.179.0.0/16 -140.205.0.0/16 -140.206.0.0/15 -140.210.0.0/16 -140.224.0.0/16 -140.237.0.0/16 -140.240.0.0/16 -140.242.216.0/24 -140.242.223.0/24 -140.242.224.0/24 -140.243.0.0/16 -140.246.0.0/16 -140.249.0.0/16 -140.250.0.0/16 -140.255.0.0/16 -144.0.0.0/16 -144.7.0.0/16 -144.12.0.0/16 -144.36.146.0/23 -144.48.8.0/21 -144.48.64.0/22 -144.48.88.0/22 -144.48.156.0/22 -144.48.180.0/22 -144.48.184.0/22 -144.48.204.0/22 -144.48.208.0/21 -144.48.220.0/22 -144.48.252.0/22 -144.52.0.0/16 -144.123.0.0/16 -144.211.80.0/24 -144.211.138.0/24 -144.255.0.0/16 -146.56.192.0/18 -146.196.56.0/22 -146.196.68.0/22 -146.196.72.0/22 -146.196.92.0/22 -146.196.112.0/21 -146.196.124.0/22 -146.217.137.0/24 -146.222.79.0/24 -146.222.81.0/24 -146.222.94.0/24 -148.70.0.0/16 -150.0.0.0/16 -150.115.0.0/16 -150.121.0.0/16 -150.122.0.0/16 -150.129.136.0/22 -150.129.192.0/22 -150.129.216.0/22 -150.129.252.0/22 -150.138.0.0/15 -150.223.0.0/16 -150.242.0.0/21 -150.242.8.0/22 -150.242.28.0/22 -150.242.44.0/22 -150.242.48.0/21 -150.242.56.0/22 -150.242.76.0/22 -150.242.80.0/22 -150.242.92.0/22 -150.242.96.0/22 -150.242.112.0/21 -150.242.120.0/22 -150.242.152.0/21 -150.242.160.0/21 -150.242.168.0/22 -150.242.184.0/21 -150.242.192.0/22 -150.242.212.0/22 -150.242.224.0/20 -150.242.240.0/21 -150.242.248.0/22 -150.255.0.0/16 -152.104.128.0/17 -152.136.0.0/16 -153.0.0.0/16 -153.3.0.0/16 -153.34.0.0/15 -153.36.0.0/15 -153.99.0.0/16 -153.101.0.0/16 -153.118.0.0/15 -154.8.128.0/17 -156.107.160.0/24 -156.107.170.0/24 -157.0.0.0/16 -157.18.0.0/16 -157.61.0.0/16 -157.119.0.0/22 -157.119.8.0/21 -157.119.16.0/22 -157.119.28.0/22 -157.119.68.0/22 -157.119.112.0/22 -157.119.132.0/22 -157.119.136.0/21 -157.119.144.0/20 -157.119.160.0/21 -157.119.172.0/22 -157.119.192.0/21 -157.119.240.0/22 -157.119.252.0/22 -157.122.0.0/16 -157.133.186.0/23 -157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 -157.148.0.0/16 -157.156.0.0/16 -157.255.0.0/16 -159.75.0.0/16 -159.153.120.0/22 -159.226.0.0/16 -160.19.208.0/21 -160.19.216.0/22 -160.20.48.0/22 -160.62.10.0/24 -160.83.109.0/24 -160.83.110.0/23 -160.202.60.0/22 -160.202.148.0/22 -160.202.152.0/22 -160.202.168.0/22 -160.202.212.0/22 -160.202.216.0/21 -160.202.224.0/19 -160.238.64.0/22 -161.163.0.0/21 -161.163.28.0/23 -161.163.176.0/24 -161.163.178.0/23 -161.163.180.0/22 -161.189.0.0/16 -161.207.0.0/16 -162.14.0.0/16 -162.62.32.0/19 -162.62.64.0/18 -162.62.132.0/22 -162.62.136.0/21 -162.62.144.0/20 -162.62.160.0/19 -162.62.192.0/18 -162.105.0.0/16 -163.0.0.0/16 -163.47.4.0/22 -163.53.0.0/20 -163.53.36.0/22 -163.53.40.0/21 -163.53.48.0/20 -163.53.64.0/22 -163.53.88.0/21 -163.53.96.0/19 -163.53.128.0/21 -163.53.136.0/22 -163.53.160.0/20 -163.53.188.0/22 -163.53.220.0/22 -163.53.236.0/22 -163.53.240.0/22 -163.125.0.0/16 -163.142.0.0/16 -163.177.0.0/16 -163.179.0.0/16 -163.204.0.0/16 -163.244.246.0/24 -164.52.0.0/17 -165.156.30.0/24 -166.111.0.0/16 -167.139.0.0/16 -167.189.0.0/16 -167.220.244.0/22 -168.159.144.0/21 -168.159.152.0/22 -168.159.156.0/23 -168.159.158.0/24 -168.160.0.0/16 -168.230.0.0/24 -170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 -171.8.0.0/13 -171.34.0.0/15 -171.36.0.0/14 -171.40.0.0/13 -171.80.0.0/12 -171.104.0.0/13 -171.112.0.0/12 -171.208.0.0/12 -172.81.192.0/18 -175.0.0.0/12 -175.16.0.0/13 -175.24.0.0/14 -175.30.0.0/15 -175.42.0.0/15 -175.44.0.0/16 -175.46.0.0/15 -175.48.0.0/12 -175.64.0.0/11 -175.102.0.0/16 -175.106.128.0/17 -175.111.108.0/22 -175.111.144.0/20 -175.111.160.0/20 -175.111.184.0/22 -175.146.0.0/15 -175.148.0.0/14 -175.152.0.0/14 -175.158.96.0/22 -175.160.0.0/12 -175.176.156.0/22 -175.176.176.0/22 -175.176.188.0/22 -175.176.192.0/22 -175.178.0.0/16 -175.184.128.0/18 -175.185.0.0/16 -175.186.0.0/15 -175.188.0.0/14 -180.76.0.0/14 -180.84.0.0/15 -180.86.0.0/16 -180.88.0.0/14 -180.94.56.0/21 -180.94.96.0/20 -180.94.120.0/21 -180.95.128.0/17 -180.96.0.0/11 -180.129.128.0/17 -180.130.0.0/16 -180.136.0.0/13 -180.148.16.0/21 -180.148.152.0/21 -180.148.216.0/21 -180.148.224.0/19 -180.149.128.0/19 -180.149.236.0/22 -180.150.160.0/19 -180.152.0.0/13 -180.160.0.0/12 -180.178.112.0/21 -180.178.192.0/18 -180.184.0.0/14 -180.188.0.0/17 -180.189.148.0/22 -180.200.252.0/22 -180.201.0.0/16 -180.202.0.0/15 -180.208.0.0/15 -180.210.212.0/22 -180.210.224.0/19 -180.212.0.0/15 -180.222.224.0/19 -180.223.0.0/16 -180.233.0.0/18 -180.233.64.0/19 -180.233.144.0/22 -180.235.64.0/19 -180.235.112.0/22 -180.235.136.0/22 -182.16.144.0/21 -182.16.192.0/19 -182.18.0.0/17 -182.23.184.0/21 -182.23.200.0/21 -182.32.0.0/12 -182.48.96.0/19 -182.49.0.0/16 -182.50.0.0/20 -182.50.112.0/20 -182.51.0.0/16 -182.54.0.0/17 -182.54.244.0/22 -182.61.0.0/16 -182.80.0.0/13 -182.88.0.0/14 -182.92.0.0/16 -182.96.0.0/11 -182.128.0.0/12 -182.144.0.0/13 -182.157.0.0/16 -182.160.64.0/19 -182.174.0.0/15 -182.200.0.0/13 -182.236.128.0/17 -182.237.24.0/21 -182.238.0.0/16 -182.239.0.0/19 -182.240.0.0/13 -182.254.0.0/16 -182.255.36.0/22 -182.255.60.0/22 -183.0.0.0/10 -183.64.0.0/13 -183.78.160.0/21 -183.78.180.0/22 -183.81.172.0/22 -183.81.180.0/22 -183.84.0.0/15 -183.91.128.0/22 -183.91.136.0/21 -183.91.144.0/20 -183.92.0.0/14 -183.128.0.0/11 -183.160.0.0/13 -183.168.0.0/15 -183.170.0.0/16 -183.172.0.0/14 -183.182.0.0/19 -183.184.0.0/13 -183.192.0.0/10 -185.109.236.0/24 -185.252.218.0/23 -188.131.128.0/17 -192.11.23.0/24 -192.11.26.0/24 -192.11.39.0/24 -192.11.236.0/24 -192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 -192.55.46.0/24 -192.55.68.0/22 -192.102.204.0/22 -192.124.154.0/24 -192.137.31.0/24 -192.139.135.0/24 -192.139.136.0/24 -192.140.128.0/21 -192.140.136.0/22 -192.140.156.0/22 -192.140.160.0/19 -192.140.192.0/20 -192.140.208.0/21 -192.144.128.0/17 -192.163.11.0/24 -192.232.97.0/24 -193.20.64.0/22 -193.22.14.0/23 -193.112.0.0/16 -194.138.202.0/23 -198.175.100.0/22 -198.208.17.0/24 -199.7.72.0/24 -199.65.192.0/21 -199.244.144.0/24 -202.0.100.0/23 -202.0.122.0/23 -202.0.176.0/22 -202.1.105.0/24 -202.1.106.0/24 -202.3.128.0/23 -202.4.128.0/19 -202.4.252.0/22 -202.5.208.0/21 -202.5.216.0/22 -202.6.6.0/23 -202.6.66.0/23 -202.6.72.0/23 -202.6.87.0/24 -202.6.88.0/23 -202.6.92.0/23 -202.6.103.0/24 -202.6.108.0/24 -202.6.110.0/23 -202.6.114.0/24 -202.6.176.0/20 -202.8.0.0/24 -202.8.2.0/23 -202.8.4.0/23 -202.8.12.0/24 -202.8.24.0/24 -202.8.77.0/24 -202.8.128.0/19 -202.8.192.0/20 -202.9.32.0/24 -202.9.34.0/23 -202.9.48.0/23 -202.9.51.0/24 -202.9.52.0/23 -202.9.54.0/24 -202.9.57.0/24 -202.9.58.0/23 -202.10.64.0/20 -202.10.112.0/20 -202.12.1.0/24 -202.12.2.0/24 -202.12.17.0/24 -202.12.18.0/23 -202.12.72.0/24 -202.12.84.0/23 -202.12.96.0/24 -202.12.98.0/23 -202.12.106.0/24 -202.12.111.0/24 -202.12.116.0/24 -202.14.64.0/23 -202.14.69.0/24 -202.14.73.0/24 -202.14.74.0/23 -202.14.76.0/24 -202.14.78.0/23 -202.14.88.0/24 -202.14.97.0/24 -202.14.104.0/23 -202.14.108.0/23 -202.14.111.0/24 -202.14.114.0/23 -202.14.118.0/23 -202.14.124.0/23 -202.14.127.0/24 -202.14.129.0/24 -202.14.135.0/24 -202.14.136.0/24 -202.14.149.0/24 -202.14.151.0/24 -202.14.157.0/24 -202.14.158.0/23 -202.14.169.0/24 -202.14.170.0/23 -202.14.172.0/22 -202.14.176.0/24 -202.14.184.0/23 -202.14.208.0/23 -202.14.213.0/24 -202.14.219.0/24 -202.14.220.0/24 -202.14.222.0/23 -202.14.225.0/24 -202.14.226.0/23 -202.14.231.0/24 -202.14.235.0/24 -202.14.236.0/22 -202.14.246.0/24 -202.14.251.0/24 -202.20.66.0/24 -202.20.79.0/24 -202.20.87.0/24 -202.20.88.0/23 -202.20.90.0/24 -202.20.94.0/23 -202.20.114.0/24 -202.20.117.0/24 -202.20.120.0/24 -202.20.125.0/24 -202.20.126.0/23 -202.21.48.0/20 -202.21.131.0/24 -202.21.132.0/24 -202.21.141.0/24 -202.21.142.0/24 -202.21.147.0/24 -202.21.148.0/24 -202.21.150.0/23 -202.21.152.0/23 -202.21.154.0/24 -202.21.156.0/24 -202.21.208.0/24 -202.22.248.0/21 -202.27.12.0/24 -202.27.14.0/24 -202.27.136.0/23 -202.36.226.0/24 -202.38.0.0/22 -202.38.8.0/21 -202.38.48.0/20 -202.38.64.0/18 -202.38.128.0/21 -202.38.136.0/23 -202.38.138.0/24 -202.38.140.0/22 -202.38.146.0/23 -202.38.149.0/24 -202.38.150.0/23 -202.38.152.0/22 -202.38.156.0/24 -202.38.158.0/23 -202.38.160.0/23 -202.38.164.0/22 -202.38.168.0/22 -202.38.176.0/23 -202.38.184.0/21 -202.38.192.0/18 -202.40.4.0/23 -202.40.7.0/24 -202.40.15.0/24 -202.40.135.0/24 -202.40.136.0/24 -202.40.140.0/24 -202.40.143.0/24 -202.40.144.0/23 -202.40.150.0/24 -202.40.155.0/24 -202.40.156.0/24 -202.40.158.0/23 -202.40.162.0/24 -202.41.8.0/23 -202.41.11.0/24 -202.41.12.0/23 -202.41.128.0/24 -202.41.130.0/23 -202.41.142.0/24 -202.41.152.0/21 -202.41.192.0/24 -202.41.196.0/22 -202.41.200.0/22 -202.41.240.0/20 -202.43.76.0/22 -202.43.144.0/20 -202.44.16.0/20 -202.44.48.0/22 -202.44.67.0/24 -202.44.74.0/24 -202.44.97.0/24 -202.44.129.0/24 -202.44.132.0/23 -202.44.146.0/23 -202.45.0.0/23 -202.45.2.0/24 -202.45.15.0/24 -202.45.16.0/20 -202.46.16.0/23 -202.46.18.0/24 -202.46.20.0/23 -202.46.32.0/19 -202.46.128.0/24 -202.46.224.0/20 -202.47.82.0/23 -202.47.96.0/20 -202.47.126.0/24 -202.47.128.0/24 -202.47.130.0/23 -202.52.33.0/24 -202.52.34.0/24 -202.52.47.0/24 -202.52.143.0/24 -202.53.140.0/24 -202.53.143.0/24 -202.57.192.0/20 -202.57.212.0/22 -202.57.216.0/22 -202.57.240.0/20 -202.58.0.0/24 -202.58.104.0/22 -202.58.112.0/22 -202.59.0.0/23 -202.59.212.0/22 -202.59.236.0/24 -202.59.240.0/24 -202.60.48.0/21 -202.60.96.0/21 -202.60.112.0/20 -202.60.132.0/22 -202.60.136.0/21 -202.60.144.0/20 -202.61.68.0/22 -202.61.76.0/22 -202.61.88.0/22 -202.61.123.0/24 -202.61.127.0/24 -202.62.112.0/22 -202.62.248.0/22 -202.62.252.0/24 -202.62.255.0/24 -202.63.80.0/20 -202.63.160.0/19 -202.63.248.0/22 -202.63.253.0/24 -202.65.0.0/21 -202.65.8.0/23 -202.65.96.0/20 -202.66.168.0/22 -202.67.0.0/22 -202.69.4.0/22 -202.69.16.0/20 -202.70.0.0/19 -202.70.96.0/20 -202.70.192.0/20 -202.71.32.0/20 -202.72.40.0/21 -202.72.80.0/20 -202.72.112.0/20 -202.73.128.0/22 -202.73.240.0/20 -202.74.8.0/21 -202.74.36.0/24 -202.74.42.0/24 -202.74.52.0/24 -202.74.80.0/20 -202.74.232.0/22 -202.74.254.0/23 -202.75.208.0/20 -202.75.252.0/22 -202.76.247.0/24 -202.76.252.0/22 -202.77.80.0/21 -202.77.92.0/22 -202.78.8.0/21 -202.79.224.0/21 -202.79.248.0/22 -202.80.192.0/20 -202.81.0.0/22 -202.81.176.0/20 -202.83.252.0/22 -202.84.0.0/20 -202.84.16.0/23 -202.84.22.0/24 -202.84.24.0/21 -202.85.208.0/20 -202.86.249.0/24 -202.86.252.0/22 -202.87.80.0/20 -202.88.32.0/22 -202.89.8.0/21 -202.89.96.0/22 -202.89.108.0/22 -202.89.119.0/24 -202.89.232.0/21 -202.90.0.0/22 -202.90.16.0/20 -202.90.37.0/24 -202.90.96.0/19 -202.90.193.0/24 -202.90.196.0/24 -202.90.205.0/24 -202.90.224.0/20 -202.91.0.0/22 -202.91.36.0/22 -202.91.96.0/20 -202.91.128.0/22 -202.91.176.0/20 -202.91.224.0/19 -202.92.0.0/22 -202.92.8.0/21 -202.92.48.0/20 -202.92.252.0/22 -202.93.0.0/22 -202.93.252.0/22 -202.94.0.0/19 -202.94.74.0/24 -202.94.81.0/24 -202.94.92.0/22 -202.95.0.0/19 -202.95.240.0/21 -202.95.252.0/22 -202.96.0.0/12 -202.112.0.0/13 -202.120.0.0/15 -202.122.0.0/21 -202.122.32.0/21 -202.122.64.0/19 -202.122.112.0/20 -202.122.128.0/24 -202.122.132.0/24 -202.123.96.0/20 -202.123.116.0/22 -202.123.120.0/22 -202.124.16.0/21 -202.124.24.0/22 -202.125.107.0/24 -202.125.109.0/24 -202.125.112.0/20 -202.125.176.0/20 -202.127.0.0/21 -202.127.12.0/22 -202.127.16.0/20 -202.127.40.0/21 -202.127.48.0/20 -202.127.112.0/20 -202.127.128.0/19 -202.127.160.0/21 -202.127.192.0/20 -202.127.208.0/23 -202.127.212.0/22 -202.127.216.0/21 -202.127.224.0/19 -202.129.208.0/24 -202.130.0.0/19 -202.130.39.0/24 -202.130.224.0/19 -202.131.16.0/21 -202.131.48.0/20 -202.131.208.0/20 -202.133.32.0/20 -202.134.58.0/24 -202.134.128.0/20 -202.134.208.0/20 -202.136.48.0/20 -202.136.208.0/20 -202.136.224.0/20 -202.136.248.0/22 -202.136.254.0/23 -202.137.231.0/24 -202.140.140.0/22 -202.140.144.0/20 -202.141.160.0/19 -202.142.16.0/20 -202.143.4.0/22 -202.143.16.0/20 -202.143.32.0/20 -202.143.56.0/21 -202.143.100.0/22 -202.143.104.0/22 -202.144.196.0/22 -202.146.160.0/20 -202.146.186.0/24 -202.146.188.0/22 -202.146.196.0/22 -202.146.200.0/21 -202.147.144.0/20 -202.148.32.0/20 -202.148.64.0/18 -202.149.32.0/19 -202.149.160.0/19 -202.149.224.0/19 -202.150.16.0/20 -202.150.32.0/20 -202.150.56.0/22 -202.150.192.0/20 -202.150.224.0/19 -202.151.0.0/22 -202.151.33.0/24 -202.151.128.0/19 -202.152.176.0/20 -202.153.0.0/22 -202.153.7.0/24 -202.153.48.0/20 -202.157.192.0/19 -202.158.160.0/19 -202.158.242.0/24 -202.160.140.0/22 -202.160.156.0/22 -202.160.176.0/20 -202.162.67.0/24 -202.162.75.0/24 -202.164.0.0/20 -202.164.96.0/19 -202.165.96.0/21 -202.165.104.0/22 -202.165.176.0/20 -202.165.208.0/20 -202.165.239.0/24 -202.165.240.0/23 -202.165.243.0/24 -202.165.245.0/24 -202.165.251.0/24 -202.165.252.0/22 -202.166.224.0/19 -202.168.80.0/22 -202.168.128.0/20 -202.168.160.0/19 -202.170.128.0/19 -202.170.216.0/21 -202.170.224.0/19 -202.171.216.0/21 -202.171.232.0/24 -202.171.235.0/24 -202.172.0.0/22 -202.172.7.0/24 -202.173.0.0/22 -202.173.6.0/24 -202.173.8.0/21 -202.173.112.0/22 -202.173.120.0/22 -202.173.224.0/19 -202.174.64.0/20 -202.174.124.0/22 -202.176.224.0/19 -202.179.160.0/20 -202.179.240.0/20 -202.180.128.0/19 -202.180.208.0/21 -202.181.8.0/22 -202.181.28.0/22 -202.181.112.0/20 -202.182.32.0/20 -202.182.192.0/19 -202.189.0.0/18 -202.189.80.0/20 -202.189.184.0/21 -202.191.0.0/24 -202.191.68.0/22 -202.191.72.0/21 -202.191.80.0/20 -202.192.0.0/12 -203.0.4.0/22 -203.0.10.0/23 -203.0.18.0/24 -203.0.24.0/24 -203.0.42.0/23 -203.0.45.0/24 -203.0.46.0/23 -203.0.81.0/24 -203.0.82.0/23 -203.0.90.0/23 -203.0.96.0/23 -203.0.104.0/21 -203.0.114.0/23 -203.0.122.0/24 -203.0.128.0/24 -203.0.130.0/23 -203.0.132.0/22 -203.0.137.0/24 -203.0.142.0/24 -203.0.144.0/24 -203.0.146.0/24 -203.0.148.0/24 -203.0.150.0/23 -203.0.152.0/24 -203.0.177.0/24 -203.0.224.0/24 -203.1.4.0/22 -203.1.18.0/24 -203.1.26.0/23 -203.1.65.0/24 -203.1.66.0/23 -203.1.70.0/23 -203.1.76.0/23 -203.1.90.0/24 -203.1.97.0/24 -203.1.98.0/23 -203.1.100.0/22 -203.1.108.0/24 -203.1.253.0/24 -203.1.254.0/24 -203.2.64.0/21 -203.2.73.0/24 -203.2.112.0/21 -203.2.126.0/23 -203.2.140.0/24 -203.2.150.0/24 -203.2.152.0/22 -203.2.156.0/23 -203.2.160.0/21 -203.2.180.0/23 -203.2.196.0/23 -203.2.209.0/24 -203.2.214.0/23 -203.2.226.0/23 -203.2.229.0/24 -203.2.236.0/23 -203.3.68.0/24 -203.3.72.0/23 -203.3.75.0/24 -203.3.80.0/21 -203.3.96.0/22 -203.3.105.0/24 -203.3.112.0/21 -203.3.120.0/24 -203.3.123.0/24 -203.3.135.0/24 -203.3.139.0/24 -203.3.143.0/24 -203.4.132.0/23 -203.4.134.0/24 -203.4.151.0/24 -203.4.152.0/22 -203.4.174.0/23 -203.4.180.0/24 -203.4.186.0/24 -203.4.205.0/24 -203.4.208.0/22 -203.4.227.0/24 -203.4.230.0/23 -203.5.4.0/23 -203.5.7.0/24 -203.5.8.0/23 -203.5.11.0/24 -203.5.21.0/24 -203.5.22.0/24 -203.5.44.0/24 -203.5.46.0/23 -203.5.52.0/22 -203.5.56.0/23 -203.5.60.0/23 -203.5.114.0/23 -203.5.118.0/24 -203.5.120.0/24 -203.5.172.0/24 -203.5.180.0/23 -203.5.182.0/24 -203.5.185.0/24 -203.5.186.0/24 -203.5.188.0/23 -203.5.190.0/24 -203.5.195.0/24 -203.5.214.0/23 -203.5.218.0/23 -203.6.131.0/24 -203.6.136.0/24 -203.6.138.0/23 -203.6.142.0/24 -203.6.150.0/23 -203.6.157.0/24 -203.6.159.0/24 -203.6.224.0/20 -203.6.248.0/23 -203.7.129.0/24 -203.7.138.0/23 -203.7.147.0/24 -203.7.150.0/23 -203.7.158.0/24 -203.7.192.0/23 -203.7.200.0/24 -203.8.0.0/24 -203.8.8.0/24 -203.8.23.0/24 -203.8.24.0/21 -203.8.70.0/24 -203.8.82.0/24 -203.8.86.0/23 -203.8.91.0/24 -203.8.110.0/23 -203.8.115.0/24 -203.8.166.0/23 -203.8.169.0/24 -203.8.173.0/24 -203.8.184.0/24 -203.8.186.0/23 -203.8.190.0/23 -203.8.192.0/24 -203.8.197.0/24 -203.8.198.0/23 -203.8.203.0/24 -203.8.209.0/24 -203.8.210.0/23 -203.8.212.0/22 -203.8.217.0/24 -203.8.220.0/24 -203.9.32.0/24 -203.9.36.0/23 -203.9.57.0/24 -203.9.63.0/24 -203.9.65.0/24 -203.9.70.0/23 -203.9.72.0/24 -203.9.75.0/24 -203.9.76.0/23 -203.9.96.0/22 -203.9.100.0/23 -203.9.108.0/24 -203.9.158.0/24 -203.10.34.0/24 -203.10.56.0/24 -203.10.74.0/23 -203.10.84.0/22 -203.10.88.0/24 -203.10.95.0/24 -203.10.125.0/24 -203.11.70.0/24 -203.11.76.0/22 -203.11.82.0/24 -203.11.84.0/22 -203.11.100.0/22 -203.11.109.0/24 -203.11.117.0/24 -203.11.122.0/24 -203.11.126.0/24 -203.11.136.0/22 -203.11.141.0/24 -203.11.142.0/23 -203.11.180.0/22 -203.11.208.0/22 -203.12.16.0/24 -203.12.19.0/24 -203.12.24.0/24 -203.12.57.0/24 -203.12.65.0/24 -203.12.66.0/24 -203.12.70.0/23 -203.12.87.0/24 -203.12.88.0/21 -203.12.100.0/23 -203.12.103.0/24 -203.12.114.0/24 -203.12.118.0/24 -203.12.130.0/24 -203.12.137.0/24 -203.12.196.0/22 -203.12.200.0/21 -203.12.211.0/24 -203.12.219.0/24 -203.12.226.0/24 -203.12.240.0/22 -203.13.18.0/24 -203.13.24.0/24 -203.13.44.0/23 -203.13.80.0/21 -203.13.88.0/23 -203.13.92.0/22 -203.13.173.0/24 -203.13.224.0/23 -203.13.227.0/24 -203.13.233.0/24 -203.14.24.0/22 -203.14.33.0/24 -203.14.56.0/24 -203.14.61.0/24 -203.14.62.0/24 -203.14.104.0/24 -203.14.114.0/23 -203.14.118.0/24 -203.14.162.0/24 -203.14.184.0/21 -203.14.192.0/24 -203.14.194.0/23 -203.14.214.0/24 -203.14.231.0/24 -203.14.246.0/24 -203.15.0.0/20 -203.15.20.0/23 -203.15.22.0/24 -203.15.87.0/24 -203.15.88.0/23 -203.15.105.0/24 -203.15.112.0/21 -203.15.130.0/23 -203.15.149.0/24 -203.15.151.0/24 -203.15.156.0/22 -203.15.174.0/24 -203.15.227.0/24 -203.15.232.0/21 -203.15.240.0/23 -203.15.246.0/24 -203.16.10.0/24 -203.16.12.0/23 -203.16.16.0/21 -203.16.27.0/24 -203.16.38.0/24 -203.16.49.0/24 -203.16.50.0/23 -203.16.58.0/24 -203.16.63.0/24 -203.16.133.0/24 -203.16.161.0/24 -203.16.162.0/24 -203.16.186.0/23 -203.16.228.0/24 -203.16.238.0/24 -203.16.240.0/24 -203.16.245.0/24 -203.17.2.0/24 -203.17.18.0/24 -203.17.28.0/24 -203.17.39.0/24 -203.17.56.0/24 -203.17.74.0/23 -203.17.88.0/23 -203.17.136.0/24 -203.17.164.0/24 -203.17.187.0/24 -203.17.190.0/23 -203.17.231.0/24 -203.17.233.0/24 -203.17.248.0/23 -203.17.255.0/24 -203.18.2.0/23 -203.18.4.0/24 -203.18.7.0/24 -203.18.31.0/24 -203.18.37.0/24 -203.18.48.0/23 -203.18.52.0/24 -203.18.72.0/22 -203.18.80.0/23 -203.18.87.0/24 -203.18.100.0/23 -203.18.105.0/24 -203.18.107.0/24 -203.18.110.0/24 -203.18.129.0/24 -203.18.131.0/24 -203.18.132.0/23 -203.18.144.0/24 -203.18.153.0/24 -203.18.199.0/24 -203.18.208.0/24 -203.18.211.0/24 -203.18.215.0/24 -203.19.1.0/24 -203.19.18.0/24 -203.19.24.0/24 -203.19.30.0/24 -203.19.32.0/21 -203.19.41.0/24 -203.19.44.0/23 -203.19.46.0/24 -203.19.58.0/24 -203.19.60.0/23 -203.19.64.0/24 -203.19.68.0/24 -203.19.72.0/24 -203.19.101.0/24 -203.19.111.0/24 -203.19.131.0/24 -203.19.133.0/24 -203.19.144.0/24 -203.19.147.0/24 -203.19.149.0/24 -203.19.156.0/24 -203.19.176.0/24 -203.19.178.0/23 -203.19.208.0/24 -203.19.228.0/22 -203.19.233.0/24 -203.19.242.0/24 -203.19.248.0/23 -203.19.255.0/24 -203.20.17.0/24 -203.20.40.0/23 -203.20.44.0/24 -203.20.48.0/24 -203.20.61.0/24 -203.20.65.0/24 -203.20.84.0/23 -203.20.89.0/24 -203.20.106.0/23 -203.20.115.0/24 -203.20.117.0/24 -203.20.118.0/23 -203.20.122.0/24 -203.20.126.0/23 -203.20.135.0/24 -203.20.136.0/21 -203.20.150.0/24 -203.20.230.0/24 -203.20.232.0/24 -203.20.236.0/24 -203.21.0.0/23 -203.21.2.0/24 -203.21.8.0/24 -203.21.10.0/24 -203.21.18.0/24 -203.21.33.0/24 -203.21.34.0/24 -203.21.41.0/24 -203.21.44.0/24 -203.21.68.0/24 -203.21.82.0/24 -203.21.96.0/22 -203.21.124.0/24 -203.21.136.0/23 -203.21.145.0/24 -203.21.206.0/24 -203.22.24.0/24 -203.22.28.0/23 -203.22.31.0/24 -203.22.68.0/24 -203.22.76.0/24 -203.22.78.0/24 -203.22.84.0/24 -203.22.87.0/24 -203.22.92.0/22 -203.22.99.0/24 -203.22.106.0/24 -203.22.122.0/23 -203.22.131.0/24 -203.22.163.0/24 -203.22.166.0/24 -203.22.170.0/24 -203.22.176.0/21 -203.22.194.0/24 -203.22.242.0/23 -203.22.245.0/24 -203.22.246.0/24 -203.22.252.0/23 -203.23.0.0/24 -203.23.47.0/24 -203.23.61.0/24 -203.23.62.0/23 -203.23.73.0/24 -203.23.85.0/24 -203.23.92.0/22 -203.23.98.0/24 -203.23.107.0/24 -203.23.112.0/24 -203.23.130.0/24 -203.23.140.0/23 -203.23.172.0/24 -203.23.182.0/24 -203.23.186.0/23 -203.23.192.0/24 -203.23.197.0/24 -203.23.198.0/24 -203.23.204.0/22 -203.23.224.0/24 -203.23.226.0/23 -203.23.228.0/22 -203.23.249.0/24 -203.23.251.0/24 -203.24.13.0/24 -203.24.18.0/24 -203.24.27.0/24 -203.24.43.0/24 -203.24.56.0/24 -203.24.58.0/24 -203.24.67.0/24 -203.24.74.0/24 -203.24.79.0/24 -203.24.80.0/23 -203.24.84.0/23 -203.24.86.0/24 -203.24.90.0/24 -203.24.111.0/24 -203.24.112.0/24 -203.24.116.0/24 -203.24.122.0/23 -203.24.145.0/24 -203.24.152.0/23 -203.24.157.0/24 -203.24.161.0/24 -203.24.167.0/24 -203.24.186.0/23 -203.24.199.0/24 -203.24.202.0/24 -203.24.212.0/23 -203.24.217.0/24 -203.24.219.0/24 -203.24.244.0/24 -203.25.19.0/24 -203.25.20.0/23 -203.25.46.0/24 -203.25.48.0/21 -203.25.64.0/23 -203.25.91.0/24 -203.25.99.0/24 -203.25.100.0/24 -203.25.106.0/24 -203.25.131.0/24 -203.25.135.0/24 -203.25.138.0/24 -203.25.147.0/24 -203.25.153.0/24 -203.25.154.0/23 -203.25.164.0/24 -203.25.166.0/24 -203.25.174.0/23 -203.25.180.0/24 -203.25.182.0/24 -203.25.191.0/24 -203.25.199.0/24 -203.25.200.0/24 -203.25.202.0/23 -203.25.208.0/20 -203.25.229.0/24 -203.25.235.0/24 -203.25.236.0/24 -203.25.242.0/24 -203.26.12.0/24 -203.26.34.0/24 -203.26.49.0/24 -203.26.50.0/24 -203.26.55.0/24 -203.26.56.0/23 -203.26.60.0/24 -203.26.65.0/24 -203.26.68.0/24 -203.26.76.0/24 -203.26.80.0/24 -203.26.84.0/24 -203.26.97.0/24 -203.26.102.0/23 -203.26.115.0/24 -203.26.116.0/24 -203.26.129.0/24 -203.26.143.0/24 -203.26.144.0/24 -203.26.148.0/23 -203.26.154.0/24 -203.26.158.0/23 -203.26.161.0/24 -203.26.170.0/24 -203.26.173.0/24 -203.26.176.0/24 -203.26.185.0/24 -203.26.202.0/23 -203.26.210.0/24 -203.26.214.0/24 -203.26.222.0/24 -203.26.224.0/24 -203.26.228.0/24 -203.26.232.0/24 -203.27.0.0/24 -203.27.10.0/24 -203.27.15.0/24 -203.27.16.0/24 -203.27.20.0/24 -203.27.22.0/23 -203.27.40.0/24 -203.27.45.0/24 -203.27.53.0/24 -203.27.65.0/24 -203.27.66.0/24 -203.27.81.0/24 -203.27.88.0/24 -203.27.102.0/24 -203.27.109.0/24 -203.27.117.0/24 -203.27.121.0/24 -203.27.122.0/23 -203.27.125.0/24 -203.27.200.0/24 -203.27.202.0/24 -203.27.233.0/24 -203.27.241.0/24 -203.27.250.0/24 -203.28.10.0/24 -203.28.12.0/24 -203.28.33.0/24 -203.28.34.0/23 -203.28.43.0/24 -203.28.44.0/24 -203.28.54.0/24 -203.28.56.0/24 -203.28.73.0/24 -203.28.74.0/24 -203.28.76.0/24 -203.28.86.0/24 -203.28.88.0/24 -203.28.112.0/24 -203.28.131.0/24 -203.28.136.0/24 -203.28.140.0/24 -203.28.145.0/24 -203.28.165.0/24 -203.28.169.0/24 -203.28.170.0/24 -203.28.178.0/23 -203.28.185.0/24 -203.28.187.0/24 -203.28.196.0/24 -203.28.226.0/23 -203.28.239.0/24 -203.29.2.0/24 -203.29.8.0/23 -203.29.13.0/24 -203.29.14.0/24 -203.29.28.0/24 -203.29.46.0/24 -203.29.57.0/24 -203.29.61.0/24 -203.29.63.0/24 -203.29.69.0/24 -203.29.73.0/24 -203.29.81.0/24 -203.29.90.0/24 -203.29.95.0/24 -203.29.100.0/24 -203.29.103.0/24 -203.29.112.0/24 -203.29.120.0/22 -203.29.182.0/23 -203.29.187.0/24 -203.29.189.0/24 -203.29.190.0/24 -203.29.205.0/24 -203.29.210.0/24 -203.29.217.0/24 -203.29.227.0/24 -203.29.231.0/24 -203.29.233.0/24 -203.29.234.0/24 -203.29.248.0/24 -203.29.254.0/23 -203.30.16.0/23 -203.30.25.0/24 -203.30.27.0/24 -203.30.29.0/24 -203.30.66.0/24 -203.30.81.0/24 -203.30.87.0/24 -203.30.111.0/24 -203.30.121.0/24 -203.30.123.0/24 -203.30.152.0/24 -203.30.156.0/24 -203.30.162.0/24 -203.30.173.0/24 -203.30.175.0/24 -203.30.187.0/24 -203.30.194.0/24 -203.30.217.0/24 -203.30.220.0/24 -203.30.222.0/24 -203.30.232.0/23 -203.30.235.0/24 -203.30.240.0/23 -203.30.246.0/24 -203.30.250.0/23 -203.31.45.0/24 -203.31.46.0/24 -203.31.49.0/24 -203.31.51.0/24 -203.31.54.0/23 -203.31.69.0/24 -203.31.72.0/24 -203.31.80.0/24 -203.31.85.0/24 -203.31.97.0/24 -203.31.105.0/24 -203.31.106.0/24 -203.31.108.0/23 -203.31.124.0/24 -203.31.162.0/24 -203.31.174.0/24 -203.31.177.0/24 -203.31.181.0/24 -203.31.187.0/24 -203.31.189.0/24 -203.31.204.0/24 -203.31.220.0/24 -203.31.222.0/23 -203.31.225.0/24 -203.31.229.0/24 -203.31.248.0/23 -203.31.253.0/24 -203.32.20.0/24 -203.32.48.0/23 -203.32.56.0/24 -203.32.60.0/24 -203.32.62.0/24 -203.32.68.0/23 -203.32.76.0/24 -203.32.81.0/24 -203.32.84.0/23 -203.32.95.0/24 -203.32.102.0/24 -203.32.105.0/24 -203.32.130.0/24 -203.32.133.0/24 -203.32.140.0/24 -203.32.152.0/24 -203.32.186.0/23 -203.32.192.0/24 -203.32.196.0/24 -203.32.203.0/24 -203.32.204.0/23 -203.32.212.0/24 -203.33.4.0/24 -203.33.7.0/24 -203.33.8.0/21 -203.33.21.0/24 -203.33.26.0/24 -203.33.32.0/24 -203.33.63.0/24 -203.33.64.0/24 -203.33.67.0/24 -203.33.68.0/24 -203.33.73.0/24 -203.33.79.0/24 -203.33.100.0/24 -203.33.122.0/24 -203.33.129.0/24 -203.33.131.0/24 -203.33.145.0/24 -203.33.156.0/24 -203.33.158.0/23 -203.33.174.0/24 -203.33.185.0/24 -203.33.200.0/24 -203.33.202.0/23 -203.33.204.0/24 -203.33.206.0/23 -203.33.214.0/23 -203.33.224.0/23 -203.33.226.0/24 -203.33.233.0/24 -203.33.243.0/24 -203.33.250.0/24 -203.34.4.0/24 -203.34.21.0/24 -203.34.27.0/24 -203.34.39.0/24 -203.34.48.0/23 -203.34.54.0/24 -203.34.56.0/23 -203.34.67.0/24 -203.34.69.0/24 -203.34.76.0/24 -203.34.92.0/24 -203.34.106.0/24 -203.34.113.0/24 -203.34.147.0/24 -203.34.150.0/24 -203.34.152.0/23 -203.34.161.0/24 -203.34.162.0/24 -203.34.187.0/24 -203.34.192.0/21 -203.34.204.0/22 -203.34.232.0/24 -203.34.240.0/24 -203.34.242.0/24 -203.34.245.0/24 -203.34.251.0/24 -203.55.2.0/23 -203.55.4.0/24 -203.55.10.0/24 -203.55.13.0/24 -203.55.22.0/24 -203.55.30.0/24 -203.55.93.0/24 -203.55.101.0/24 -203.55.109.0/24 -203.55.110.0/24 -203.55.116.0/23 -203.55.119.0/24 -203.55.128.0/23 -203.55.146.0/23 -203.55.192.0/24 -203.55.196.0/24 -203.55.218.0/23 -203.55.221.0/24 -203.55.224.0/24 -203.56.1.0/24 -203.56.4.0/24 -203.56.12.0/24 -203.56.24.0/24 -203.56.38.0/24 -203.56.40.0/24 -203.56.46.0/24 -203.56.48.0/21 -203.56.68.0/23 -203.56.82.0/23 -203.56.84.0/23 -203.56.95.0/24 -203.56.110.0/24 -203.56.121.0/24 -203.56.161.0/24 -203.56.169.0/24 -203.56.172.0/23 -203.56.175.0/24 -203.56.183.0/24 -203.56.185.0/24 -203.56.187.0/24 -203.56.192.0/24 -203.56.198.0/24 -203.56.201.0/24 -203.56.208.0/23 -203.56.210.0/24 -203.56.214.0/24 -203.56.216.0/24 -203.56.227.0/24 -203.56.228.0/24 -203.56.231.0/24 -203.56.232.0/24 -203.56.240.0/24 -203.56.252.0/24 -203.56.254.0/24 -203.57.5.0/24 -203.57.6.0/24 -203.57.12.0/23 -203.57.28.0/24 -203.57.39.0/24 -203.57.46.0/24 -203.57.58.0/24 -203.57.61.0/24 -203.57.66.0/24 -203.57.69.0/24 -203.57.70.0/23 -203.57.73.0/24 -203.57.90.0/24 -203.57.101.0/24 -203.57.109.0/24 -203.57.123.0/24 -203.57.157.0/24 -203.57.200.0/24 -203.57.202.0/24 -203.57.206.0/24 -203.57.222.0/24 -203.57.224.0/20 -203.57.246.0/23 -203.57.249.0/24 -203.57.253.0/24 -203.57.254.0/23 -203.62.2.0/24 -203.62.131.0/24 -203.62.139.0/24 -203.62.161.0/24 -203.62.197.0/24 -203.62.228.0/22 -203.62.234.0/24 -203.62.246.0/24 -203.65.240.0/22 -203.76.160.0/22 -203.76.168.0/22 -203.76.208.0/21 -203.76.216.0/22 -203.76.240.0/21 -203.77.180.0/22 -203.78.48.0/20 -203.78.156.0/22 -203.79.0.0/20 -203.79.32.0/20 -203.80.4.0/23 -203.80.32.0/20 -203.80.57.0/24 -203.80.129.0/24 -203.80.132.0/22 -203.80.136.0/21 -203.80.144.0/20 -203.81.0.0/21 -203.81.16.0/20 -203.81.244.0/22 -203.82.0.0/23 -203.82.16.0/21 -203.82.112.0/20 -203.82.224.0/20 -203.83.0.0/22 -203.83.8.0/21 -203.83.56.0/21 -203.83.224.0/20 -203.86.0.0/17 -203.86.250.0/24 -203.86.254.0/23 -203.88.32.0/19 -203.88.192.0/19 -203.89.0.0/22 -203.89.8.0/21 -203.89.100.0/22 -203.89.133.0/24 -203.89.136.0/22 -203.89.144.0/24 -203.90.0.0/22 -203.90.8.0/21 -203.90.128.0/18 -203.90.192.0/19 -203.91.1.0/24 -203.91.32.0/19 -203.91.96.0/20 -203.91.120.0/21 -203.92.0.0/22 -203.92.6.0/24 -203.92.160.0/19 -203.93.0.0/16 -203.94.0.0/19 -203.95.0.0/21 -203.95.96.0/19 -203.95.128.0/18 -203.95.200.0/21 -203.95.208.0/22 -203.95.224.0/19 -203.99.8.0/21 -203.99.16.0/20 -203.99.80.0/20 -203.100.32.0/20 -203.100.48.0/21 -203.100.58.0/24 -203.100.60.0/24 -203.100.63.0/24 -203.100.80.0/20 -203.100.96.0/19 -203.100.192.0/20 -203.104.32.0/20 -203.105.96.0/19 -203.105.128.0/19 -203.107.0.0/17 -203.110.160.0/19 -203.110.208.0/20 -203.110.232.0/23 -203.110.234.0/24 -203.114.80.0/20 -203.114.244.0/22 -203.118.192.0/19 -203.118.241.0/24 -203.118.248.0/22 -203.119.24.0/21 -203.119.32.0/22 -203.119.80.0/22 -203.119.85.0/24 -203.119.113.0/24 -203.119.114.0/23 -203.119.116.0/22 -203.119.120.0/21 -203.119.128.0/17 -203.123.58.0/24 -203.128.32.0/19 -203.128.96.0/19 -203.128.128.0/24 -203.128.224.0/21 -203.129.8.0/21 -203.130.32.0/19 -203.132.32.0/19 -203.134.240.0/21 -203.135.96.0/19 -203.135.160.0/20 -203.142.12.0/23 -203.142.219.0/24 -203.142.224.0/19 -203.144.96.0/19 -203.145.0.0/19 -203.148.0.0/18 -203.148.64.0/20 -203.148.80.0/22 -203.148.86.0/23 -203.149.92.0/22 -203.152.64.0/19 -203.152.128.0/19 -203.153.0.0/22 -203.156.192.0/18 -203.158.16.0/21 -203.160.52.0/22 -203.160.104.0/21 -203.160.129.0/24 -203.160.192.0/19 -203.161.0.0/22 -203.161.180.0/24 -203.161.183.0/24 -203.161.192.0/19 -203.166.160.0/19 -203.167.28.0/22 -203.168.0.0/19 -203.170.58.0/23 -203.171.0.0/22 -203.171.208.0/24 -203.171.224.0/20 -203.174.4.0/24 -203.174.6.0/23 -203.174.96.0/19 -203.175.128.0/19 -203.175.192.0/18 -203.176.0.0/18 -203.176.64.0/19 -203.176.168.0/21 -203.184.80.0/20 -203.185.189.0/24 -203.187.160.0/19 -203.189.0.0/23 -203.189.6.0/23 -203.189.112.0/22 -203.189.192.0/19 -203.189.232.0/22 -203.189.240.0/22 -203.190.96.0/20 -203.190.249.0/24 -203.191.0.0/23 -203.191.2.0/24 -203.191.5.0/24 -203.191.7.0/24 -203.191.16.0/20 -203.191.64.0/18 -203.191.133.0/24 -203.191.144.0/20 -203.192.0.0/19 -203.193.224.0/19 -203.194.120.0/21 -203.195.64.0/19 -203.195.112.0/21 -203.195.128.0/17 -203.196.0.0/20 -203.196.28.0/22 -203.201.181.0/24 -203.201.182.0/24 -203.202.236.0/22 -203.205.64.0/19 -203.205.128.0/17 -203.207.64.0/18 -203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 -203.208.32.0/19 -203.209.224.0/19 -203.212.0.0/20 -203.212.80.0/20 -203.215.232.0/21 -203.217.164.0/22 -203.222.192.0/20 -203.223.0.0/20 -203.223.16.0/21 -204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 -206.219.44.0/23 -206.219.50.0/23 -206.219.52.0/23 -207.89.20.0/24 -210.2.0.0/19 -210.5.0.0/19 -210.5.56.0/21 -210.5.128.0/19 -210.7.56.0/21 -210.12.0.0/15 -210.14.64.0/19 -210.14.112.0/20 -210.14.128.0/17 -210.15.0.0/17 -210.15.128.0/18 -210.16.104.0/22 -210.16.128.0/18 -210.21.0.0/16 -210.22.0.0/16 -210.23.32.0/19 -210.25.0.0/16 -210.26.0.0/15 -210.28.0.0/14 -210.32.0.0/12 -210.51.0.0/16 -210.52.0.0/15 -210.56.192.0/19 -210.72.0.0/14 -210.76.0.0/15 -210.78.0.0/16 -210.79.64.0/18 -210.79.224.0/19 -210.82.0.0/15 -210.87.128.0/18 -210.185.192.0/18 -210.192.96.0/19 -211.64.0.0/13 -211.80.0.0/12 -211.96.0.0/13 -211.136.0.0/13 -211.144.0.0/12 -211.160.0.0/13 -212.64.0.0/17 -212.129.128.0/17 -216.250.108.0/22 -218.0.0.0/11 -218.56.0.0/13 -218.64.0.0/11 -218.96.0.0/14 -218.100.88.0/21 -218.100.96.0/19 -218.100.128.0/17 -218.104.0.0/14 -218.108.0.0/15 -218.185.192.0/19 -218.185.240.0/21 -218.192.0.0/12 -218.240.0.0/13 -218.249.0.0/16 -219.72.0.0/16 -219.82.0.0/16 -219.83.128.0/17 -219.90.68.0/22 -219.90.72.0/21 -219.128.0.0/11 -219.216.0.0/13 -219.224.0.0/12 -219.242.0.0/15 -219.244.0.0/14 -220.101.192.0/18 -220.112.0.0/14 -220.152.128.0/17 -220.154.0.0/15 -220.158.240.0/22 -220.160.0.0/11 -220.192.0.0/12 -220.231.0.0/18 -220.231.128.0/17 -220.232.64.0/18 -220.234.0.0/16 -220.242.0.0/15 -220.247.136.0/21 -220.248.0.0/14 -220.252.0.0/16 -221.0.0.0/13 -221.8.0.0/14 -221.12.0.0/17 -221.12.128.0/18 -221.13.0.0/16 -221.14.0.0/15 -221.122.0.0/15 -221.128.128.0/17 -221.129.0.0/16 -221.130.0.0/15 -221.133.224.0/19 -221.136.0.0/15 -221.172.0.0/14 -221.176.0.0/13 -221.192.0.0/14 -221.196.0.0/15 -221.198.0.0/16 -221.199.0.0/17 -221.199.128.0/18 -221.199.192.0/20 -221.199.224.0/19 -221.200.0.0/13 -221.208.0.0/12 -221.224.0.0/12 -222.16.0.0/12 -222.32.0.0/11 -222.64.0.0/11 -222.125.0.0/16 -222.126.128.0/17 -222.128.0.0/12 -222.160.0.0/14 -222.168.0.0/13 -222.176.0.0/12 -222.192.0.0/11 -222.240.0.0/13 -222.248.0.0/15 -223.0.0.0/12 -223.20.0.0/15 -223.27.184.0/22 -223.29.208.0/22 -223.29.252.0/22 -223.64.0.0/11 -223.96.0.0/12 -223.112.0.0/14 -223.116.0.0/15 -223.120.0.0/13 -223.128.0.0/15 -223.144.0.0/12 -223.160.0.0/14 -223.166.0.0/15 -223.192.0.0/15 -223.198.0.0/15 -223.201.0.0/16 -223.202.0.0/15 -223.208.0.0/13 -223.220.0.0/15 -223.223.176.0/20 -223.223.192.0/20 -223.240.0.0/13 -223.248.0.0/14 -223.252.128.0/17 -223.254.0.0/16 -223.255.0.0/17 -223.255.236.0/22 -223.255.252.0/23 diff --git a/client/android/shadowsocks/src/main/res/strings.xml b/client/android/shadowsocks/src/main/res/strings.xml deleted file mode 100644 index 2d6bc13ee..000000000 --- a/client/android/shadowsocks/src/main/res/strings.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - shadowsocks - Toggle - Send email - - - Service mode - Proxy only - VPN - Transproxy - Share over LAN - SOCKS5 proxy port - Local DNS port - Transproxy port - - Remote DNS - %1$s↑\t%2$s↓ - Sent: \t\t\t\t\t%3$s\t↑\t%1$s\nReceived: \t%4$s\t↓\t%2$s - %s/s - Check Connectivity - Testing… - Success: HTTPS handshake took %dms - Fail to detect internet connection: %s - Internet Unavailable - Error code: #%d - - - Profile Name - Server - Remote Port - Password - Encrypt Method - - - IPv6 Route - Redirect IPv6 traffic to remote - Metered Hint - Hint system to treat VPN as metered - Route - All - Bypass LAN - Bypass mainland China - Bypass LAN & mainland China - GFW List - China List - Apps VPN mode - Configure VPN mode for selected apps - On - Off - Mode - Bypass - Enable this option to bypass selected apps - Auto Connect - Enable Shadowsocks on startup - Enable Shadowsocks on startup. Recommended to use always-on VPN - instead - Allow Toggling in Lock Screen - Your selected profile information will be less protected - Toggling might require ROOT permission - Unsupported kernel version: %s < 3.7.1 - Toggle failed - Send DNS over UDP - Requires UDP forwarding on server side - UDP Fallback - - - VPN Service - Proxy Service - Transproxy Service - Shadowsocks started. - Invalid server name - Failed to connect the remote server - Stop - Shutting down… - %s - Permission denied to create a VPN service - Failed to start VPN service. You might need to reboot your device. - No valid profile data found. - - - Please select a profile - Proxy/Password should not be empty - Please install a file manager like MiXplorer - Connect - - - Profiles - Settings - FAQ - https://github.com/shadowsocks/shadowsocks-android/blob/master/.github/faq.md - About - Shadowsocks %s - Edit - Share - Add Profile - Apply Settings to All Profiles - Export… - Export to file… - Export to Clipboard - Import from Clipboard - Import from file… - Replace from file… - Successfully export! - Failed to export. - Successfully import! - Failed to import. - - - Profile config - Remove - Are you sure you want to remove this profile? - QR code/NFC - Add this Shadowsocks Profile? - Scan QR code - Manual Settings - Camera permission is required for scanning QR code. - - Removed - %d items removed - - Undo - - - Start the service - Connect to the current server - Connect to %s - Switch to %s - Use the current profile - - - Connecting… - Connected, tap to check connection - Not connected - - - Custom rules - Add rule(s)… - Subnet or Hostname PCRE pattern - Domain name and all its subdomain names - URL to online config - Edit rule - Cleartext HTTP traffic is insecure - - - Plugin - Configure… - Disabled - Unknown plugin %s - Warning: This plugin does not seem to come from a known trusted source. - Plugin: %s - - - Server Settings - Feature Settings - Changes not saved. Do you want to save? - Yes - No - Apply - diff --git a/client/android/shadowsocks/src/main/res/values/arrays.xml b/client/android/shadowsocks/src/main/res/values/arrays.xml deleted file mode 100644 index 62398ca90..000000000 --- a/client/android/shadowsocks/src/main/res/values/arrays.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - RC4-MD5 - AES-128-CFB - AES-192-CFB - AES-256-CFB - AES-128-CTR - AES-192-CTR - AES-256-CTR - BF-CFB - CAMELLIA-128-CFB - CAMELLIA-192-CFB - CAMELLIA-256-CFB - SALSA20 - CHACHA20 - CHACHA20-IETF - AES-128-GCM - AES-192-GCM - AES-256-GCM - CHACHA20-IETF-POLY1305 - XCHACHA20-IETF-POLY1305 - - - - rc4-md5 - aes-128-cfb - aes-192-cfb - aes-256-cfb - aes-128-ctr - aes-192-ctr - aes-256-ctr - bf-cfb - camellia-128-cfb - camellia-192-cfb - camellia-256-cfb - salsa20 - chacha20 - chacha20-ietf - aes-128-gcm - aes-192-gcm - aes-256-gcm - chacha20-ietf-poly1305 - xchacha20-ietf-poly1305 - - - - 1.0.0.0/8 - 2.0.0.0/7 - 4.0.0.0/6 - 8.0.0.0/7 - 11.0.0.0/8 - 12.0.0.0/6 - 16.0.0.0/4 - 32.0.0.0/3 - 64.0.0.0/3 - 96.0.0.0/6 - 100.0.0.0/10 - 100.128.0.0/9 - 101.0.0.0/8 - 102.0.0.0/7 - 104.0.0.0/5 - 112.0.0.0/10 - 112.64.0.0/11 - 112.96.0.0/12 - 112.112.0.0/13 - 112.120.0.0/14 - 112.124.0.0/19 - 112.124.32.0/21 - 112.124.40.0/22 - 112.124.44.0/23 - 112.124.46.0/24 - 112.124.48.0/20 - 112.124.64.0/18 - 112.124.128.0/17 - 112.125.0.0/16 - 112.126.0.0/15 - 112.128.0.0/9 - 113.0.0.0/8 - 114.0.0.0/10 - 114.64.0.0/11 - 114.96.0.0/12 - 114.112.0.0/15 - 114.114.0.0/18 - 114.114.64.0/19 - 114.114.96.0/20 - 114.114.112.0/23 - 114.114.115.0/24 - 114.114.116.0/22 - 114.114.120.0/21 - 114.114.128.0/17 - 114.115.0.0/16 - 114.116.0.0/14 - 114.120.0.0/13 - 114.128.0.0/9 - 115.0.0.0/8 - 116.0.0.0/6 - 120.0.0.0/6 - 124.0.0.0/7 - 126.0.0.0/8 - 128.0.0.0/3 - 160.0.0.0/5 - 168.0.0.0/8 - 169.0.0.0/9 - 169.128.0.0/10 - 169.192.0.0/11 - 169.224.0.0/12 - 169.240.0.0/13 - 169.248.0.0/14 - 169.252.0.0/15 - 169.255.0.0/16 - 170.0.0.0/7 - 172.0.0.0/12 - 172.32.0.0/11 - 172.64.0.0/10 - 172.128.0.0/9 - 173.0.0.0/8 - 174.0.0.0/7 - 176.0.0.0/4 - 192.0.0.8/29 - 192.0.0.16/28 - 192.0.0.32/27 - 192.0.0.64/26 - 192.0.0.128/25 - 192.0.1.0/24 - 192.0.3.0/24 - 192.0.4.0/22 - 192.0.8.0/21 - 192.0.16.0/20 - 192.0.32.0/19 - 192.0.64.0/18 - 192.0.128.0/17 - 192.1.0.0/16 - 192.2.0.0/15 - 192.4.0.0/14 - 192.8.0.0/13 - 192.16.0.0/12 - 192.32.0.0/11 - 192.64.0.0/12 - 192.80.0.0/13 - 192.88.0.0/18 - 192.88.64.0/19 - 192.88.96.0/23 - 192.88.98.0/24 - 192.88.100.0/22 - 192.88.104.0/21 - 192.88.112.0/20 - 192.88.128.0/17 - 192.89.0.0/16 - 192.90.0.0/15 - 192.92.0.0/14 - 192.96.0.0/11 - 192.128.0.0/11 - 192.160.0.0/13 - 192.169.0.0/16 - 192.170.0.0/15 - 192.172.0.0/14 - 192.176.0.0/12 - 192.192.0.0/10 - 193.0.0.0/8 - 194.0.0.0/7 - 196.0.0.0/7 - 198.0.0.0/12 - 198.16.0.0/15 - 198.20.0.0/14 - 198.24.0.0/13 - 198.32.0.0/12 - 198.48.0.0/15 - 198.50.0.0/16 - 198.51.0.0/18 - 198.51.64.0/19 - 198.51.96.0/22 - 198.51.101.0/24 - 198.51.102.0/23 - 198.51.104.0/21 - 198.51.112.0/20 - 198.51.128.0/17 - 198.52.0.0/14 - 198.56.0.0/13 - 198.64.0.0/10 - 198.128.0.0/9 - 199.0.0.0/8 - 200.0.0.0/7 - 202.0.0.0/8 - 203.0.0.0/18 - 203.0.64.0/19 - 203.0.96.0/20 - 203.0.112.0/24 - 203.0.114.0/23 - 203.0.116.0/22 - 203.0.120.0/21 - 203.0.128.0/17 - 203.1.0.0/16 - 203.2.0.0/15 - 203.4.0.0/14 - 203.8.0.0/13 - 203.16.0.0/12 - 203.32.0.0/11 - 203.64.0.0/10 - 203.128.0.0/9 - 204.0.0.0/6 - 208.0.0.0/4 - - - - @string/service_mode_proxy - @string/service_mode_vpn - @string/service_mode_transproxy - - - proxy - vpn - transproxy - - \ No newline at end of file diff --git a/client/android/shadowsocks/src/main/res/values/colors.xml b/client/android/shadowsocks/src/main/res/values/colors.xml deleted file mode 100644 index b02e47f51..000000000 --- a/client/android/shadowsocks/src/main/res/values/colors.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - #7488A1 - #388E3C - #00C853 - #CFD8DC - #90A4AE - #607D8B - #546E7A - #455A64 - @color/material_blue_grey_100 - @color/material_blue_grey_300 - @color/material_blue_grey_500 - @color/material_blue_grey_600 - @color/material_blue_grey_700 - @color/material_blue_grey_800 - @color/material_blue_grey_900 - @color/material_green_a700 - - @color/material_primary_500 - @color/material_primary_700 - @color/material_primary_500 - diff --git a/client/android/shadowsocks/src/main/res/values/strings.xml b/client/android/shadowsocks/src/main/res/values/strings.xml deleted file mode 100644 index 898de6736..000000000 --- a/client/android/shadowsocks/src/main/res/values/strings.xml +++ /dev/null @@ -1,169 +0,0 @@ - - - shadowsocks - - VPN - %s/s - - - "Switch" - "Remote DNS" - "Upload: \t%3$s\t↑\t%1$s -Download: \t%4$s\t↓\t%2$s" - "Testing…" - "Connection successful: HTTPS handshake delay %d milliseconds" - "Failed: %s" - "No Internet Connection" - "Invalid status code (#%d) " - - - "Profile name" - "Server" - "Remote Port" - "Password" - "Encryption" - - - "IPv6 routing" - "Forward IPv6 traffic to remote server" - "Routing" - "GFW List" - "Proxied VPN" - "Allow some apps to bypass VPN" - "On" - "Bypass" - "Bypass selected apps" - "Auto connect" - "Allow Shadowsocks to start with the system" - "Switching may require ROOT permissions" - "Unsupported kernel version: %s < 3.7.1" - "Using UDP DNS" - "Requires remote server to support UDP forwarding" - - - "Background service has started running. " - "Invalid server name" - "Unable to connect to remote server" - "Stop" - "stopping…" - "Background service failed to start: %s" - "VPN service failed to start. You may need to restart your device." - "No valid configuration file found." - - - "Please select a profile" - "The proxy server address and password cannot be empty" - "Connect" - - - "Profiles" - "Settings" - "FAQ" - "About" - "Shadowsocks %s" - "Edit" - "Share" - "Add Profile" - "Apply settings to all profiles" - "Export to clipboard" - "Import from clipboard" - "Export to clipboard succeeded" - "Export to clipboard failed" - "Import successful" - "Import failed" - - - "Profile Config" - "Delete" - "Are you sure you want to delete this profile?" - "QR code / NFC" - "Add this profile for Shadowsock?" - "Scan QR code" - - "%d items deleted" - - "Undo" - - - "Start service" - "Connect to the current server" - "Connect to %s" - "Switch to %s" - "Use current profile" - - - "Send: " - "Received:" - - - "connecting…" - "Connected, click Test Connection" - "Not connected" - - - "Custom rules" - "Add rule…" - "Edit rules" - "Global" - "Bypass LAN addresses" - "Bypass mainland China addresses" - "Bypass LAN and Mainland China addresses" - "Proxy only for mainland China addresses" - "Subnet/Domain PCRE Regular Expression" - "Domain names and their subdomains" - - - "Plugin" - "Configure…" - "Disabled" - "Unknown plugin %s" - "Warning: This plugin does not appear to be from a known trusted source." - "Plugin: %s" - "Scanning the QR code requires permission to use the camera." - - - "VPN service" - "Manual setting" - - - "Advanced options" - - - "Service mode" - "Proxy only" - "Transparent proxy" - "SOCKS5 proxy port" - "local DNS port" - "Transparent proxy port" - "Proxy mode" - "Transparent proxy mode" - "Insufficient permission to create VPN service" - "Allow Shadowsocks to start with the system, an always-on VPN is recommended" - "Allow toggle on lock screen" - "The selected configuration information will be less secure" - "Online Rules File URL" - "Import from file…" - "Night Mode" - "System" - "Auto" - "On" - "Off" - "Send email" - "Export…" - "Export to file…" - "HTTP clear text traffic is not secure" - "Share via LAN" - "Check connection" - "Please install a file manager such as MiXplorer" - "Failed to switch" - "UDP configuration" - "Replace from file…" - "Off" - "model" - "Server settings" - "Function settings" - "Do you want to save the changes?" - "Yes" - "No" - "Apply" - \ No newline at end of file diff --git a/client/android/shadowsocks/src/main/res/values/styles.xml b/client/android/shadowsocks/src/main/res/values/styles.xml deleted file mode 100644 index 570820121..000000000 --- a/client/android/shadowsocks/src/main/res/values/styles.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - -