From 502faf063b4591687f47a68d0e3f090ea7931b5c Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Thu, 17 Dec 2020 12:02:53 +0100 Subject: [PATCH 01/15] nat46: Fix PKG_MIRROR_HASH The PKG_MIRROR_HASH was not updated when updating the package. Fixes: f75c70aecaca ("nat46: update to latest git HEAD") Signed-off-by: Hauke Mehrtens --- package/kernel/nat46/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/kernel/nat46/Makefile b/package/kernel/nat46/Makefile index dd9d606d27..c2bf582cfa 100644 --- a/package/kernel/nat46/Makefile +++ b/package/kernel/nat46/Makefile @@ -3,7 +3,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=nat46 -PKG_MIRROR_HASH:=d0bc80038cadeb7e857118e8d6bae242670ab27377af49f74bad494e0e5da598 +PKG_MIRROR_HASH:=5cc35d11ad6937734f830be5e260eb17a7b0561e37f538e5fc99026d0f2ea517 PKG_SOURCE_URL:=https://github.com/ayourtch/nat46.git PKG_SOURCE_DATE:=2020-08-17 PKG_SOURCE_PROTO:=git From a63b20150d4e130b96b666807b0aa775206d880f Mon Sep 17 00:00:00 2001 From: Chen Minqiang Date: Fri, 24 Jul 2020 20:02:13 +0800 Subject: [PATCH 02/15] ramips: xiaomi ac2100 build breed-factory --- target/linux/ramips/image/mt7621.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk index 0c7faefa73..2815918afd 100644 --- a/target/linux/ramips/image/mt7621.mk +++ b/target/linux/ramips/image/mt7621.mk @@ -941,11 +941,14 @@ define Device/xiaomi-ac2100 KERNEL_SIZE := 4096k IMAGE_SIZE := 120320k UBINIZE_OPTS := -E 5 - IMAGES += kernel1.bin rootfs0.bin factory.bin + IMAGES += kernel1.bin rootfs0.bin factory.bin breed-factory.bin IMAGE/kernel1.bin := append-kernel IMAGE/rootfs0.bin := append-ubi | check-size IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata IMAGE/factory.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | check-size + IMAGE/breed-factory.bin := append-kernel | pad-to $$(KERNEL_SIZE) | \ + append-kernel | pad-to $$(KERNEL_SIZE) | \ + append-ubi | check-size DEVICE_VENDOR := Xiaomi DEVICE_PACKAGES := kmod-mt7603 kmod-mt7615e wpad-openssl uboot-envtools endef From 46c6f334003942afd8a403396a53272cb9655555 Mon Sep 17 00:00:00 2001 From: AmadeusGhost <42570690+AmadeusGhost@users.noreply.github.com> Date: Thu, 19 Nov 2020 20:18:28 +0800 Subject: [PATCH 03/15] ramips: add support for JCG Y2 Signed-off-by: AmadeusGhost (cherry picked from commit 74cda5b01bbe61c839bc7cc96fc05bb3f3cb39c41) --- target/linux/ramips/dts/mt7621_jcg_y2.dts | 105 ++++++++++++++++++ target/linux/ramips/image/mt7621.mk | 12 ++ .../mt7621/base-files/etc/board.d/01_leds | 3 +- .../mt7621/base-files/etc/board.d/02_network | 24 ++-- 4 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 target/linux/ramips/dts/mt7621_jcg_y2.dts diff --git a/target/linux/ramips/dts/mt7621_jcg_y2.dts b/target/linux/ramips/dts/mt7621_jcg_y2.dts new file mode 100644 index 0000000000..1fda631b94 --- /dev/null +++ b/target/linux/ramips/dts/mt7621_jcg_y2.dts @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/dts-v1/; + +#include "mt7621.dtsi" + +#include +#include + +/ { + compatible = "jcg,y2", "mediatek,mt7621-soc"; + model = "JCG Y2"; + + aliases { + led-boot = &led_internet; + led-failsafe = &led_internet; + led-upgrade = &led_internet; + }; + + chosen { + bootargs = "console=ttyS0,57600"; + }; + + leds { + compatible = "gpio-leds"; + + led_internet: internet { + label = "y2:blue:internet"; + gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&gpio0 18 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; +}; + +&spi0 { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <80000000>; + m25p,fast-read; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "bootloader"; + reg = <0x0 0x30000>; + read-only; + }; + + partition@30000 { + label = "config"; + reg = <0x30000 0x10000>; + read-only; + }; + + factory: partition@40000 { + label = "factory"; + reg = <0x40000 0x10000>; + read-only; + }; + + partition@50000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x50000 0xfb0000>; + }; + }; + }; +}; + +&pcie { + status = "okay"; +}; + +&pcie0 { + wifi@0,0 { + compatible = "mediatek,mt76"; + reg = <0x0000 0 0 0 0>; + mediatek,mtd-eeprom = <&factory 0x0>; + }; +}; + +ðernet { + mtd-mac-address = <&factory 0xe000>; +}; + +&state_default { + gpio { + ralink,group = "jtag", "wdt"; + ralink,function = "gpio"; + }; +}; diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk index 2815918afd..db82058e49 100644 --- a/target/linux/ramips/image/mt7621.mk +++ b/target/linux/ramips/image/mt7621.mk @@ -445,6 +445,18 @@ define Device/jcg_jhr-ac876m endef TARGET_DEVICES += jcg_jhr-ac876m +define Device/jcg_y2 + IMAGE_SIZE := 16064k + IMAGES += factory.bin + IMAGE/factory.bin := $$(sysupgrade_bin) | check-size | \ + jcg-header 95.1 + JCG_MAXSIZE := 16064k + DEVICE_VENDOR := JCG + DEVICE_MODEL := Y2 + DEVICE_PACKAGES := kmod-usb3 luci-app-mtwifi +endef +TARGET_DEVICES += jcg_y2 + define Device/jdcloud_re-sp-01b IMAGE_SIZE := 27328k DEVICE_VENDOR := JDCloud diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds index 6ee04bf2f6..e884152572 100755 --- a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds @@ -23,7 +23,8 @@ d-team,newifi-d2) ucidef_set_led_netdev "wlan5g" "WiFi 5GHz" "$boardname:blue:wlan5g" "wlan1" ;; d-team,pbr-m1|\ -gehua,ghl-r-001) +gehua,ghl-r-001|\ +jcg,y2) ucidef_set_led_netdev "internet" "internet" "$boardname:blue:internet" "eth0.2" ;; dlink,dir-860l-b1) diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network index 1e2127862c..de8a1e544d 100755 --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network @@ -114,6 +114,11 @@ ramips_setup_interfaces() ucidef_add_switch "switch0" \ "1:lan" "2:lan" "3:lan" "4:wan" "6@eth0" ;; + jcg,y2) + ucidef_add_switch "switch0" \ + "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "6@eth0" + ucidef_set_interface_lan "eth0.1 ra0 rax0 apcli0 apclix0" + ;; lenovo,newifi-d1) ucidef_add_switch "switch0" \ "1:lan:2" "2:lan:1" "4:wan" "6@eth0" @@ -259,11 +264,6 @@ ramips_setup_macs() wan_mac=$(mtd_get_mac_ascii u-boot-env wanaddr) label_mac=$wan_mac ;; - linksys,ea7500-v2) - lan_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr) - wan_mac=$lan_mac - label_mac=$lan_mac - ;; iptime,a6ns-m|\ iptime,a8004t) wan_mac=$(mtd_get_mac_binary u-boot 0x1fc40) @@ -272,6 +272,16 @@ ramips_setup_macs() label_mac=$(mtd_get_mac_binary factory 0x4) wan_mac=$label_mac ;; + jcg,y2|\ + zbtlink,zbt-we1326) + wan_mac=$(mtd_get_mac_binary factory 0xe006) + label_mac=$(mtd_get_mac_binary factory 0x4) + ;; + linksys,ea7500-v2) + lan_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr) + wan_mac=$lan_mac + label_mac=$lan_mac + ;; mediatek,ap-mt7621a-v60) wan_mac=$(macaddr_add "$(mtd_get_mac_binary factory 0x5)" 1) ;; @@ -308,10 +318,6 @@ ramips_setup_macs() lan_mac=$(mtd_get_mac_binary factory 0xe006) label_mac=$lan_mac ;; - zbtlink,zbt-we1326) - wan_mac=$(mtd_get_mac_binary factory 0xe006) - label_mac=$(mtd_get_mac_binary factory 0x4) - ;; zbtlink,zbt-wg3526-16m|\ zbtlink,zbt-wg3526-32m) wan_mac=$(macaddr_add "$(mtd_get_mac_binary factory 0xe000)" 1) From 4c8a6f0aedafeb381ba8c971498fde6b63e72255 Mon Sep 17 00:00:00 2001 From: Davide Fioravanti Date: Thu, 17 Sep 2020 15:40:27 +0200 Subject: [PATCH 04/15] mac80211: select the first available channel for 5GHz interfaces Some 5GHz wifi interfaces, especially in Tri-band routers, can't use channel 36. In these cases, the default configuration for 5GHz interfaces, once enabled, doesn't work. This patch selects the first non-disabled channel for 5GHz interfaces. Signed-off-by: Davide Fioravanti --- package/kernel/mac80211/files/lib/wifi/mac80211.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh index 6103b5d04e..c062cdc953 100644 --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -83,9 +83,9 @@ detect_mac80211() { iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20 - iw phy "$dev" info | grep -q '5180 MHz' && { + iw phy "$dev" info | grep -q '\* 5... MHz \[' && { mode_band="a" - channel="36" + channel=$(iw phy "$dev" info | grep '\* 5... MHz \[' | grep '(disabled)' -v -m 1 | sed 's/[^[]*\[\|\].*//g') iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80" } From b7b865d416cfcf01115751457f18716d591cbd63 Mon Sep 17 00:00:00 2001 From: AmadeusGhost <42570690+AmadeusGhost@users.noreply.github.com> Date: Thu, 12 Nov 2020 21:20:05 +0800 Subject: [PATCH 05/15] hostapd: add submenu for packages --- package/network/services/hostapd/Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile index 0f4fe645ff..bc7cb3c93c 100644 --- a/package/network/services/hostapd/Makefile +++ b/package/network/services/hostapd/Makefile @@ -129,6 +129,7 @@ DRV_DEPENDS:=+PACKAGE_kmod-cfg80211:libnl-tiny define Package/hostapd/Default SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD TITLE:=IEEE 802.1x Authenticator URL:=http://hostap.epitest.fi/ DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus @@ -190,6 +191,7 @@ endef define Package/wpad/Default SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD TITLE:=IEEE 802.1x Authenticator/Supplicant DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus URL:=http://hostap.epitest.fi/ @@ -290,6 +292,7 @@ Package/wpad-mesh-wolfssl/description = $(Package/wpad-mesh/description) define Package/wpa-supplicant/Default SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD TITLE:=WPA Supplicant URL:=http://hostap.epitest.fi/wpa_supplicant/ DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus @@ -362,11 +365,13 @@ define Package/hostapd-common TITLE:=hostapd/wpa_supplicant common support files SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD endef define Package/hostapd-utils SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD TITLE:=IEEE 802.1x Authenticator (utils) URL:=http://hostap.epitest.fi/ DEPENDS:=@$(subst $(space),||,$(foreach pkg,$(HOSTAPD_PROVIDERS),PACKAGE_$(pkg))) @@ -380,6 +385,7 @@ endef define Package/wpa-cli SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD DEPENDS:=@$(subst $(space),||,$(foreach pkg,$(SUPPLICANT_PROVIDERS),PACKAGE_$(pkg))) TITLE:=WPA Supplicant command line control utility endef @@ -388,6 +394,7 @@ define Package/eapol-test TITLE:=802.1x authentication test utility SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD VARIANT:=supplicant-full-internal DEPENDS:=$(DRV_DEPENDS) +libubus endef @@ -396,6 +403,7 @@ define Package/eapol-test-openssl TITLE:=802.1x authentication test utility SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD VARIANT:=supplicant-full-openssl CONFLICTS:=$(filter-out eapol-test-openssl ,$(EAPOL_TEST_PROVIDERS)) DEPENDS:=$(DRV_DEPENDS) +libubus +libopenssl @@ -406,6 +414,7 @@ define Package/eapol-test-wolfssl TITLE:=802.1x authentication test utility SECTION:=net CATEGORY:=Network + SUBMENU:=WirelessAPD VARIANT:=supplicant-full-wolfssl CONFLICTS:=$(filter-out eapol-test-openssl ,$(filter-out eapol-test-wolfssl ,$(EAPOL_TEST_PROVIDERS))) DEPENDS:=$(DRV_DEPENDS) +libubus +libwolfssl From f047d3ea9fb35d4973d9ee9348fb4d1cd4161568 Mon Sep 17 00:00:00 2001 From: AmadeusGhost <42570690+AmadeusGhost@users.noreply.github.com> Date: Tue, 24 Nov 2020 21:20:05 +0800 Subject: [PATCH 06/15] ipq40xx/ipq806x: remove some unimportant default packages Not all devices under these targets have a large storage, so remove some unimportant or duplicate packages. --- target/linux/ipq40xx/Makefile | 6 +++--- target/linux/ipq806x/Makefile | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/target/linux/ipq40xx/Makefile b/target/linux/ipq40xx/Makefile index 965ac2123b..c23fef4207 100644 --- a/target/linux/ipq40xx/Makefile +++ b/target/linux/ipq40xx/Makefile @@ -19,8 +19,8 @@ DEFAULT_PACKAGES += \ kmod-leds-gpio kmod-gpio-button-hotplug swconfig \ kmod-ath10k wpad-openssl \ kmod-usb3 kmod-usb-dwc3 ath10k-firmware-qca4019 \ - autocore-arm automount autosamba luci-app-ipsec-vpnd v2ray shadowsocks-libev-ss-redir shadowsocksr-libev-server \ - luci-app-unblockmusic luci-app-cpufreq luci-app-zerotier ca-certificates \ - htop fdisk e2fsprogs ethtool openssh-sftp-server + autocore-arm automount autosamba shadowsocks-libev-ss-redir \ + shadowsocksr-libev-server luci-app-cpufreq luci-app-ipsec-vpnd \ + luci-app-unblockmusic luci-app-zerotier htop ethtool $(eval $(call BuildTarget)) diff --git a/target/linux/ipq806x/Makefile b/target/linux/ipq806x/Makefile index 81f638f8bc..de86891776 100644 --- a/target/linux/ipq806x/Makefile +++ b/target/linux/ipq806x/Makefile @@ -24,7 +24,7 @@ DEFAULT_PACKAGES += \ kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport \ kmod-usb3 kmod-usb-dwc3-of-simple kmod-usb-phy-qcom-dwc3 \ kmod-ath10k-ct wpad uboot-envtools e2fsprogs autocore-arm \ - automount autosamba v2ray shadowsocks-libev-ss-redir shadowsocksr-libev-server openssh-sftp-server \ - luci-app-ipsec-vpnd luci-app-unblockmusic luci-app-zerotier ca-certificates + automount autosamba shadowsocks-libev-ss-redir shadowsocksr-libev-server \ + luci-app-cpufreq luci-app-ipsec-vpnd luci-app-unblockmusic luci-app-zerotier $(eval $(call BuildTarget)) From 53a6f89ea3058b50039f47dadbf6b7eb4e775dbd Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Fri, 18 Dec 2020 22:30:53 +0800 Subject: [PATCH 07/15] ipq40xx/ip806x: refresh default packages --- target/linux/ipq40xx/Makefile | 6 +++--- target/linux/ipq806x/Makefile | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/target/linux/ipq40xx/Makefile b/target/linux/ipq40xx/Makefile index c23fef4207..592b2ada21 100644 --- a/target/linux/ipq40xx/Makefile +++ b/target/linux/ipq40xx/Makefile @@ -19,8 +19,8 @@ DEFAULT_PACKAGES += \ kmod-leds-gpio kmod-gpio-button-hotplug swconfig \ kmod-ath10k wpad-openssl \ kmod-usb3 kmod-usb-dwc3 ath10k-firmware-qca4019 \ - autocore-arm automount autosamba shadowsocks-libev-ss-redir \ - shadowsocksr-libev-server luci-app-cpufreq luci-app-ipsec-vpnd \ - luci-app-unblockmusic luci-app-zerotier htop ethtool + autocore-arm automount autosamba shadowsocksr-libev-server \ + luci-app-ipsec-vpnd luci-app-zerotier openssh-sftp-server \ + e2fsprogs ethtool htop $(eval $(call BuildTarget)) diff --git a/target/linux/ipq806x/Makefile b/target/linux/ipq806x/Makefile index de86891776..b3ed146fb1 100644 --- a/target/linux/ipq806x/Makefile +++ b/target/linux/ipq806x/Makefile @@ -23,8 +23,8 @@ DEFAULT_PACKAGES += \ kmod-ata-core kmod-ata-ahci kmod-ata-ahci-platform \ kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport \ kmod-usb3 kmod-usb-dwc3-of-simple kmod-usb-phy-qcom-dwc3 \ - kmod-ath10k-ct wpad uboot-envtools e2fsprogs autocore-arm \ - automount autosamba shadowsocks-libev-ss-redir shadowsocksr-libev-server \ - luci-app-cpufreq luci-app-ipsec-vpnd luci-app-unblockmusic luci-app-zerotier + kmod-ath10k-ct wpad uboot-envtools e2fsprogs htop \ + autocore-arm automount autosamba shadowsocksr-libev-server \ + luci-app-ipsec-vpnd luci-app-zerotier openssh-sftp-server $(eval $(call BuildTarget)) From 8dbb30e8bd5c7e264b953831e32cfefe33cd103c Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 6 Dec 2020 00:17:59 +0100 Subject: [PATCH 08/15] mac80211: Update to version 4.19.161-1 The removed patches were applied upstream. The changes to 357-mac80211-optimize-skb-resizing.patch are more complex. I think the patch already took care of the new changes done upstream. Signed-off-by: Hauke Mehrtens --- package/kernel/mac80211/Makefile | 8 +-- .../patches/ath/404-regd_no_assoc_hints.patch | 4 +- ...-of-peer_bw_rxnss_override-parameter.patch | 2 +- ...rolling-support-for-various-chipsets.patch | 12 ++-- ...rd_type-used-for-nvram-file-selectio.patch | 2 +- ...-add-credit-numbers-updating-support.patch | 10 ++-- ...c-handle-compressed-tx-status-signal.patch | 16 +++--- ...dd-support-for-CYW43012-SDIO-chipset.patch | 4 +- ...43012-F2-watermark-setting-to-fix-DM.patch | 2 +- ...and-dump-trap-info-during-sdio-probe.patch | 6 +- ...e-bphy_err-in-all-wiphy-related-code.patch | 30 +++++----- ...fix-NULL-pointer-derefence-during-US.patch | 2 +- ...rcmf_attach-and-brcmf_detach-functio.patch | 2 +- ...-F2-blocksize-and-watermark-for-4359.patch | 2 +- ...mac-use-true-false-for-bool-variable.patch | 2 +- ...x-OOB-interrupt-initialization-on-br.patch | 4 +- ...e-linux-stddef.h-instead-of-stddef.h.patch | 33 ----------- .../110-mac80211_keep_keys_on_stop_ap.patch | 2 +- .../subsys/140-tweak-TSQ-setting.patch | 2 +- .../mac80211/patches/subsys/210-ap_scan.patch | 2 +- ...d-stop-start-logic-for-software-TXQs.patch | 4 +- ...l-remove-unnecessary-debugfs-cleanup.patch | 12 ++-- ...l-merge-with-minstrel_ht-always-enab.patch | 6 +- ...l_ht-improve-rate-probing-for-device.patch | 2 +- .../320-mac80211-Add-TXQ-scheduling-API.patch | 4 +- ...-Add-airtime-statistics-and-settings.patch | 6 +- ...time-accounting-and-scheduling-to-TX.patch | 12 ++-- ...pose-ieee80211_schedule_txq-function.patch | 2 +- ...allow-bigger-VHT-MPDUs-than-the-hard.patch | 34 ------------ ...0211-add-hdrlen-to-ieee80211_tx_data.patch | 6 +- ...1-add-TX_NEEDS_ALIGNED4_SKBS-hw-flag.patch | 14 ++--- ...locking-for-txq-scheduling-airtime-f.patch | 10 ++-- ...te-hash-for-fq-without-holding-fq-lo.patch | 6 +- ...e-dequeue-late-tx-handlers-without-h.patch | 8 +-- .../357-mac80211-optimize-skb-resizing.patch | 55 ++++++++++++------- ...ee80211_schedule_txq-schedule-empty-.patch | 6 +- ...ing-iTXQ-select-the-queue-in-ieee802.patch | 4 +- ...l-remove-divisions-in-tx-status-path.patch | 6 +- ...l_ht-replace-rate-stats-ewma-with-a-.patch | 10 ++-- ...l_ht-rename-prob_ewma-to-prob_avg-us.patch | 6 +- ...domize-BA-session-dialog-token-alloc.patch | 2 +- ...al-BSS-receive-time-to-survey-inform.patch | 2 +- ...11-fix-misplaced-while-instead-of-if.patch | 31 ----------- .../522-mac80211_configure_antenna_gain.patch | 6 +- 44 files changed, 158 insertions(+), 243 deletions(-) delete mode 100644 package/kernel/mac80211/patches/subsys/090-wireless-Use-linux-stddef.h-instead-of-stddef.h.patch delete mode 100644 package/kernel/mac80211/patches/subsys/331-mac80211-do-not-allow-bigger-VHT-MPDUs-than-the-hard.patch delete mode 100644 package/kernel/mac80211/patches/subsys/370-mac80211-fix-misplaced-while-instead-of-if.patch diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 06a7aefb51..39f8a5bce6 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=4.19.137-1 -PKG_RELEASE:=2 -PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.137/ -PKG_HASH:=dc5eea4f77fc5c43b69e38f46fbf766880fa4bdeef83dcc8dcc85aa6b645bb7c +PKG_VERSION:=4.19.161-1 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.161/ +PKG_HASH:=01a4173ba180eb8ca67c898239d5accb49a3ea9aea51510e17d5c937d6e93f9a PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) diff --git a/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch b/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch index dc4068e542..16e40380e7 100644 --- a/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch +++ b/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch @@ -1,6 +1,6 @@ --- a/net/wireless/reg.c +++ b/net/wireless/reg.c -@@ -3034,6 +3034,8 @@ void regulatory_hint_country_ie(struct w +@@ -3037,6 +3037,8 @@ void regulatory_hint_country_ie(struct w enum environment_cap env = ENVIRON_ANY; struct regulatory_request *request = NULL, *lr; @@ -9,7 +9,7 @@ /* IE len must be evenly divisible by 2 */ if (country_ie_len & 0x01) return; -@@ -3259,6 +3261,7 @@ static bool is_wiphy_all_set_reg_flag(en +@@ -3262,6 +3264,7 @@ static bool is_wiphy_all_set_reg_flag(en void regulatory_hint_disconnect(void) { diff --git a/package/kernel/mac80211/patches/ath/972-ath10k_fix-crash-due-to-wrong-handling-of-peer_bw_rxnss_override-parameter.patch b/package/kernel/mac80211/patches/ath/972-ath10k_fix-crash-due-to-wrong-handling-of-peer_bw_rxnss_override-parameter.patch index 6ff445c730..12f56197ba 100644 --- a/package/kernel/mac80211/patches/ath/972-ath10k_fix-crash-due-to-wrong-handling-of-peer_bw_rxnss_override-parameter.patch +++ b/package/kernel/mac80211/patches/ath/972-ath10k_fix-crash-due-to-wrong-handling-of-peer_bw_rxnss_override-parameter.patch @@ -105,7 +105,7 @@ v9: use SM/MS macros from code.h to simplify shift/mask handling } --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c -@@ -7378,12 +7378,7 @@ ath10k_wmi_peer_assoc_fill_10_4(struct a +@@ -7391,12 +7391,7 @@ ath10k_wmi_peer_assoc_fill_10_4(struct a struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf; ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg); diff --git a/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch b/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch index 7b812b0fc1..2ae28283dc 100644 --- a/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch +++ b/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch @@ -475,7 +475,7 @@ v13: static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = { --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c -@@ -7198,6 +7198,49 @@ ath10k_wmi_op_gen_peer_set_param(struct +@@ -7211,6 +7211,49 @@ ath10k_wmi_op_gen_peer_set_param(struct return skb; } @@ -525,7 +525,7 @@ v13: static struct sk_buff * ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, enum wmi_sta_ps_mode psmode) -@@ -8809,6 +8852,9 @@ static const struct wmi_ops wmi_ops = { +@@ -8822,6 +8865,9 @@ static const struct wmi_ops wmi_ops = { .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill, .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, .gen_echo = ath10k_wmi_op_gen_echo, @@ -535,7 +535,7 @@ v13: /* .gen_bcn_tmpl not implemented */ /* .gen_prb_tmpl not implemented */ /* .gen_p2p_go_bcn_ie not implemented */ -@@ -8879,6 +8925,8 @@ static const struct wmi_ops wmi_10_1_ops +@@ -8892,6 +8938,8 @@ static const struct wmi_ops wmi_10_1_ops .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, .gen_echo = ath10k_wmi_op_gen_echo, @@ -544,7 +544,7 @@ v13: /* .gen_bcn_tmpl not implemented */ /* .gen_prb_tmpl not implemented */ /* .gen_p2p_go_bcn_ie not implemented */ -@@ -8950,6 +8998,8 @@ static const struct wmi_ops wmi_10_2_ops +@@ -8963,6 +9011,8 @@ static const struct wmi_ops wmi_10_2_ops .gen_delba_send = ath10k_wmi_op_gen_delba_send, .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, @@ -553,7 +553,7 @@ v13: /* .gen_pdev_enable_adaptive_cca not implemented */ }; -@@ -9020,6 +9070,8 @@ static const struct wmi_ops wmi_10_2_4_o +@@ -9033,6 +9083,8 @@ static const struct wmi_ops wmi_10_2_4_o .gen_pdev_enable_adaptive_cca = ath10k_wmi_op_gen_pdev_enable_adaptive_cca, .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype, @@ -562,7 +562,7 @@ v13: /* .gen_bcn_tmpl not implemented */ /* .gen_prb_tmpl not implemented */ /* .gen_p2p_go_bcn_ie not implemented */ -@@ -9099,6 +9151,8 @@ static const struct wmi_ops wmi_10_4_ops +@@ -9112,6 +9164,8 @@ static const struct wmi_ops wmi_10_4_ops .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, .gen_echo = ath10k_wmi_op_gen_echo, .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, diff --git a/package/kernel/mac80211/patches/brcm/320-v5.0-0004-brcmfmac-Set-board_type-used-for-nvram-file-selectio.patch b/package/kernel/mac80211/patches/brcm/320-v5.0-0004-brcmfmac-Set-board_type-used-for-nvram-file-selectio.patch index 9b06d40dc6..064c154d02 100644 --- a/package/kernel/mac80211/patches/brcm/320-v5.0-0004-brcmfmac-Set-board_type-used-for-nvram-file-selectio.patch +++ b/package/kernel/mac80211/patches/brcm/320-v5.0-0004-brcmfmac-Set-board_type-used-for-nvram-file-selectio.patch @@ -67,7 +67,7 @@ Signed-off-by: Kalle Valo fwreq->bus_nr = devinfo->pdev->bus->number; --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4215,6 +4215,7 @@ brcmf_sdio_prepare_fw_request(struct brc +@@ -4219,6 +4219,7 @@ brcmf_sdio_prepare_fw_request(struct brc fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY; fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; diff --git a/package/kernel/mac80211/patches/brcm/328-v5.0-0001-brcmfmac-add-credit-numbers-updating-support.patch b/package/kernel/mac80211/patches/brcm/328-v5.0-0001-brcmfmac-add-credit-numbers-updating-support.patch index 3f84e54208..1d8859b182 100644 --- a/package/kernel/mac80211/patches/brcm/328-v5.0-0001-brcmfmac-add-credit-numbers-updating-support.patch +++ b/package/kernel/mac80211/patches/brcm/328-v5.0-0001-brcmfmac-add-credit-numbers-updating-support.patch @@ -27,7 +27,7 @@ Signed-off-by: Kalle Valo int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1]; int deq_node_pos[BRCMF_FWS_FIFO_COUNT]; u32 fifo_credit_map; -@@ -1241,6 +1242,9 @@ static void brcmf_fws_return_credits(str +@@ -1245,6 +1246,9 @@ static void brcmf_fws_return_credits(str } fws->fifo_credit[fifo] += credits; @@ -37,7 +37,7 @@ Signed-off-by: Kalle Valo } static void brcmf_fws_schedule_deq(struct brcmf_fws_info *fws) -@@ -1599,19 +1603,21 @@ static int brcmf_fws_notify_credit_map(s +@@ -1603,19 +1607,21 @@ static int brcmf_fws_notify_credit_map(s brcmf_err("event payload too small (%d)\n", e->datalen); return -EINVAL; } @@ -63,7 +63,7 @@ Signed-off-by: Kalle Valo } brcmf_fws_schedule_deq(fws); brcmf_fws_unlock(fws); -@@ -2017,7 +2023,7 @@ static int brcmf_fws_borrow_credit(struc +@@ -2021,7 +2027,7 @@ static int brcmf_fws_borrow_credit(struc } for (lender_ac = 0; lender_ac <= BRCMF_FWS_FIFO_AC_VO; lender_ac++) { @@ -72,7 +72,7 @@ Signed-off-by: Kalle Valo fws->credits_borrowed[lender_ac]++; fws->fifo_credit[lender_ac]--; if (fws->fifo_credit[lender_ac] == 0) -@@ -2216,8 +2222,9 @@ static void brcmf_fws_dequeue_worker(str +@@ -2220,8 +2226,9 @@ static void brcmf_fws_dequeue_worker(str } continue; } @@ -84,7 +84,7 @@ Signed-off-by: Kalle Valo skb = brcmf_fws_deq(fws, fifo); if (!skb) break; -@@ -2228,7 +2235,7 @@ static void brcmf_fws_dequeue_worker(str +@@ -2232,7 +2239,7 @@ static void brcmf_fws_dequeue_worker(str break; } if ((fifo == BRCMF_FWS_FIFO_AC_BE) && diff --git a/package/kernel/mac80211/patches/brcm/328-v5.0-0003-brcmfmac-handle-compressed-tx-status-signal.patch b/package/kernel/mac80211/patches/brcm/328-v5.0-0003-brcmfmac-handle-compressed-tx-status-signal.patch index bf72dcabc1..8b7f5a86d5 100644 --- a/package/kernel/mac80211/patches/brcm/328-v5.0-0003-brcmfmac-handle-compressed-tx-status-signal.patch +++ b/package/kernel/mac80211/patches/brcm/328-v5.0-0003-brcmfmac-handle-compressed-tx-status-signal.patch @@ -18,7 +18,7 @@ Signed-off-by: Kalle Valo --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -@@ -1459,9 +1459,10 @@ static int brcmf_fws_txstatus_suppressed +@@ -1463,9 +1463,10 @@ static int brcmf_fws_txstatus_suppressed static int brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot, @@ -30,7 +30,7 @@ Signed-off-by: Kalle Valo int ret; bool remove_from_hanger = true; struct sk_buff *skb; -@@ -1472,60 +1473,71 @@ brcmf_fws_txs_process(struct brcmf_fws_i +@@ -1476,60 +1477,71 @@ brcmf_fws_txs_process(struct brcmf_fws_i brcmf_dbg(DATA, "flags %d\n", flags); if (flags == BRCMF_FWS_TXSTATUS_DISCARD) @@ -144,7 +144,7 @@ Signed-off-by: Kalle Valo return 0; } -@@ -1551,7 +1563,8 @@ static int brcmf_fws_fifocreditback_indi +@@ -1555,7 +1567,8 @@ static int brcmf_fws_fifocreditback_indi return BRCMF_FWS_RET_OK_SCHEDULE; } @@ -154,7 +154,7 @@ Signed-off-by: Kalle Valo { __le32 status_le; __le16 seq_le; -@@ -1560,23 +1573,31 @@ static int brcmf_fws_txstatus_indicate(s +@@ -1564,23 +1577,31 @@ static int brcmf_fws_txstatus_indicate(s u32 genbit; u8 flags; u16 seq; @@ -189,7 +189,7 @@ Signed-off-by: Kalle Valo brcmf_fws_unlock(fws); return BRCMF_FWS_RET_OK_NOSCHEDULE; } -@@ -1892,8 +1913,6 @@ void brcmf_fws_hdrpull(struct brcmf_if * +@@ -1896,8 +1917,6 @@ void brcmf_fws_hdrpull(struct brcmf_if * err = BRCMF_FWS_RET_OK_NOSCHEDULE; switch (type) { @@ -198,7 +198,7 @@ Signed-off-by: Kalle Valo case BRCMF_FWS_TYPE_HOST_REORDER_RXPKTS: rd = (struct brcmf_skb_reorder_data *)skb->cb; rd->reorder = data; -@@ -1916,7 +1935,8 @@ void brcmf_fws_hdrpull(struct brcmf_if * +@@ -1920,7 +1939,8 @@ void brcmf_fws_hdrpull(struct brcmf_if * err = brcmf_fws_request_indicate(fws, type, data); break; case BRCMF_FWS_TYPE_TXSTATUS: @@ -208,7 +208,7 @@ Signed-off-by: Kalle Valo break; case BRCMF_FWS_TYPE_FIFO_CREDITBACK: err = brcmf_fws_fifocreditback_indicate(fws, data); -@@ -2005,7 +2025,7 @@ static void brcmf_fws_rollback_toq(struc +@@ -2009,7 +2029,7 @@ static void brcmf_fws_rollback_toq(struc fws->stats.rollback_failed++; hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT); brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, @@ -217,7 +217,7 @@ Signed-off-by: Kalle Valo } else { fws->stats.rollback_success++; brcmf_fws_return_credits(fws, fifo, 1); -@@ -2476,7 +2496,8 @@ void brcmf_fws_bustxfail(struct brcmf_fw +@@ -2480,7 +2500,8 @@ void brcmf_fws_bustxfail(struct brcmf_fw } brcmf_fws_lock(fws); hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT); diff --git a/package/kernel/mac80211/patches/brcm/329-v5.0-0004-brcmfmac-add-support-for-CYW43012-SDIO-chipset.patch b/package/kernel/mac80211/patches/brcm/329-v5.0-0004-brcmfmac-add-support-for-CYW43012-SDIO-chipset.patch index d572c52130..bfa0baeb4e 100644 --- a/package/kernel/mac80211/patches/brcm/329-v5.0-0004-brcmfmac-add-support-for-CYW43012-SDIO-chipset.patch +++ b/package/kernel/mac80211/patches/brcm/329-v5.0-0004-brcmfmac-add-support-for-CYW43012-SDIO-chipset.patch @@ -209,7 +209,7 @@ Signed-off-by: Kalle Valo if (err) { brcmf_err("error writing SBSDIO_FUNC1_CHIPCLKCSR\n"); return; -@@ -4067,7 +4114,7 @@ static void brcmf_sdio_firmware_callback +@@ -4071,7 +4118,7 @@ static void brcmf_sdio_firmware_callback const struct firmware *code; void *nvram; u32 nvram_len; @@ -218,7 +218,7 @@ Signed-off-by: Kalle Valo u8 devctl; brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err); -@@ -4101,8 +4148,11 @@ static void brcmf_sdio_firmware_callback +@@ -4105,8 +4152,11 @@ static void brcmf_sdio_firmware_callback /* Force clocks on backplane to be sure F2 interrupt propagates */ saveclk = brcmf_sdiod_readb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR, &err); if (!err) { diff --git a/package/kernel/mac80211/patches/brcm/329-v5.0-0006-brcmfmac-update-43012-F2-watermark-setting-to-fix-DM.patch b/package/kernel/mac80211/patches/brcm/329-v5.0-0006-brcmfmac-update-43012-F2-watermark-setting-to-fix-DM.patch index 64e70b5170..a65e35139b 100644 --- a/package/kernel/mac80211/patches/brcm/329-v5.0-0006-brcmfmac-update-43012-F2-watermark-setting-to-fix-DM.patch +++ b/package/kernel/mac80211/patches/brcm/329-v5.0-0006-brcmfmac-update-43012-F2-watermark-setting-to-fix-DM.patch @@ -29,7 +29,7 @@ Signed-off-by: Kalle Valo #ifdef DEBUG -@@ -4189,6 +4190,17 @@ static void brcmf_sdio_firmware_callback +@@ -4193,6 +4194,17 @@ static void brcmf_sdio_firmware_callback CY_4373_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB, &err); break; diff --git a/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch b/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch index f77a2d3f28..b95080cd22 100644 --- a/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch +++ b/package/kernel/mac80211/patches/brcm/349-v5.1-0005-brcmfmac-check-and-dump-trap-info-during-sdio-probe.patch @@ -81,7 +81,7 @@ Signed-off-by: Kalle Valo return 0; } -@@ -4213,7 +4229,7 @@ static void brcmf_sdio_firmware_callback +@@ -4217,7 +4233,7 @@ static void brcmf_sdio_firmware_callback } else { /* Disable F2 again */ sdio_disable_func(sdiod->func2); @@ -90,7 +90,7 @@ Signed-off-by: Kalle Valo } if (brcmf_chip_sr_capable(bus->ci)) { -@@ -4234,8 +4250,10 @@ static void brcmf_sdio_firmware_callback +@@ -4238,8 +4254,10 @@ static void brcmf_sdio_firmware_callback } /* If we didn't come up, turn off backplane clock */ @@ -102,7 +102,7 @@ Signed-off-by: Kalle Valo sdio_release_host(sdiod->func1); -@@ -4249,12 +4267,15 @@ static void brcmf_sdio_firmware_callback +@@ -4253,12 +4271,15 @@ static void brcmf_sdio_firmware_callback err = brcmf_attach(sdiod->dev, sdiod->settings); if (err != 0) { brcmf_err("brcmf_attach failed\n"); diff --git a/package/kernel/mac80211/patches/brcm/354-v5.1-brcmfmac-use-bphy_err-in-all-wiphy-related-code.patch b/package/kernel/mac80211/patches/brcm/354-v5.1-brcmfmac-use-bphy_err-in-all-wiphy-related-code.patch index 3d1bcd3d6c..0534800f1d 100644 --- a/package/kernel/mac80211/patches/brcm/354-v5.1-brcmfmac-use-bphy_err-in-all-wiphy-related-code.patch +++ b/package/kernel/mac80211/patches/brcm/354-v5.1-brcmfmac-use-bphy_err-in-all-wiphy-related-code.patch @@ -690,7 +690,7 @@ Signed-off-by: Kalle Valo ifp->bsscfgidx, name, len); --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -@@ -1259,6 +1259,7 @@ static int brcmf_fws_enq(struct brcmf_fw +@@ -1263,6 +1263,7 @@ static int brcmf_fws_enq(struct brcmf_fw enum brcmf_fws_skb_state state, int fifo, struct sk_buff *p) { @@ -698,7 +698,7 @@ Signed-off-by: Kalle Valo int prec = 2 * fifo; u32 *qfull_stat = &fws->stats.delayq_full_error; struct brcmf_fws_mac_descriptor *entry; -@@ -1271,7 +1272,7 @@ static int brcmf_fws_enq(struct brcmf_fw +@@ -1275,7 +1276,7 @@ static int brcmf_fws_enq(struct brcmf_fw entry = brcmf_skbcb(p)->mac; if (entry == NULL) { @@ -707,7 +707,7 @@ Signed-off-by: Kalle Valo return -ENOENT; } -@@ -1461,6 +1462,7 @@ static int +@@ -1465,6 +1466,7 @@ static int brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot, u32 genbit, u16 seq, u8 compcnt) { @@ -715,7 +715,7 @@ Signed-off-by: Kalle Valo u32 fifo; u8 cnt = 0; int ret; -@@ -1485,14 +1487,14 @@ brcmf_fws_txs_process(struct brcmf_fws_i +@@ -1489,14 +1491,14 @@ brcmf_fws_txs_process(struct brcmf_fws_i else if (flags == BRCMF_FWS_TXSTATUS_HOST_TOSSED) fws->stats.txs_host_tossed += compcnt; else @@ -733,7 +733,7 @@ Signed-off-by: Kalle Valo goto cont; } -@@ -1616,12 +1618,13 @@ static int brcmf_fws_notify_credit_map(s +@@ -1620,12 +1622,13 @@ static int brcmf_fws_notify_credit_map(s const struct brcmf_event_msg *e, void *data) { @@ -749,7 +749,7 @@ Signed-off-by: Kalle Valo return -EINVAL; } -@@ -1685,6 +1688,7 @@ static void brcmf_rxreorder_get_skb_list +@@ -1689,6 +1692,7 @@ static void brcmf_rxreorder_get_skb_list void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt) { @@ -757,7 +757,7 @@ Signed-off-by: Kalle Valo u8 *reorder_data; u8 flow_id, max_idx, cur_idx, exp_idx, end_idx; struct brcmf_ampdu_rx_reorder *rfi; -@@ -1699,7 +1703,7 @@ void brcmf_fws_rxreorder(struct brcmf_if +@@ -1703,7 +1707,7 @@ void brcmf_fws_rxreorder(struct brcmf_if /* validate flags and flow id */ if (flags == 0xFF) { @@ -766,7 +766,7 @@ Signed-off-by: Kalle Valo brcmf_netif_rx(ifp, pkt); return; } -@@ -1736,7 +1740,7 @@ void brcmf_fws_rxreorder(struct brcmf_if +@@ -1740,7 +1744,7 @@ void brcmf_fws_rxreorder(struct brcmf_if flow_id, max_idx); rfi = kzalloc(buf_size, GFP_ATOMIC); if (rfi == NULL) { @@ -775,7 +775,7 @@ Signed-off-by: Kalle Valo brcmf_netif_rx(ifp, pkt); return; } -@@ -2000,6 +2004,7 @@ static u8 brcmf_fws_precommit_skb(struct +@@ -2004,6 +2008,7 @@ static u8 brcmf_fws_precommit_skb(struct static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, struct sk_buff *skb, int fifo) { @@ -783,7 +783,7 @@ Signed-off-by: Kalle Valo struct brcmf_fws_mac_descriptor *entry; struct sk_buff *pktout; int qidx, hslot; -@@ -2013,11 +2018,11 @@ static void brcmf_fws_rollback_toq(struc +@@ -2017,11 +2022,11 @@ static void brcmf_fws_rollback_toq(struc pktout = brcmu_pktq_penq_head(&entry->psq, qidx, skb); if (pktout == NULL) { @@ -797,7 +797,7 @@ Signed-off-by: Kalle Valo rc = -ENOENT; } -@@ -2122,7 +2127,8 @@ static int brcmf_fws_assign_htod(struct +@@ -2126,7 +2131,8 @@ static int brcmf_fws_assign_htod(struct int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb) { @@ -807,7 +807,7 @@ Signed-off-by: Kalle Valo struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb); struct ethhdr *eh = (struct ethhdr *)(skb->data); int fifo = BRCMF_FWS_FIFO_BCMC; -@@ -2150,7 +2156,7 @@ int brcmf_fws_process_skb(struct brcmf_i +@@ -2154,7 +2160,7 @@ int brcmf_fws_process_skb(struct brcmf_i brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb); brcmf_fws_schedule_deq(fws); } else { @@ -816,7 +816,7 @@ Signed-off-by: Kalle Valo brcmf_txfinalize(ifp, skb, false); rc = -ENOMEM; } -@@ -2371,7 +2377,7 @@ struct brcmf_fws_info *brcmf_fws_attach( +@@ -2375,7 +2381,7 @@ struct brcmf_fws_info *brcmf_fws_attach( fws->fws_wq = create_singlethread_workqueue("brcmf_fws_wq"); if (fws->fws_wq == NULL) { @@ -825,7 +825,7 @@ Signed-off-by: Kalle Valo rc = -EBADF; goto fail; } -@@ -2387,13 +2393,13 @@ struct brcmf_fws_info *brcmf_fws_attach( +@@ -2391,13 +2397,13 @@ struct brcmf_fws_info *brcmf_fws_attach( rc = brcmf_fweh_register(drvr, BRCMF_E_FIFO_CREDIT_MAP, brcmf_fws_notify_credit_map); if (rc < 0) { @@ -841,7 +841,7 @@ Signed-off-by: Kalle Valo brcmf_fweh_unregister(drvr, BRCMF_E_FIFO_CREDIT_MAP); goto fail; } -@@ -2405,7 +2411,7 @@ struct brcmf_fws_info *brcmf_fws_attach( +@@ -2409,7 +2415,7 @@ struct brcmf_fws_info *brcmf_fws_attach( fws->fw_signals = true; ifp = brcmf_get_ifp(drvr, 0); if (brcmf_fil_iovar_int_set(ifp, "tlv", tlv)) { diff --git a/package/kernel/mac80211/patches/brcm/384-v5.4-0001-Revert-brcmfmac-fix-NULL-pointer-derefence-during-US.patch b/package/kernel/mac80211/patches/brcm/384-v5.4-0001-Revert-brcmfmac-fix-NULL-pointer-derefence-during-US.patch index b01db877bb..0880943443 100644 --- a/package/kernel/mac80211/patches/brcm/384-v5.4-0001-Revert-brcmfmac-fix-NULL-pointer-derefence-during-US.patch +++ b/package/kernel/mac80211/patches/brcm/384-v5.4-0001-Revert-brcmfmac-fix-NULL-pointer-derefence-during-US.patch @@ -85,7 +85,7 @@ Signed-off-by: Kalle Valo wiphy_free(drvr->wiphy); --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -@@ -2432,25 +2432,17 @@ struct brcmf_fws_info *brcmf_fws_attach( +@@ -2436,25 +2436,17 @@ struct brcmf_fws_info *brcmf_fws_attach( return fws; fail: diff --git a/package/kernel/mac80211/patches/brcm/392-v5.4-0002-brcmfmac-split-brcmf_attach-and-brcmf_detach-functio.patch b/package/kernel/mac80211/patches/brcm/392-v5.4-0002-brcmfmac-split-brcmf_attach-and-brcmf_detach-functio.patch index d1a2d8d7c7..19b571e7f5 100644 --- a/package/kernel/mac80211/patches/brcm/392-v5.4-0002-brcmfmac-split-brcmf_attach-and-brcmf_detach-functio.patch +++ b/package/kernel/mac80211/patches/brcm/392-v5.4-0002-brcmfmac-split-brcmf_attach-and-brcmf_detach-functio.patch @@ -153,7 +153,7 @@ Signed-off-by: Kalle Valo kfree(bus->msgbuf->flowrings); --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4254,17 +4254,26 @@ static void brcmf_sdio_firmware_callback +@@ -4258,17 +4258,26 @@ static void brcmf_sdio_firmware_callback sdiod->bus_if->chip = bus->ci->chip; sdiod->bus_if->chiprev = bus->ci->chiprev; diff --git a/package/kernel/mac80211/patches/brcm/414-v5.6-0002-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch b/package/kernel/mac80211/patches/brcm/414-v5.6-0002-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch index 8d88fbfc84..11cce22e06 100644 --- a/package/kernel/mac80211/patches/brcm/414-v5.6-0002-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch +++ b/package/kernel/mac80211/patches/brcm/414-v5.6-0002-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch @@ -57,7 +57,7 @@ Signed-off-by: Kalle Valo #ifdef DEBUG -@@ -4212,6 +4214,19 @@ static void brcmf_sdio_firmware_callback +@@ -4216,6 +4218,19 @@ static void brcmf_sdio_firmware_callback brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl, &err); break; diff --git a/package/kernel/mac80211/patches/brcm/417-v5.6-brcmfmac-use-true-false-for-bool-variable.patch b/package/kernel/mac80211/patches/brcm/417-v5.6-brcmfmac-use-true-false-for-bool-variable.patch index 0eb169c2d3..0a4d776152 100644 --- a/package/kernel/mac80211/patches/brcm/417-v5.6-brcmfmac-use-true-false-for-bool-variable.patch +++ b/package/kernel/mac80211/patches/brcm/417-v5.6-brcmfmac-use-true-false-for-bool-variable.patch @@ -16,7 +16,7 @@ Signed-off-by: Kalle Valo --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -@@ -908,7 +908,7 @@ static u8 brcmf_fws_hdrpush(struct brcmf +@@ -912,7 +912,7 @@ static u8 brcmf_fws_hdrpush(struct brcmf wlh += wlh[1] + 2; if (entry->send_tim_signal) { diff --git a/package/kernel/mac80211/patches/brcm/418-v5.6-brcmfmac-sdio-Fix-OOB-interrupt-initialization-on-br.patch b/package/kernel/mac80211/patches/brcm/418-v5.6-brcmfmac-sdio-Fix-OOB-interrupt-initialization-on-br.patch index 66c710a928..ad8ef9e4c3 100644 --- a/package/kernel/mac80211/patches/brcm/418-v5.6-brcmfmac-sdio-Fix-OOB-interrupt-initialization-on-br.patch +++ b/package/kernel/mac80211/patches/brcm/418-v5.6-brcmfmac-sdio-Fix-OOB-interrupt-initialization-on-br.patch @@ -29,7 +29,7 @@ Signed-off-by: Kalle Valo --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4249,6 +4249,12 @@ static void brcmf_sdio_firmware_callback +@@ -4253,6 +4253,12 @@ static void brcmf_sdio_firmware_callback } if (err == 0) { @@ -42,7 +42,7 @@ Signed-off-by: Kalle Valo /* Allow full data communication using DPC from now on. */ brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); -@@ -4265,12 +4271,6 @@ static void brcmf_sdio_firmware_callback +@@ -4269,12 +4275,6 @@ static void brcmf_sdio_firmware_callback sdio_release_host(sdiod->func1); diff --git a/package/kernel/mac80211/patches/subsys/090-wireless-Use-linux-stddef.h-instead-of-stddef.h.patch b/package/kernel/mac80211/patches/subsys/090-wireless-Use-linux-stddef.h-instead-of-stddef.h.patch deleted file mode 100644 index 1661d2726b..0000000000 --- a/package/kernel/mac80211/patches/subsys/090-wireless-Use-linux-stddef.h-instead-of-stddef.h.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 1b9ae0c92925ac40489be526d67d0010d0724ce0 Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Thu, 21 May 2020 22:14:22 +0200 -Subject: [PATCH] wireless: Use linux/stddef.h instead of stddef.h - -When compiling inside the kernel include linux/stddef.h instead of -stddef.h. When I compile this header file in backports for power PC I -run into a conflict with ptrdiff_t. I was unable to reproduce this in -mainline kernel. I still would like to fix this problem in the kernel. - -Fixes: 6989310f5d43 ("wireless: Use offsetof instead of custom macro.") -Signed-off-by: Hauke Mehrtens -Link: https://lore.kernel.org/r/20200521201422.16493-1-hauke@hauke-m.de -Signed-off-by: Johannes Berg ---- - include/uapi/linux/wireless.h | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - ---- a/include/uapi/linux/wireless.h -+++ b/include/uapi/linux/wireless.h -@@ -74,7 +74,11 @@ - #include /* for "struct sockaddr" et al */ - #include /* for IFNAMSIZ and co... */ - --#include /* for offsetof */ -+#ifdef __KERNEL__ -+# include /* for offsetof */ -+#else -+# include /* for offsetof */ -+#endif - - /***************************** VERSION *****************************/ - /* diff --git a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch index 6775884a34..6650a876eb 100644 --- a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch +++ b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch @@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1067,7 +1067,6 @@ static int ieee80211_stop_ap(struct wiph +@@ -1068,7 +1068,6 @@ static int ieee80211_stop_ap(struct wiph sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; __sta_info_flush(sdata, true); diff --git a/package/kernel/mac80211/patches/subsys/140-tweak-TSQ-setting.patch b/package/kernel/mac80211/patches/subsys/140-tweak-TSQ-setting.patch index a1c01e2803..26c55560e3 100644 --- a/package/kernel/mac80211/patches/subsys/140-tweak-TSQ-setting.patch +++ b/package/kernel/mac80211/patches/subsys/140-tweak-TSQ-setting.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3822,6 +3822,12 @@ out: +@@ -3833,6 +3833,12 @@ out: netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev) { diff --git a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch index 6c8da3651e..c63275baaf 100644 --- a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch +++ b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2189,7 +2189,7 @@ static int ieee80211_scan(struct wiphy * +@@ -2190,7 +2190,7 @@ static int ieee80211_scan(struct wiphy * * the frames sent while scanning on other channel will be * lost) */ diff --git a/package/kernel/mac80211/patches/subsys/300-mac80211-add-stop-start-logic-for-software-TXQs.patch b/package/kernel/mac80211/patches/subsys/300-mac80211-add-stop-start-logic-for-software-TXQs.patch index afb88dbe67..5f858000c3 100644 --- a/package/kernel/mac80211/patches/subsys/300-mac80211-add-stop-start-logic-for-software-TXQs.patch +++ b/package/kernel/mac80211/patches/subsys/300-mac80211-add-stop-start-logic-for-software-TXQs.patch @@ -100,7 +100,7 @@ Signed-off-by: Johannes Berg (unsigned long) local); --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3487,13 +3487,19 @@ struct sk_buff *ieee80211_tx_dequeue(str +@@ -3498,13 +3498,19 @@ struct sk_buff *ieee80211_tx_dequeue(str struct ieee80211_tx_info *info; struct ieee80211_tx_data tx; ieee80211_tx_result r; @@ -122,7 +122,7 @@ Signed-off-by: Johannes Berg /* Make sure fragments stay together. */ skb = __skb_dequeue(&txqi->frags); if (skb) -@@ -3606,6 +3612,7 @@ begin: +@@ -3617,6 +3623,7 @@ begin: } IEEE80211_SKB_CB(skb)->control.vif = vif; diff --git a/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel-remove-unnecessary-debugfs-cleanup.patch b/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel-remove-unnecessary-debugfs-cleanup.patch index 855babeccb..34a72eff30 100644 --- a/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel-remove-unnecessary-debugfs-cleanup.patch +++ b/package/kernel/mac80211/patches/subsys/304-mac80211-minstrel-remove-unnecessary-debugfs-cleanup.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/net/mac80211/rc80211_minstrel.c +++ b/net/mac80211/rc80211_minstrel.c -@@ -689,8 +689,8 @@ minstrel_alloc(struct ieee80211_hw *hw, +@@ -672,8 +672,8 @@ minstrel_alloc(struct ieee80211_hw *hw, #ifdef CPTCFG_MAC80211_DEBUGFS mp->fixed_rate_idx = (u32) -1; @@ -21,7 +21,7 @@ Signed-off-by: Felix Fietkau #endif minstrel_init_cck_rates(mp); -@@ -701,9 +701,6 @@ minstrel_alloc(struct ieee80211_hw *hw, +@@ -684,9 +684,6 @@ minstrel_alloc(struct ieee80211_hw *hw, static void minstrel_free(void *priv) { @@ -31,7 +31,7 @@ Signed-off-by: Felix Fietkau kfree(priv); } -@@ -735,7 +732,6 @@ const struct rate_control_ops mac80211_m +@@ -718,7 +715,6 @@ const struct rate_control_ops mac80211_m .free_sta = minstrel_free_sta, #ifdef CPTCFG_MAC80211_DEBUGFS .add_sta_debugfs = minstrel_add_sta_debugfs, @@ -41,7 +41,7 @@ Signed-off-by: Felix Fietkau }; --- a/net/mac80211/rc80211_minstrel.h +++ b/net/mac80211/rc80211_minstrel.h -@@ -109,11 +109,6 @@ struct minstrel_sta_info { +@@ -108,11 +108,6 @@ struct minstrel_sta_info { /* sampling table */ u8 *sample_table; @@ -53,7 +53,7 @@ Signed-off-by: Felix Fietkau }; struct minstrel_priv { -@@ -137,7 +132,6 @@ struct minstrel_priv { +@@ -136,7 +131,6 @@ struct minstrel_priv { * - setting will be applied on next update */ u32 fixed_rate_idx; @@ -61,7 +61,7 @@ Signed-off-by: Felix Fietkau #endif }; -@@ -156,7 +150,6 @@ minstrel_get_ewmsd10(struct minstrel_rat +@@ -155,7 +149,6 @@ minstrel_get_ewmsd10(struct minstrel_rat extern const struct rate_control_ops mac80211_minstrel; void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir); diff --git a/package/kernel/mac80211/patches/subsys/305-mac80211-minstrel-merge-with-minstrel_ht-always-enab.patch b/package/kernel/mac80211/patches/subsys/305-mac80211-minstrel-merge-with-minstrel_ht-always-enab.patch index fca3189e6d..785ca3cc18 100644 --- a/package/kernel/mac80211/patches/subsys/305-mac80211-minstrel-merge-with-minstrel_ht-always-enab.patch +++ b/package/kernel/mac80211/patches/subsys/305-mac80211-minstrel-merge-with-minstrel_ht-always-enab.patch @@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau #endif /* IEEE80211_RATE_H */ --- a/net/mac80211/rc80211_minstrel.c +++ b/net/mac80211/rc80211_minstrel.c -@@ -572,138 +572,6 @@ minstrel_rate_init(void *priv, struct ie +@@ -555,138 +555,6 @@ minstrel_rate_init(void *priv, struct ie minstrel_update_rates(mp, mi); } @@ -256,7 +256,7 @@ Signed-off-by: Felix Fietkau static u32 minstrel_get_expected_throughput(void *priv_sta) { struct minstrel_sta_info *mi = priv_sta; -@@ -722,28 +590,8 @@ static u32 minstrel_get_expected_through +@@ -705,28 +573,8 @@ static u32 minstrel_get_expected_through } const struct rate_control_ops mac80211_minstrel = { @@ -287,7 +287,7 @@ Signed-off-by: Felix Fietkau -} --- a/net/mac80211/rc80211_minstrel.h +++ b/net/mac80211/rc80211_minstrel.h -@@ -158,7 +158,5 @@ int minstrel_get_tp_avg(struct minstrel_ +@@ -157,7 +157,5 @@ int minstrel_get_tp_avg(struct minstrel_ /* debugfs */ int minstrel_stats_open(struct inode *inode, struct file *file); int minstrel_stats_csv_open(struct inode *inode, struct file *file); diff --git a/package/kernel/mac80211/patches/subsys/316-mac80211-minstrel_ht-improve-rate-probing-for-device.patch b/package/kernel/mac80211/patches/subsys/316-mac80211-minstrel_ht-improve-rate-probing-for-device.patch index 07d59e0ed7..0185164ce0 100644 --- a/package/kernel/mac80211/patches/subsys/316-mac80211-minstrel_ht-improve-rate-probing-for-device.patch +++ b/package/kernel/mac80211/patches/subsys/316-mac80211-minstrel_ht-improve-rate-probing-for-device.patch @@ -41,7 +41,7 @@ Signed-off-by: Felix Fietkau --- a/net/mac80211/rc80211_minstrel.h +++ b/net/mac80211/rc80211_minstrel.h -@@ -114,6 +114,7 @@ struct minstrel_sta_info { +@@ -113,6 +113,7 @@ struct minstrel_sta_info { struct minstrel_priv { struct ieee80211_hw *hw; bool has_mrr; diff --git a/package/kernel/mac80211/patches/subsys/320-mac80211-Add-TXQ-scheduling-API.patch b/package/kernel/mac80211/patches/subsys/320-mac80211-Add-TXQ-scheduling-API.patch index 3c38a9f78f..71088be87a 100644 --- a/package/kernel/mac80211/patches/subsys/320-mac80211-Add-TXQ-scheduling-API.patch +++ b/package/kernel/mac80211/patches/subsys/320-mac80211-Add-TXQ-scheduling-API.patch @@ -191,7 +191,7 @@ Signed-off-by: Johannes Berg --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c -@@ -1249,7 +1249,7 @@ void ieee80211_sta_ps_deliver_wakeup(str +@@ -1261,7 +1261,7 @@ void ieee80211_sta_ps_deliver_wakeup(str if (!txq_has_queue(sta->sta.txq[i])) continue; @@ -229,7 +229,7 @@ Signed-off-by: Johannes Berg return true; } -@@ -3620,6 +3624,60 @@ out: +@@ -3631,6 +3635,60 @@ out: } EXPORT_SYMBOL(ieee80211_tx_dequeue); diff --git a/package/kernel/mac80211/patches/subsys/321-cfg80211-Add-airtime-statistics-and-settings.patch b/package/kernel/mac80211/patches/subsys/321-cfg80211-Add-airtime-statistics-and-settings.patch index ff2dc35129..e1a3fe38e1 100644 --- a/package/kernel/mac80211/patches/subsys/321-cfg80211-Add-airtime-statistics-and-settings.patch +++ b/package/kernel/mac80211/patches/subsys/321-cfg80211-Add-airtime-statistics-and-settings.patch @@ -156,7 +156,7 @@ Signed-off-by: Johannes Berg }; /* policy for the key attributes */ -@@ -4709,6 +4710,11 @@ static int nl80211_send_station(struct s +@@ -4715,6 +4716,11 @@ static int nl80211_send_station(struct s PUT_SINFO(PLID, plid, u16); PUT_SINFO(PLINK_STATE, plink_state, u8); PUT_SINFO_U64(RX_DURATION, rx_duration); @@ -168,7 +168,7 @@ Signed-off-by: Johannes Berg switch (rdev->wiphy.signal_type) { case CFG80211_SIGNAL_TYPE_MBM: -@@ -5345,6 +5351,15 @@ static int nl80211_set_station(struct sk +@@ -5351,6 +5357,15 @@ static int nl80211_set_station(struct sk nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); } @@ -184,7 +184,7 @@ Signed-off-by: Johannes Berg /* Include parameters for TDLS peer (will check later) */ err = nl80211_set_station_tdls(info, ¶ms); if (err) -@@ -5483,6 +5498,15 @@ static int nl80211_new_station(struct sk +@@ -5489,6 +5504,15 @@ static int nl80211_new_station(struct sk return -EINVAL; } diff --git a/package/kernel/mac80211/patches/subsys/322-mac80211-Add-airtime-accounting-and-scheduling-to-TX.patch b/package/kernel/mac80211/patches/subsys/322-mac80211-Add-airtime-accounting-and-scheduling-to-TX.patch index a09cf3d749..d028ee2496 100644 --- a/package/kernel/mac80211/patches/subsys/322-mac80211-Add-airtime-accounting-and-scheduling-to-TX.patch +++ b/package/kernel/mac80211/patches/subsys/322-mac80211-Add-airtime-accounting-and-scheduling-to-TX.patch @@ -125,7 +125,7 @@ Signed-off-by: Johannes Berg * The values are not guaranteed to be coherent with regard to each other, i.e. --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1390,6 +1390,9 @@ static int sta_apply_parameters(struct i +@@ -1391,6 +1391,9 @@ static int sta_apply_parameters(struct i if (ieee80211_vif_is_mesh(&sdata->vif)) sta_apply_mesh_params(local, sta, params); @@ -289,7 +289,7 @@ Signed-off-by: Johannes Berg } } -@@ -381,9 +378,12 @@ struct sta_info *sta_info_alloc(struct i +@@ -399,9 +396,12 @@ struct sta_info *sta_info_alloc(struct i if (sta_prepare_rate_control(local, sta, gfp)) goto free_txq; @@ -302,7 +302,7 @@ Signed-off-by: Johannes Berg } for (i = 0; i < IEEE80211_NUM_TIDS; i++) -@@ -1826,6 +1826,27 @@ void ieee80211_sta_set_buffered(struct i +@@ -1838,6 +1838,27 @@ void ieee80211_sta_set_buffered(struct i } EXPORT_SYMBOL(ieee80211_sta_set_buffered); @@ -330,7 +330,7 @@ Signed-off-by: Johannes Berg int sta_info_move_state(struct sta_info *sta, enum ieee80211_sta_state new_state) { -@@ -2192,6 +2213,23 @@ void sta_set_sinfo(struct sta_info *sta, +@@ -2208,6 +2229,23 @@ void sta_set_sinfo(struct sta_info *sta, sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); } @@ -412,7 +412,7 @@ Signed-off-by: Johannes Berg spin_lock_bh(&local->active_txq_lock[txqi->txq.ac]); list_del_init(&txqi->schedule_order); spin_unlock_bh(&local->active_txq_lock[txqi->txq.ac]); -@@ -3631,11 +3634,28 @@ struct ieee80211_txq *ieee80211_next_txq +@@ -3642,11 +3645,28 @@ struct ieee80211_txq *ieee80211_next_txq lockdep_assert_held(&local->active_txq_lock[ac]); @@ -442,7 +442,7 @@ Signed-off-by: Johannes Berg return NULL; list_del_init(&txqi->schedule_order); -@@ -3653,12 +3673,74 @@ void ieee80211_return_txq(struct ieee802 +@@ -3664,12 +3684,74 @@ void ieee80211_return_txq(struct ieee802 lockdep_assert_held(&local->active_txq_lock[txq->ac]); if (list_empty(&txqi->schedule_order) && diff --git a/package/kernel/mac80211/patches/subsys/323-mac80211-Expose-ieee80211_schedule_txq-function.patch b/package/kernel/mac80211/patches/subsys/323-mac80211-Expose-ieee80211_schedule_txq-function.patch index 06981fdc09..ca70f6a8fa 100644 --- a/package/kernel/mac80211/patches/subsys/323-mac80211-Expose-ieee80211_schedule_txq-function.patch +++ b/package/kernel/mac80211/patches/subsys/323-mac80211-Expose-ieee80211_schedule_txq-function.patch @@ -51,7 +51,7 @@ Signed-off-by: Johannes Berg --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3693,6 +3693,19 @@ void ieee80211_return_txq(struct ieee802 +@@ -3704,6 +3704,19 @@ void ieee80211_return_txq(struct ieee802 } EXPORT_SYMBOL(ieee80211_return_txq); diff --git a/package/kernel/mac80211/patches/subsys/331-mac80211-do-not-allow-bigger-VHT-MPDUs-than-the-hard.patch b/package/kernel/mac80211/patches/subsys/331-mac80211-do-not-allow-bigger-VHT-MPDUs-than-the-hard.patch deleted file mode 100644 index ce39fe0d8b..0000000000 --- a/package/kernel/mac80211/patches/subsys/331-mac80211-do-not-allow-bigger-VHT-MPDUs-than-the-hard.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Felix Fietkau -Date: Thu, 17 Sep 2020 12:07:19 +0200 -Subject: [PATCH] mac80211: do not allow bigger VHT MPDUs than the hardware - supports - -Limit maximum VHT MPDU size by local capability - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/vht.c -+++ b/net/mac80211/vht.c -@@ -170,10 +170,7 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(stru - /* take some capabilities as-is */ - cap_info = le32_to_cpu(vht_cap_ie->vht_cap_info); - vht_cap->cap = cap_info; -- vht_cap->cap &= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 | -- IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 | -- IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 | -- IEEE80211_VHT_CAP_RXLDPC | -+ vht_cap->cap &= IEEE80211_VHT_CAP_RXLDPC | - IEEE80211_VHT_CAP_VHT_TXOP_PS | - IEEE80211_VHT_CAP_HTC_VHT | - IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK | -@@ -182,6 +179,9 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(stru - IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN | - IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN; - -+ vht_cap->cap |= min_t(u32, cap_info & IEEE80211_VHT_CAP_MAX_MPDU_MASK, -+ own_cap.cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK); -+ - /* and some based on our own capabilities */ - switch (own_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { - case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ: diff --git a/package/kernel/mac80211/patches/subsys/350-mac80211-add-hdrlen-to-ieee80211_tx_data.patch b/package/kernel/mac80211/patches/subsys/350-mac80211-add-hdrlen-to-ieee80211_tx_data.patch index 7520b4ddc9..a46710a94c 100644 --- a/package/kernel/mac80211/patches/subsys/350-mac80211-add-hdrlen-to-ieee80211_tx_data.patch +++ b/package/kernel/mac80211/patches/subsys/350-mac80211-add-hdrlen-to-ieee80211_tx_data.patch @@ -48,7 +48,7 @@ Signed-off-by: Felix Fietkau if (likely(sta)) { if (!IS_ERR(sta)) tx->sta = sta; -@@ -3525,6 +3525,7 @@ begin: +@@ -3536,6 +3536,7 @@ begin: tx.local = local; tx.skb = skb; tx.sdata = vif_to_sdata(info->control.vif); @@ -56,7 +56,7 @@ Signed-off-by: Felix Fietkau if (txq->sta) { tx.sta = container_of(txq->sta, struct sta_info, sta); -@@ -3569,7 +3570,7 @@ begin: +@@ -3580,7 +3581,7 @@ begin: if (tx.key && (tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) @@ -65,7 +65,7 @@ Signed-off-by: Felix Fietkau ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, tx.key, skb); -@@ -4028,6 +4029,7 @@ ieee80211_build_data_template(struct iee +@@ -4039,6 +4040,7 @@ ieee80211_build_data_template(struct iee hdr = (void *)skb->data; tx.sta = sta_info_get(sdata, hdr->addr1); tx.skb = skb; diff --git a/package/kernel/mac80211/patches/subsys/351-mac80211-add-TX_NEEDS_ALIGNED4_SKBS-hw-flag.patch b/package/kernel/mac80211/patches/subsys/351-mac80211-add-TX_NEEDS_ALIGNED4_SKBS-hw-flag.patch index 784b4b027a..3a210ff238 100644 --- a/package/kernel/mac80211/patches/subsys/351-mac80211-add-TX_NEEDS_ALIGNED4_SKBS-hw-flag.patch +++ b/package/kernel/mac80211/patches/subsys/351-mac80211-add-TX_NEEDS_ALIGNED4_SKBS-hw-flag.patch @@ -227,7 +227,7 @@ Signed-off-by: Felix Fietkau if (likely(sta)) { if (!IS_ERR(sta)) -@@ -2222,7 +2221,7 @@ netdev_tx_t ieee80211_monitor_start_xmit +@@ -2233,7 +2232,7 @@ netdev_tx_t ieee80211_monitor_start_xmit goto fail; hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr); @@ -236,7 +236,7 @@ Signed-off-by: Felix Fietkau if (skb->len < len_rthdr + hdrlen) goto fail; -@@ -2441,7 +2440,7 @@ static struct sk_buff *ieee80211_build_h +@@ -2452,7 +2451,7 @@ static struct sk_buff *ieee80211_build_h struct ieee80211_chanctx_conf *chanctx_conf; struct ieee80211_sub_if_data *ap_sdata; enum nl80211_band band; @@ -245,7 +245,7 @@ Signed-off-by: Felix Fietkau if (IS_ERR(sta)) sta = NULL; -@@ -2740,7 +2739,9 @@ static struct sk_buff *ieee80211_build_h +@@ -2751,7 +2750,9 @@ static struct sk_buff *ieee80211_build_h } skb_pull(skb, skip_header_bytes); @@ -255,7 +255,7 @@ Signed-off-by: Felix Fietkau /* * So we need to modify the skb header and hence need a copy of -@@ -2773,6 +2774,9 @@ static struct sk_buff *ieee80211_build_h +@@ -2784,6 +2785,9 @@ static struct sk_buff *ieee80211_build_h memcpy(skb_push(skb, meshhdrlen), &mesh_hdr, meshhdrlen); #endif @@ -265,7 +265,7 @@ Signed-off-by: Felix Fietkau if (ieee80211_is_data_qos(fc)) { __le16 *qos_control; -@@ -2949,6 +2953,8 @@ void ieee80211_check_fast_xmit(struct st +@@ -2960,6 +2964,8 @@ void ieee80211_check_fast_xmit(struct st fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); } @@ -274,7 +274,7 @@ Signed-off-by: Felix Fietkau /* We store the key here so there's no point in using rcu_dereference() * but that's fine because the code that changes the pointers will call * this function after doing so. For a single CPU that would be enough, -@@ -3525,7 +3531,7 @@ begin: +@@ -3536,7 +3542,7 @@ begin: tx.local = local; tx.skb = skb; tx.sdata = vif_to_sdata(info->control.vif); @@ -283,7 +283,7 @@ Signed-off-by: Felix Fietkau if (txq->sta) { tx.sta = container_of(txq->sta, struct sta_info, sta); -@@ -4029,7 +4035,7 @@ ieee80211_build_data_template(struct iee +@@ -4040,7 +4046,7 @@ ieee80211_build_data_template(struct iee hdr = (void *)skb->data; tx.sta = sta_info_get(sdata, hdr->addr1); tx.skb = skb; diff --git a/package/kernel/mac80211/patches/subsys/352-mac80211-rework-locking-for-txq-scheduling-airtime-f.patch b/package/kernel/mac80211/patches/subsys/352-mac80211-rework-locking-for-txq-scheduling-airtime-f.patch index a71748b302..11fe01ec21 100644 --- a/package/kernel/mac80211/patches/subsys/352-mac80211-rework-locking-for-txq-scheduling-airtime-f.patch +++ b/package/kernel/mac80211/patches/subsys/352-mac80211-rework-locking-for-txq-scheduling-airtime-f.patch @@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau * ieee80211_txq_may_transmit - check whether TXQ is allowed to transmit --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3637,16 +3637,17 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue); +@@ -3648,16 +3648,17 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue); struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, u8 ac) { struct ieee80211_local *local = hw_to_local(hw); @@ -115,7 +115,7 @@ Signed-off-by: Felix Fietkau if (txqi->txq.sta) { struct sta_info *sta = container_of(txqi->txq.sta, -@@ -3663,21 +3664,25 @@ struct ieee80211_txq *ieee80211_next_txq +@@ -3674,21 +3675,25 @@ struct ieee80211_txq *ieee80211_next_txq if (txqi->schedule_round == local->schedule_round[ac]) @@ -146,7 +146,7 @@ Signed-off-by: Felix Fietkau if (list_empty(&txqi->schedule_order) && (!skb_queue_empty(&txqi->frags) || txqi->tin.backlog_packets)) { -@@ -3697,18 +3702,7 @@ void ieee80211_return_txq(struct ieee802 +@@ -3708,18 +3713,7 @@ void ieee80211_return_txq(struct ieee802 list_add_tail(&txqi->schedule_order, &local->active_txqs[txq->ac]); } @@ -165,7 +165,7 @@ Signed-off-by: Felix Fietkau spin_unlock_bh(&local->active_txq_lock[txq->ac]); } EXPORT_SYMBOL(ieee80211_schedule_txq); -@@ -3721,7 +3715,7 @@ bool ieee80211_txq_may_transmit(struct i +@@ -3732,7 +3726,7 @@ bool ieee80211_txq_may_transmit(struct i struct sta_info *sta; u8 ac = txq->ac; @@ -174,7 +174,7 @@ Signed-off-by: Felix Fietkau if (!txqi->txq.sta) goto out; -@@ -3751,34 +3745,27 @@ bool ieee80211_txq_may_transmit(struct i +@@ -3762,34 +3756,27 @@ bool ieee80211_txq_may_transmit(struct i sta->airtime[ac].deficit += sta->airtime_weight; list_move_tail(&txqi->schedule_order, &local->active_txqs[ac]); diff --git a/package/kernel/mac80211/patches/subsys/354-mac80211-calculate-hash-for-fq-without-holding-fq-lo.patch b/package/kernel/mac80211/patches/subsys/354-mac80211-calculate-hash-for-fq-without-holding-fq-lo.patch index 2ff3769637..4607361395 100644 --- a/package/kernel/mac80211/patches/subsys/354-mac80211-calculate-hash-for-fq-without-holding-fq-lo.patch +++ b/package/kernel/mac80211/patches/subsys/354-mac80211-calculate-hash-for-fq-without-holding-fq-lo.patch @@ -111,7 +111,7 @@ Signed-off-by: Felix Fietkau schedule_and_wake_txq(local, txqi); -@@ -3200,6 +3201,7 @@ static bool ieee80211_amsdu_aggregate(st +@@ -3211,6 +3212,7 @@ static bool ieee80211_amsdu_aggregate(st u8 max_subframes = sta->sta.max_amsdu_subframes; int max_frags = local->hw.max_tx_fragments; int max_amsdu_len = sta->sta.max_amsdu_len; @@ -119,7 +119,7 @@ Signed-off-by: Felix Fietkau int orig_truesize; __be16 len; void *data; -@@ -3222,6 +3224,8 @@ static bool ieee80211_amsdu_aggregate(st +@@ -3233,6 +3235,8 @@ static bool ieee80211_amsdu_aggregate(st max_amsdu_len = min_t(int, max_amsdu_len, sta->sta.max_rc_amsdu_len); @@ -128,7 +128,7 @@ Signed-off-by: Felix Fietkau spin_lock_bh(&fq->lock); /* TODO: Ideally aggregation should be done on dequeue to remain -@@ -3229,7 +3233,8 @@ static bool ieee80211_amsdu_aggregate(st +@@ -3240,7 +3244,8 @@ static bool ieee80211_amsdu_aggregate(st */ tin = &txqi->tin; diff --git a/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch b/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch index fc7a76a3dc..3109826ed8 100644 --- a/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch +++ b/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3507,6 +3507,7 @@ struct sk_buff *ieee80211_tx_dequeue(str +@@ -3518,6 +3518,7 @@ struct sk_buff *ieee80211_tx_dequeue(str ieee80211_tx_result r; struct ieee80211_vif *vif = txq->vif; @@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau spin_lock_bh(&fq->lock); if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags) || -@@ -3523,11 +3524,12 @@ struct sk_buff *ieee80211_tx_dequeue(str +@@ -3534,11 +3535,12 @@ struct sk_buff *ieee80211_tx_dequeue(str if (skb) goto out; @@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau hdr = (struct ieee80211_hdr *)skb->data; info = IEEE80211_SKB_CB(skb); -@@ -3591,8 +3593,11 @@ begin: +@@ -3602,8 +3604,11 @@ begin: skb = __skb_dequeue(&tx.skbs); @@ -45,7 +45,7 @@ Signed-off-by: Felix Fietkau } if (skb && skb_has_frag_list(skb) && -@@ -3631,6 +3636,7 @@ begin: +@@ -3642,6 +3647,7 @@ begin: } IEEE80211_SKB_CB(skb)->control.vif = vif; diff --git a/package/kernel/mac80211/patches/subsys/357-mac80211-optimize-skb-resizing.patch b/package/kernel/mac80211/patches/subsys/357-mac80211-optimize-skb-resizing.patch index 5d53425f8d..e7e8a0b286 100644 --- a/package/kernel/mac80211/patches/subsys/357-mac80211-optimize-skb-resizing.patch +++ b/package/kernel/mac80211/patches/subsys/357-mac80211-optimize-skb-resizing.patch @@ -50,33 +50,39 @@ Signed-off-by: Felix Fietkau if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) { --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -1914,37 +1914,53 @@ static bool ieee80211_tx(struct ieee8021 +@@ -1914,42 +1914,53 @@ static bool ieee80211_tx(struct ieee8021 } /* device xmit handlers */ - +-enum ieee80211_encrypt { +- ENCRYPT_NO, +- ENCRYPT_MGMT, +- ENCRYPT_DATA, +-}; +- -static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata, - struct sk_buff *skb, -- int head_need, bool may_encrypt) +- int head_need, +- enum ieee80211_encrypt encrypt) +int ieee80211_skb_resize(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct sk_buff *skb, int hdr_len, int hdr_extra) { - struct ieee80211_local *local = sdata->local; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); - struct ieee80211_hdr *hdr; - bool enc_tailroom; - int tail_need = 0; - -- hdr = (struct ieee80211_hdr *) skb->data; -- enc_tailroom = may_encrypt && -- (sdata->crypto_tx_tailroom_needed_cnt || -- ieee80211_is_mgmt(hdr->frame_control)); +- enc_tailroom = encrypt == ENCRYPT_MGMT || +- (encrypt == ENCRYPT_DATA && +- sdata->crypto_tx_tailroom_needed_cnt); - - if (enc_tailroom) { - tail_need = IEEE80211_ENCRYPT_TAILROOM; - tail_need -= skb_tailroom(skb); - tail_need = max_t(int, tail_need, 0); ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_hdr *hdr; + int head_need, head_max; + int tail_need, tail_max; + bool enc_tailroom = false; @@ -123,27 +129,34 @@ Signed-off-by: Felix Fietkau wiphy_debug(local->hw.wiphy, "failed to reallocate TX buffer\n"); return -ENOMEM; -@@ -1960,18 +1976,8 @@ void ieee80211_xmit(struct ieee80211_sub +@@ -1964,24 +1975,9 @@ void ieee80211_xmit(struct ieee80211_sub + { struct ieee80211_local *local = sdata->local; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); - struct ieee80211_hdr *hdr; +- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; - int headroom; -- bool may_encrypt; +- enum ieee80211_encrypt encrypt; +- +- if (info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT) +- encrypt = ENCRYPT_NO; +- else if (ieee80211_is_mgmt(hdr->frame_control)) +- encrypt = ENCRYPT_MGMT; +- else +- encrypt = ENCRYPT_DATA; - -- may_encrypt = !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT); - - headroom = local->tx_headroom; -- if (may_encrypt) +- if (encrypt != ENCRYPT_NO) - headroom += sdata->encrypt_headroom; - headroom -= skb_headroom(skb); - headroom = max_t(int, 0, headroom); -- -- if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) { ++ struct ieee80211_hdr *hdr; + +- if (ieee80211_skb_resize(sdata, skb, headroom, encrypt)) { + if (ieee80211_skb_resize(local, sdata, skb, 0, 0)) { ieee80211_free_txskb(&local->hw, skb); return; } -@@ -2741,30 +2747,14 @@ static struct sk_buff *ieee80211_build_h +@@ -2752,30 +2748,14 @@ static struct sk_buff *ieee80211_build_h skb_pull(skb, skip_header_bytes); padsize = ieee80211_hdr_padsize(&local->hw, hdrlen); @@ -167,7 +180,7 @@ Signed-off-by: Felix Fietkau - head_need += sdata->encrypt_headroom; - head_need += local->tx_headroom; - head_need = max_t(int, 0, head_need); -- if (ieee80211_skb_resize(sdata, skb, head_need, true)) { +- if (ieee80211_skb_resize(sdata, skb, head_need, ENCRYPT_DATA)) { - ieee80211_free_txskb(&local->hw, skb); - skb = NULL; - return ERR_PTR(-ENOMEM); @@ -180,7 +193,7 @@ Signed-off-by: Felix Fietkau } if (encaps_data) -@@ -3377,7 +3367,6 @@ static bool ieee80211_xmit_fast(struct i +@@ -3388,7 +3368,6 @@ static bool ieee80211_xmit_fast(struct i struct ieee80211_local *local = sdata->local; u16 ethertype = (skb->data[12] << 8) | skb->data[13]; int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2); @@ -188,14 +201,14 @@ Signed-off-by: Felix Fietkau struct ethhdr eth; struct ieee80211_tx_info *info; struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; -@@ -3429,10 +3418,7 @@ static bool ieee80211_xmit_fast(struct i +@@ -3440,10 +3419,7 @@ static bool ieee80211_xmit_fast(struct i * as the may-encrypt argument for the resize to not account for * more room than we already have in 'extra_head' */ - if (unlikely(ieee80211_skb_resize(sdata, skb, - max_t(int, extra_head + hw_headroom - - skb_headroom(skb), 0), -- false))) { +- ENCRYPT_NO))) { + if (unlikely(ieee80211_skb_resize(local, sdata, skb, extra_head, 0))) { kfree_skb(skb); return true; diff --git a/package/kernel/mac80211/patches/subsys/358-mac80211-make-ieee80211_schedule_txq-schedule-empty-.patch b/package/kernel/mac80211/patches/subsys/358-mac80211-make-ieee80211_schedule_txq-schedule-empty-.patch index 2967071026..c1e0c5c24c 100644 --- a/package/kernel/mac80211/patches/subsys/358-mac80211-make-ieee80211_schedule_txq-schedule-empty-.patch +++ b/package/kernel/mac80211/patches/subsys/358-mac80211-make-ieee80211_schedule_txq-schedule-empty-.patch @@ -72,7 +72,7 @@ Signed-off-by: Felix Fietkau /** --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3673,8 +3673,9 @@ out: +@@ -3674,8 +3674,9 @@ out: } EXPORT_SYMBOL(ieee80211_next_txq); @@ -84,7 +84,7 @@ Signed-off-by: Felix Fietkau { struct ieee80211_local *local = hw_to_local(hw); struct txq_info *txqi = to_txq_info(txq); -@@ -3682,7 +3683,8 @@ void ieee80211_schedule_txq(struct ieee8 +@@ -3683,7 +3684,8 @@ void ieee80211_schedule_txq(struct ieee8 spin_lock_bh(&local->active_txq_lock[txq->ac]); if (list_empty(&txqi->schedule_order) && @@ -94,7 +94,7 @@ Signed-off-by: Felix Fietkau /* If airtime accounting is active, always enqueue STAs at the * head of the list to ensure that they only get moved to the * back by the airtime DRR scheduler once they have a negative -@@ -3702,7 +3704,7 @@ void ieee80211_schedule_txq(struct ieee8 +@@ -3703,7 +3705,7 @@ void ieee80211_schedule_txq(struct ieee8 spin_unlock_bh(&local->active_txq_lock[txq->ac]); } diff --git a/package/kernel/mac80211/patches/subsys/360-mac80211-when-using-iTXQ-select-the-queue-in-ieee802.patch b/package/kernel/mac80211/patches/subsys/360-mac80211-when-using-iTXQ-select-the-queue-in-ieee802.patch index 23414d57ae..ea86758ea0 100644 --- a/package/kernel/mac80211/patches/subsys/360-mac80211-when-using-iTXQ-select-the-queue-in-ieee802.patch +++ b/package/kernel/mac80211/patches/subsys/360-mac80211-when-using-iTXQ-select-the-queue-in-ieee802.patch @@ -13,7 +13,7 @@ Signed-off-by: Felix Fietkau --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -3772,6 +3772,7 @@ void __ieee80211_subif_start_xmit(struct +@@ -3773,6 +3773,7 @@ void __ieee80211_subif_start_xmit(struct u32 ctrl_flags) { struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); @@ -21,7 +21,7 @@ Signed-off-by: Felix Fietkau struct sta_info *sta; struct sk_buff *next; -@@ -3785,7 +3786,15 @@ void __ieee80211_subif_start_xmit(struct +@@ -3786,7 +3787,15 @@ void __ieee80211_subif_start_xmit(struct if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) goto out_free; diff --git a/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel-remove-divisions-in-tx-status-path.patch b/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel-remove-divisions-in-tx-status-path.patch index d38d33b41e..c2ca5f839a 100644 --- a/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel-remove-divisions-in-tx-status-path.patch +++ b/package/kernel/mac80211/patches/subsys/362-mac80211-minstrel-remove-divisions-in-tx-status-path.patch @@ -11,9 +11,9 @@ Signed-off-by: Felix Fietkau --- a/net/mac80211/rc80211_minstrel.c +++ b/net/mac80211/rc80211_minstrel.c -@@ -295,8 +295,7 @@ minstrel_tx_status(void *priv, struct ie - if (mi->sample_deferred > 0) - mi->sample_deferred--; +@@ -289,8 +289,7 @@ minstrel_tx_status(void *priv, struct ie + mi->r[ndx].stats.success += success; + } - if (time_after(jiffies, mi->last_stats_update + - (mp->update_interval * HZ) / 1000)) diff --git a/package/kernel/mac80211/patches/subsys/363-mac80211-minstrel_ht-replace-rate-stats-ewma-with-a-.patch b/package/kernel/mac80211/patches/subsys/363-mac80211-minstrel_ht-replace-rate-stats-ewma-with-a-.patch index 5e2a017865..5fa6db0adb 100644 --- a/package/kernel/mac80211/patches/subsys/363-mac80211-minstrel_ht-replace-rate-stats-ewma-with-a-.patch +++ b/package/kernel/mac80211/patches/subsys/363-mac80211-minstrel_ht-replace-rate-stats-ewma-with-a-.patch @@ -64,9 +64,9 @@ Signed-off-by: Felix Fietkau /* Sample less often below the 10% chance of success. * Sample less often above the 95% chance of success. */ -@@ -295,7 +299,8 @@ minstrel_tx_status(void *priv, struct ie - if (mi->sample_deferred > 0) - mi->sample_deferred--; +@@ -289,7 +293,8 @@ minstrel_tx_status(void *priv, struct ie + mi->r[ndx].stats.success += success; + } - if (time_after(jiffies, mi->last_stats_update + mp->update_interval)) + if (time_after(jiffies, mi->last_stats_update + @@ -149,7 +149,7 @@ Signed-off-by: Felix Fietkau /* statistis of packet delivery probability * prob_ewma - exponential weighted moving average of prob * prob_ewmsd - exp. weighted moving standard deviation of prob */ -@@ -114,6 +166,7 @@ struct minstrel_sta_info { +@@ -113,6 +165,7 @@ struct minstrel_sta_info { struct minstrel_priv { struct ieee80211_hw *hw; bool has_mrr; @@ -157,7 +157,7 @@ Signed-off-by: Felix Fietkau u32 sample_switch; unsigned int cw_min; unsigned int cw_max; -@@ -153,7 +206,8 @@ extern const struct rate_control_ops mac +@@ -152,7 +205,8 @@ extern const struct rate_control_ops mac void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir); /* Recalculate success probabilities and counters for a given rate using EWMA */ diff --git a/package/kernel/mac80211/patches/subsys/364-mac80211-minstrel_ht-rename-prob_ewma-to-prob_avg-us.patch b/package/kernel/mac80211/patches/subsys/364-mac80211-minstrel_ht-rename-prob_ewma-to-prob_avg-us.patch index c919643505..7c782c0b93 100644 --- a/package/kernel/mac80211/patches/subsys/364-mac80211-minstrel_ht-rename-prob_ewma-to-prob_avg-us.patch +++ b/package/kernel/mac80211/patches/subsys/364-mac80211-minstrel_ht-rename-prob_ewma-to-prob_avg-us.patch @@ -106,7 +106,7 @@ Signed-off-by: Felix Fietkau tmp_prob_rate = i; } } -@@ -436,7 +436,7 @@ minstrel_get_rate(void *priv, struct iee +@@ -418,7 +418,7 @@ minstrel_get_rate(void *priv, struct iee * has a probability of >95%, we shouldn't be attempting * to use it, as this only wastes precious airtime */ if (!mrr_capable && @@ -115,7 +115,7 @@ Signed-off-by: Felix Fietkau return; mi->prev_sample = true; -@@ -587,7 +587,7 @@ static u32 minstrel_get_expected_through +@@ -570,7 +570,7 @@ static u32 minstrel_get_expected_through * computing cur_tp */ tmp_mrs = &mi->r[idx].stats; @@ -174,7 +174,7 @@ Signed-off-by: Felix Fietkau /* maximum retry counts */ u8 retry_count; u8 retry_count_rtscts; -@@ -208,7 +205,7 @@ void minstrel_add_sta_debugfs(void *priv +@@ -207,7 +204,7 @@ void minstrel_add_sta_debugfs(void *priv /* Recalculate success probabilities and counters for a given rate using EWMA */ void minstrel_calc_rate_stats(struct minstrel_priv *mp, struct minstrel_rate_stats *mrs); diff --git a/package/kernel/mac80211/patches/subsys/367-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch b/package/kernel/mac80211/patches/subsys/367-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch index 58158b58e6..8efd0e11e3 100644 --- a/package/kernel/mac80211/patches/subsys/367-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch +++ b/package/kernel/mac80211/patches/subsys/367-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch @@ -28,7 +28,7 @@ Signed-off-by: Johannes Berg --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c -@@ -322,6 +322,7 @@ struct sta_info *sta_info_alloc(struct i +@@ -340,6 +340,7 @@ struct sta_info *sta_info_alloc(struct i INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames); INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); mutex_init(&sta->ampdu_mlme.mtx); diff --git a/package/kernel/mac80211/patches/subsys/368-cfg80211-add-local-BSS-receive-time-to-survey-inform.patch b/package/kernel/mac80211/patches/subsys/368-cfg80211-add-local-BSS-receive-time-to-survey-inform.patch index 7854dbbfc4..651b117c83 100644 --- a/package/kernel/mac80211/patches/subsys/368-cfg80211-add-local-BSS-receive-time-to-survey-inform.patch +++ b/package/kernel/mac80211/patches/subsys/368-cfg80211-add-local-BSS-receive-time-to-survey-inform.patch @@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau __NL80211_SURVEY_INFO_AFTER_LAST, --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -8373,6 +8373,10 @@ static int nl80211_send_survey(struct sk +@@ -8379,6 +8379,10 @@ static int nl80211_send_survey(struct sk nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, survey->time_scan, NL80211_SURVEY_INFO_PAD)) goto nla_put_failure; diff --git a/package/kernel/mac80211/patches/subsys/370-mac80211-fix-misplaced-while-instead-of-if.patch b/package/kernel/mac80211/patches/subsys/370-mac80211-fix-misplaced-while-instead-of-if.patch deleted file mode 100644 index e3f18131b7..0000000000 --- a/package/kernel/mac80211/patches/subsys/370-mac80211-fix-misplaced-while-instead-of-if.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 5981fe5b0529ba25d95f37d7faa434183ad618c5 Mon Sep 17 00:00:00 2001 -From: Johannes Berg -Date: Mon, 3 Aug 2020 11:02:10 +0200 -Subject: [PATCH] mac80211: fix misplaced while instead of if - -This never was intended to be a 'while' loop, it should've -just been an 'if' instead of 'while'. Fix this. - -I noticed this while applying another patch from Ben that -intended to fix a busy loop at this spot. - -Cc: stable@vger.kernel.org -Fixes: b16798f5b907 ("mac80211: mark station unauthorized before key removal") -Reported-by: Ben Greear -Link: https://lore.kernel.org/r/20200803110209.253009ae41ff.I3522aad099392b31d5cf2dcca34cbac7e5832dde@changeid -Signed-off-by: Johannes Berg ---- - net/mac80211/sta_info.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/net/mac80211/sta_info.c -+++ b/net/mac80211/sta_info.c -@@ -980,7 +980,7 @@ static void __sta_info_destroy_part2(str - might_sleep(); - lockdep_assert_held(&local->sta_mtx); - -- while (sta->sta_state == IEEE80211_STA_AUTHORIZED) { -+ if (sta->sta_state == IEEE80211_STA_AUTHORIZED) { - ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC); - WARN_ON_ONCE(ret); - } diff --git a/package/kernel/mac80211/patches/subsys/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/subsys/522-mac80211_configure_antenna_gain.patch index 82b45b08f9..31137e1b37 100644 --- a/package/kernel/mac80211/patches/subsys/522-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/subsys/522-mac80211_configure_antenna_gain.patch @@ -57,7 +57,7 @@ __NL80211_ATTR_AFTER_LAST, --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2457,6 +2457,19 @@ static int ieee80211_get_tx_power(struct +@@ -2458,6 +2458,19 @@ static int ieee80211_get_tx_power(struct return 0; } @@ -77,7 +77,7 @@ static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, const u8 *addr) { -@@ -3846,6 +3859,7 @@ const struct cfg80211_ops mac80211_confi +@@ -3847,6 +3860,7 @@ const struct cfg80211_ops mac80211_confi .set_wiphy_params = ieee80211_set_wiphy_params, .set_tx_power = ieee80211_set_tx_power, .get_tx_power = ieee80211_get_tx_power, @@ -137,7 +137,7 @@ }; /* policy for the key attributes */ -@@ -2629,6 +2630,20 @@ static int nl80211_set_wiphy(struct sk_b +@@ -2632,6 +2633,20 @@ static int nl80211_set_wiphy(struct sk_b if (result) return result; } From c3426d167b412f6f7ac659e37cfc8fc486c64411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0tetiar?= Date: Wed, 29 Apr 2020 23:11:05 +0200 Subject: [PATCH 09/15] wireless-regdb: bump to latest release 2020-04-29 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update to latest release. Signed-off-by: Petr Štetiar --- package/firmware/wireless-regdb/Makefile | 5 +- ...regdb-fix-compatibility-with-python2.patch | 58 ------------------- .../600-custom-fix-txpower-and-dfs.patch | 26 +++++---- 3 files changed, 19 insertions(+), 70 deletions(-) delete mode 100644 package/firmware/wireless-regdb/patches/010-regdb-fix-compatibility-with-python2.patch diff --git a/package/firmware/wireless-regdb/Makefile b/package/firmware/wireless-regdb/Makefile index 26f470af44..fc18d159b1 100644 --- a/package/firmware/wireless-regdb/Makefile +++ b/package/firmware/wireless-regdb/Makefile @@ -1,11 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wireless-regdb -PKG_VERSION:=2019.06.03 +PKG_VERSION:=2020.04.29 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/software/network/wireless-regdb/ -PKG_HASH:=cd917ed86b63ce8d93947979f1f18948f03a4ac0ad89ec25227b36ac00dc54bf +PKG_HASH:=89fd031aed5977c219a71501e144375a10e7c90d1005d5d086ea7972886a2c7a PKG_MAINTAINER:=Felix Fietkau diff --git a/package/firmware/wireless-regdb/patches/010-regdb-fix-compatibility-with-python2.patch b/package/firmware/wireless-regdb/patches/010-regdb-fix-compatibility-with-python2.patch deleted file mode 100644 index 81f50f5dc0..0000000000 --- a/package/firmware/wireless-regdb/patches/010-regdb-fix-compatibility-with-python2.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 651e39dee8605995b736b6056c6f7dc5c5a9c948 Mon Sep 17 00:00:00 2001 -From: Johannes Berg -Date: Thu, 22 Aug 2019 21:46:27 +0200 -Subject: [PATCH] regdb: fix compatibility with python2 - -Various changes in the commit mentioned below broke -compatibility with python2. Restore it in a way that -makes it worth with both versions. - -Fixes: f3c4969c2485 ("wireless-regdb: make scripts compatible with Python 3") -Signed-off-by: Johannes Berg -Signed-off-by: Seth Forshee ---- - db2bin.py | 2 +- - db2fw.py | 2 +- - dbparse.py | 3 +-- - 3 files changed, 3 insertions(+), 4 deletions(-) - ---- a/db2bin.py -+++ b/db2bin.py -@@ -118,7 +118,7 @@ reg_country_ptr.set() - for alpha2 in countrynames: - coll = countries[alpha2] - # struct regdb_file_reg_country -- output.write(struct.pack('>BBxBI', alpha2[0], alpha2[1], coll.dfs_region, reg_rules_collections[coll.permissions])) -+ output.write(struct.pack('>2sxBI', alpha2, coll.dfs_region, reg_rules_collections[coll.permissions])) - - - if len(sys.argv) > 3: ---- a/db2fw.py -+++ b/db2fw.py -@@ -85,7 +85,7 @@ countrynames = list(countries) - countrynames.sort() - for alpha2 in countrynames: - coll = countries[alpha2] -- output.write(struct.pack('>BB', alpha2[0], alpha2[1])) -+ output.write(struct.pack('>2s', alpha2)) - country_ptrs[alpha2] = PTR(output) - output.write(b'\x00' * 4) - ---- a/dbparse.py -+++ b/dbparse.py -@@ -1,6 +1,5 @@ - #!/usr/bin/env python - --from builtins import bytes - from functools import total_ordering - import sys, math - from math import ceil, log -@@ -359,7 +358,7 @@ class DBParser(object): - for cname in cnames: - if len(cname) != 2: - self._warn("country '%s' not alpha2" % cname) -- cname = bytes(cname, 'ascii') -+ cname = cname.encode('ascii') - if not cname in self._countries: - self._countries[cname] = Country(dfs_region, comments=self._comments) - self._current_countries[cname] = self._countries[cname] diff --git a/package/firmware/wireless-regdb/patches/600-custom-fix-txpower-and-dfs.patch b/package/firmware/wireless-regdb/patches/600-custom-fix-txpower-and-dfs.patch index f4ebb0dfa1..959b69a003 100644 --- a/package/firmware/wireless-regdb/patches/600-custom-fix-txpower-and-dfs.patch +++ b/package/firmware/wireless-regdb/patches/600-custom-fix-txpower-and-dfs.patch @@ -1,6 +1,6 @@ --- a/db.txt +++ b/db.txt -@@ -291,9 +291,8 @@ country CL: DFS-JP +@@ -347,9 +347,9 @@ country CL: DFS-JP (5735 - 5835 @ 80), (20) country CN: DFS-FCC @@ -8,19 +8,25 @@ - (5170 - 5250 @ 80), (23), AUTO-BW - (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (2402 - 2482 @ 40), (30) -+ (5170 - 5330 @ 160), (30), AUTO-BW ++ (5170 - 5250 @ 80), (30), AUTO-BW ++ (5250 - 5330 @ 80), (30), AUTO-BW (5735 - 5835 @ 80), (30) # 60 GHz band channels 1,4: 28dBm, channels 2,3: 44dBm # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf -@@ -1284,9 +1283,8 @@ country UG: DFS-FCC +@@ -1580,13 +1580,13 @@ country UG: DFS-FCC country US: DFS-FCC - (2402 - 2472 @ 40), (30) + (2400 - 2483.5 @ 40), (30) # 5.15 ~ 5.25 GHz: 30 dBm for master mode, 23 dBm for clients -- (5170 - 5250 @ 80), (23), AUTO-BW -- (5250 - 5330 @ 80), (23), DFS, AUTO-BW -- (5490 - 5730 @ 160), (23), DFS -+ (5170 - 5330 @ 160), (30), AUTO-BW -+ (5490 - 5730 @ 160), (30) - (5735 - 5835 @ 80), (30) +- (5150 - 5250 @ 80), (23), AUTO-BW +- (5250 - 5350 @ 80), (23), DFS, AUTO-BW ++ (5150 - 5250 @ 80), (30), AUTO-BW ++ (5250 - 5350 @ 80), (30), AUTO-BW + # This range ends at 5725 MHz, but channel 144 extends to 5730 MHz. + # Since 5725 ~ 5730 MHz belongs to the next range which has looser + # requirements, we can extend the range by 5 MHz to make the kernel + # happy and be able to use channel 144. +- (5470 - 5730 @ 160), (23), DFS ++ (5470 - 5730 @ 160), (30) + (5730 - 5850 @ 80), (30) # 60g band # reference: section IV-D https://docs.fcc.gov/public/attachments/FCC-16-89A1.pdf From 1a9f1cb2842c4c348265b8f9de825dbd070a6774 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Wed, 16 Dec 2020 17:23:59 +0100 Subject: [PATCH 10/15] wireless-regdb: Update to version 2020.11.20 9efa1da wireless-regdb: update regulatory rules for Egypt (EG) ede87f5 wireless-regdb: restore channel 12 & 13 limitation in the US 5bcafa3 wireless-regdb: Update regulatory rules for Croatia (HR) 4e052f1 wireless-regdb: Update regulatory rules for Pakistan (PK) on 5GHz f9dfc58 wireless-regdb: update 5.8 GHz regulatory rule for GB c19aad0 wireless-regdb: Update regulatory rules for Kazakhstan (KZ) 07057d3 wireless-regdb: update regulatory database based on preceding changes Signed-off-by: Hauke Mehrtens --- package/firmware/wireless-regdb/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/firmware/wireless-regdb/Makefile b/package/firmware/wireless-regdb/Makefile index fc18d159b1..308ca40e22 100644 --- a/package/firmware/wireless-regdb/Makefile +++ b/package/firmware/wireless-regdb/Makefile @@ -1,12 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wireless-regdb -PKG_VERSION:=2020.04.29 +PKG_VERSION:=2020.11.20 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/software/network/wireless-regdb/ -PKG_HASH:=89fd031aed5977c219a71501e144375a10e7c90d1005d5d086ea7972886a2c7a +PKG_HASH:=b4164490d82ff7b0086e812ac42ab27baf57be24324d4c0ee1c5dd6ba27f2a52 PKG_MAINTAINER:=Felix Fietkau From c9c24b910128fa301816479741a41922fb4feab5 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sat, 19 Dec 2020 17:20:04 +0800 Subject: [PATCH 11/15] luci-app-docker: Updated `docker-ce` -> `docker` --- package/lean/luci-app-docker/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/lean/luci-app-docker/Makefile b/package/lean/luci-app-docker/Makefile index 4624618b6e..a3e699db1f 100644 --- a/package/lean/luci-app-docker/Makefile +++ b/package/lean/luci-app-docker/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Luci for Docker-CE -LUCI_DEPENDS:=+docker-ce +e2fsprogs +fdisk +LUCI_DEPENDS:=+docker +e2fsprogs +fdisk LUCI_PKGARCH:=all PKG_VERSION:=1 PKG_RELEASE:=9 From 7d9d41f7d6b83ad9fe4c0f2792574069a3e0b2a3 Mon Sep 17 00:00:00 2001 From: Beginner <70857188+Beginner-Go@users.noreply.github.com> Date: Sat, 19 Dec 2020 01:43:29 +0800 Subject: [PATCH 12/15] xray: Update to 1.1.4 --- package/lean/xray/Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package/lean/xray/Makefile b/package/lean/xray/Makefile index 71ed3ad709..2f1c1c961b 100644 --- a/package/lean/xray/Makefile +++ b/package/lean/xray/Makefile @@ -9,13 +9,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=xray -PKG_VERSION:=1.1.3 +PKG_VERSION:=1.1.4 PKG_RELEASE:=1 PKG_BUILD_DIR:=$(BUILD_DIR)/Xray-core-$(PKG_VERSION) PKG_SOURCE:=xray-core-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/xray-core/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=cc6d2e25dcd710e26092bf84cd9ce65d5c6efd0e60014210fa03cf0297b83eb0 +PKG_HASH:=9a44864648f09728507af22c362ff34901c3ad2c51ca254975f0774ff8d52f93 PKG_LICENSE:=MPL PKG_LICENSE_FILES:=LICENSE @@ -124,8 +124,7 @@ define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/xray $(1)/usr/bin ifeq ($(CONFIG_XRAY_PROVIDE_V2RAY),y) - cd $(1)/usr/bin ; \ - $(LN) xray v2ray + $(LN) xray $(1)/usr/bin/v2ray endif ifneq ($(CONFIG_XRAY_EXCLUDE_ASSETS),y) $(INSTALL_DIR) $(1)/usr/share/xray From 1af9ca83317a7d1ce9f002ae83e38e1758cb4acd Mon Sep 17 00:00:00 2001 From: xiaorouji <60100640+xiaorouji@users.noreply.github.com> Date: Sat, 19 Dec 2020 14:14:46 +0800 Subject: [PATCH 13/15] chinadns-ng: bump to latest git HEAD --- package/ctcgfw/openwrt-chinadns-ng/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/ctcgfw/openwrt-chinadns-ng/Makefile b/package/ctcgfw/openwrt-chinadns-ng/Makefile index d3b7bfcbab..9f1f59e749 100644 --- a/package/ctcgfw/openwrt-chinadns-ng/Makefile +++ b/package/ctcgfw/openwrt-chinadns-ng/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=chinadns-ng -PKG_VERSION:=1.0-beta.22 +PKG_VERSION:=1.0-beta.23 PKG_RELEASE:=1 PKG_USE_MIPS16:=0 @@ -9,7 +9,7 @@ PKG_BUILD_PARALLEL:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/zfl9/chinadns-ng.git -PKG_SOURCE_VERSION:=83fd24bc259414358134fb5015ad3495b96bb451 +PKG_SOURCE_VERSION:=748a043dd7fb7ec71efbb7306f9dd21db5ce560f PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION) From d26cc8a04cc0ded78465307e5c45b4e9d7504438 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sat, 19 Dec 2020 17:39:51 +0800 Subject: [PATCH 14/15] luci-app-passwall: sync with upstream source --- .../luasrc/controller/passwall.lua | 25 ++++---- .../luasrc/view/passwall/global/footer.htm | 58 +++++-------------- .../luasrc/view/passwall/global/status.htm | 33 ++++++----- 3 files changed, 46 insertions(+), 70 deletions(-) diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index bbc2204201..75b10d9424 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -4,6 +4,7 @@ local appname = "passwall" local ucic = luci.model.uci.cursor() local http = require "luci.http" local util = require "luci.util" +local i18n = require "luci.i18n" local api = require "luci.model.cbi.passwall.api.api" local kcptun = require "luci.model.cbi.passwall.api.kcptun" local brook = require "luci.model.cbi.passwall.api.brook" @@ -155,17 +156,17 @@ function get_now_use_node() end function get_redir_log() - local e = {} local proto = luci.http.formvalue("proto") + proto = proto:upper() local index = luci.http.formvalue("index") local filename = proto .. "_" .. index if nixio.fs.access("/var/etc/passwall/" .. filename .. ".log") then - e.code = 200 + local content = luci.sys.exec("cat /var/etc/passwall/" .. filename .. ".log") + content = content:gsub("\n", "
") + luci.http.write(content) else - e.code = 400 + luci.http.write(string.format("", i18n.translate("Not enabled log"))) end - e.data = luci.sys.exec("cat /var/etc/passwall/" .. filename .. ".log") - http_write_json(e) end function get_log() @@ -224,7 +225,11 @@ function connect_status() local code = tonumber(luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $1}'") or "0") if code ~= 0 then local use_time = luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $2}'") - e.use_time = string.format("%.2f", use_time * 1000) + if use_time:find("%.") then + e.use_time = string.format("%.2f", use_time * 1000) + else + e.use_time = string.format("%.2f", use_time / 1000) + end e.ping_type = "curl" end luci.http.prepare_content("application/json") @@ -311,18 +316,14 @@ function check_port() local node_name = "" local retstring = "
" - -- retstring = retstring .. "暂时不支持UDP检测
" - - retstring = retstring .. "检测端口可用性
" + retstring = retstring .. "检测端口连通性,不支持UDP检测
" ucic:foreach(appname, "nodes", function(s) local ret = "" local tcp_socket if (s.use_kcp and s.use_kcp == "1" and s.kcp_port) or (s.transport and s.transport == "mkcp" and s.port) then else local type = s.type - local protocol = s.protocol - if type and (protocol and protocol ~= "_balancing" and protocol ~= "_shunt") and - s.address and s.port and s.remarks then + if type and s.address and s.port and s.remarks then node_name = "%s:[%s] %s:%s" % {s.type, s.remarks, s.address, s.port} tcp_socket = nixio.socket("inet", "stream") tcp_socket:setopt("socket", "rcvtimeo", 3) diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm index 17fc33d071..dacce36afa 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm @@ -6,29 +6,6 @@ local auto_switch = api.uci_get_type("auto_switch", "enable", 0) -%> \ No newline at end of file +Clash
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/css/main.e4724b81.chunk.css b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/css/main.a3812757.chunk.css similarity index 78% rename from package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/css/main.e4724b81.chunk.css rename to package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/css/main.a3812757.chunk.css index 46fca3db25..4e8d46b1a2 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/css/main.e4724b81.chunk.css +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/css/main.a3812757.chunk.css @@ -1 +1 @@ -@font-face{font-family:"clash-iconfont";src:url(//at.alicdn.com/t/font_841708_ok9czskbhel.ttf?t=1576162884356) format("truetype")}.clash-iconfont{font-family:"clash-iconfont"!important;font-size:14px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c8af8}.icon-update:before{content:""}.icon-healthcheck:before{content:""}.icon-speed:before{content:""}.icon-close:before{content:""}.icon-drag:before{content:""}.icon-down-arrow-o:before{content:""}.icon-check:before{content:""}.icon-plus:before{content:""}.icon-triangle-up:before{content:""}.icon-triangle-down:before{content:""}.icon-up-arrow-o:before{content:""}.icon-info:before{content:""}.icon-info-o:before{content:""}.icon-setting:before{content:""}.icon-show:before{content:""}.icon-hide:before{content:""}.icon-sort:before{content:""}.icon-sort-descending:before{content:""}.icon-sort-ascending:before{content:""}.icon-close-all:before{content:""}html{box-sizing:border-box;background:hsla(0,0%,100%,.8);overflow:hidden}*,:after,:before{margin:0;padding:0;box-sizing:inherit}body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}body ::-webkit-scrollbar{z-index:11;background:transparent}body ::-webkit-scrollbar-thumb{border-radius:5px;background:#2c8af8}body ::-webkit-scrollbar:vertical{width:6px}body ::-webkit-scrollbar:horizontal{height:6px}.app{min-height:100vh;padding-left:150px}.app.not-clashx{background:#f4f5f6}.page-container{width:100%;height:100vh;padding-left:10px;overflow-y:scroll}.page{padding:20px 35px 30px 20px;width:100%;min-height:100vh;margin:0 auto;display:flex;flex-direction:column}.container{margin:20px 0}input{-webkit-appearance:none}@media(max-width:768px){.app{padding-left:0;padding-top:60px}.page-container{width:100%;padding:0 10px;height:calc(100vh - 60px);-webkit-overflow-scrolling:touch}.page-container::-webkit-scrollbar{display:none}.page{padding:0 0 20px;height:100%}}.header{margin:10px 0;width:100%;display:flex;flex-direction:row;align-items:center;justify-content:space-between;user-select:none}.header>h1{flex-shrink:0;font-size:24px;color:#2c8af8;font-weight:500;text-shadow:0 2px 6px rgba(44,138,248,.4);line-height:32px}.operations{display:flex;flex:1;align-items:center;justify-content:flex-end}@media(max-width:768px){.header>h1{font-size:20px}}.switch{display:inline-block;width:32px;height:16px;border-radius:8px;background-color:#d8dee2;transition:background-color .3s ease;position:relative;cursor:pointer}.switch.checked{background-color:#57befc}.switch.checked:after{transform:translateX(16px)}.switch.disabled{cursor:not-allowed;background-color:#b7c5d6}.switch.disabled:after{box-shadow:0 0 8px rgba(144,147,153,.5)}.switch.checked.disabled,.switch.disabled:after{background-color:#e4eaef}.switch:after{content:"";position:absolute;top:-1px;height:18px;width:18px;border-radius:9px;background-color:#fff;box-shadow:0 0 8px rgba(44,138,248,.4);transition:transform .3s ease;transform:translateX(-2px)}.switch-icon{position:absolute;transform:translateX(-1px) scale(.4);color:#fff;line-height:16px}.card{padding:15px;box-shadow:2px 5px 20px -3px rgba(44,138,248,.18);background-color:#fff;border-radius:4px}.row{width:100%;display:flex;flex-direction:row}.row-gutter-1{padding:12px 6px}.row-gutter-1 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-1 .column-span-1{width:100%}.row-gutter-1 .column-offset-1{margin-left:100%}.row-gutter-1 .column-span-2{width:200%}.row-gutter-1 .column-offset-2{margin-left:200%}.row-gutter-1 .column-span-3{width:300%}.row-gutter-1 .column-offset-3{margin-left:300%}.row-gutter-1 .column-span-4{width:400%}.row-gutter-1 .column-offset-4{margin-left:400%}.row-gutter-1 .column-span-5{width:500%}.row-gutter-1 .column-offset-5{margin-left:500%}.row-gutter-1 .column-span-6{width:600%}.row-gutter-1 .column-offset-6{margin-left:600%}.row-gutter-1 .column-span-7{width:700%}.row-gutter-1 .column-offset-7{margin-left:700%}.row-gutter-1 .column-span-8{width:800%}.row-gutter-1 .column-offset-8{margin-left:800%}.row-gutter-1 .column-span-9{width:900%}.row-gutter-1 .column-offset-9{margin-left:900%}.row-gutter-1 .column-span-10{width:1000%}.row-gutter-1 .column-offset-10{margin-left:1000%}.row-gutter-1 .column-span-11{width:1100%}.row-gutter-1 .column-offset-11{margin-left:1100%}.row-gutter-1 .column-span-12{width:1200%}.row-gutter-1 .column-offset-12{margin-left:1200%}.row-gutter-1 .column-span-13{width:1300%}.row-gutter-1 .column-offset-13{margin-left:1300%}.row-gutter-1 .column-span-14{width:1400%}.row-gutter-1 .column-offset-14{margin-left:1400%}.row-gutter-1 .column-span-15{width:1500%}.row-gutter-1 .column-offset-15{margin-left:1500%}.row-gutter-1 .column-span-16{width:1600%}.row-gutter-1 .column-offset-16{margin-left:1600%}.row-gutter-1 .column-span-17{width:1700%}.row-gutter-1 .column-offset-17{margin-left:1700%}.row-gutter-1 .column-span-18{width:1800%}.row-gutter-1 .column-offset-18{margin-left:1800%}.row-gutter-1 .column-span-19{width:1900%}.row-gutter-1 .column-offset-19{margin-left:1900%}.row-gutter-1 .column-span-20{width:2000%}.row-gutter-1 .column-offset-20{margin-left:2000%}.row-gutter-1 .column-span-21{width:2100%}.row-gutter-1 .column-offset-21{margin-left:2100%}.row-gutter-1 .column-span-22{width:2200%}.row-gutter-1 .column-offset-22{margin-left:2200%}.row-gutter-1 .column-span-23{width:2300%}.row-gutter-1 .column-offset-23{margin-left:2300%}.row-gutter-1 .column-span-24{width:2400%}.row-gutter-1 .column-offset-24{margin-left:2400%}.row-gutter-2{padding:12px 6px}.row-gutter-2 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-2 .column-span-1{width:50%}.row-gutter-2 .column-offset-1{margin-left:50%}.row-gutter-2 .column-span-2{width:100%}.row-gutter-2 .column-offset-2{margin-left:100%}.row-gutter-2 .column-span-3{width:150%}.row-gutter-2 .column-offset-3{margin-left:150%}.row-gutter-2 .column-span-4{width:200%}.row-gutter-2 .column-offset-4{margin-left:200%}.row-gutter-2 .column-span-5{width:250%}.row-gutter-2 .column-offset-5{margin-left:250%}.row-gutter-2 .column-span-6{width:300%}.row-gutter-2 .column-offset-6{margin-left:300%}.row-gutter-2 .column-span-7{width:350%}.row-gutter-2 .column-offset-7{margin-left:350%}.row-gutter-2 .column-span-8{width:400%}.row-gutter-2 .column-offset-8{margin-left:400%}.row-gutter-2 .column-span-9{width:450%}.row-gutter-2 .column-offset-9{margin-left:450%}.row-gutter-2 .column-span-10{width:500%}.row-gutter-2 .column-offset-10{margin-left:500%}.row-gutter-2 .column-span-11{width:550%}.row-gutter-2 .column-offset-11{margin-left:550%}.row-gutter-2 .column-span-12{width:600%}.row-gutter-2 .column-offset-12{margin-left:600%}.row-gutter-2 .column-span-13{width:650%}.row-gutter-2 .column-offset-13{margin-left:650%}.row-gutter-2 .column-span-14{width:700%}.row-gutter-2 .column-offset-14{margin-left:700%}.row-gutter-2 .column-span-15{width:750%}.row-gutter-2 .column-offset-15{margin-left:750%}.row-gutter-2 .column-span-16{width:800%}.row-gutter-2 .column-offset-16{margin-left:800%}.row-gutter-2 .column-span-17{width:850%}.row-gutter-2 .column-offset-17{margin-left:850%}.row-gutter-2 .column-span-18{width:900%}.row-gutter-2 .column-offset-18{margin-left:900%}.row-gutter-2 .column-span-19{width:950%}.row-gutter-2 .column-offset-19{margin-left:950%}.row-gutter-2 .column-span-20{width:1000%}.row-gutter-2 .column-offset-20{margin-left:1000%}.row-gutter-2 .column-span-21{width:1050%}.row-gutter-2 .column-offset-21{margin-left:1050%}.row-gutter-2 .column-span-22{width:1100%}.row-gutter-2 .column-offset-22{margin-left:1100%}.row-gutter-2 .column-span-23{width:1150%}.row-gutter-2 .column-offset-23{margin-left:1150%}.row-gutter-2 .column-span-24{width:1200%}.row-gutter-2 .column-offset-24{margin-left:1200%}.row-gutter-3{padding:12px 6px}.row-gutter-3 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-3 .column-span-1{width:33.3333333333%}.row-gutter-3 .column-offset-1{margin-left:33.3333333333%}.row-gutter-3 .column-span-2{width:66.6666666667%}.row-gutter-3 .column-offset-2{margin-left:66.6666666667%}.row-gutter-3 .column-span-3{width:100%}.row-gutter-3 .column-offset-3{margin-left:100%}.row-gutter-3 .column-span-4{width:133.3333333333%}.row-gutter-3 .column-offset-4{margin-left:133.3333333333%}.row-gutter-3 .column-span-5{width:166.6666666667%}.row-gutter-3 .column-offset-5{margin-left:166.6666666667%}.row-gutter-3 .column-span-6{width:200%}.row-gutter-3 .column-offset-6{margin-left:200%}.row-gutter-3 .column-span-7{width:233.3333333333%}.row-gutter-3 .column-offset-7{margin-left:233.3333333333%}.row-gutter-3 .column-span-8{width:266.6666666667%}.row-gutter-3 .column-offset-8{margin-left:266.6666666667%}.row-gutter-3 .column-span-9{width:300%}.row-gutter-3 .column-offset-9{margin-left:300%}.row-gutter-3 .column-span-10{width:333.3333333333%}.row-gutter-3 .column-offset-10{margin-left:333.3333333333%}.row-gutter-3 .column-span-11{width:366.6666666667%}.row-gutter-3 .column-offset-11{margin-left:366.6666666667%}.row-gutter-3 .column-span-12{width:400%}.row-gutter-3 .column-offset-12{margin-left:400%}.row-gutter-3 .column-span-13{width:433.3333333333%}.row-gutter-3 .column-offset-13{margin-left:433.3333333333%}.row-gutter-3 .column-span-14{width:466.6666666667%}.row-gutter-3 .column-offset-14{margin-left:466.6666666667%}.row-gutter-3 .column-span-15{width:500%}.row-gutter-3 .column-offset-15{margin-left:500%}.row-gutter-3 .column-span-16{width:533.3333333333%}.row-gutter-3 .column-offset-16{margin-left:533.3333333333%}.row-gutter-3 .column-span-17{width:566.6666666667%}.row-gutter-3 .column-offset-17{margin-left:566.6666666667%}.row-gutter-3 .column-span-18{width:600%}.row-gutter-3 .column-offset-18{margin-left:600%}.row-gutter-3 .column-span-19{width:633.3333333333%}.row-gutter-3 .column-offset-19{margin-left:633.3333333333%}.row-gutter-3 .column-span-20{width:666.6666666667%}.row-gutter-3 .column-offset-20{margin-left:666.6666666667%}.row-gutter-3 .column-span-21{width:700%}.row-gutter-3 .column-offset-21{margin-left:700%}.row-gutter-3 .column-span-22{width:733.3333333333%}.row-gutter-3 .column-offset-22{margin-left:733.3333333333%}.row-gutter-3 .column-span-23{width:766.6666666667%}.row-gutter-3 .column-offset-23{margin-left:766.6666666667%}.row-gutter-3 .column-span-24{width:800%}.row-gutter-3 .column-offset-24{margin-left:800%}.row-gutter-4{padding:12px 6px}.row-gutter-4 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-4 .column-span-1{width:25%}.row-gutter-4 .column-offset-1{margin-left:25%}.row-gutter-4 .column-span-2{width:50%}.row-gutter-4 .column-offset-2{margin-left:50%}.row-gutter-4 .column-span-3{width:75%}.row-gutter-4 .column-offset-3{margin-left:75%}.row-gutter-4 .column-span-4{width:100%}.row-gutter-4 .column-offset-4{margin-left:100%}.row-gutter-4 .column-span-5{width:125%}.row-gutter-4 .column-offset-5{margin-left:125%}.row-gutter-4 .column-span-6{width:150%}.row-gutter-4 .column-offset-6{margin-left:150%}.row-gutter-4 .column-span-7{width:175%}.row-gutter-4 .column-offset-7{margin-left:175%}.row-gutter-4 .column-span-8{width:200%}.row-gutter-4 .column-offset-8{margin-left:200%}.row-gutter-4 .column-span-9{width:225%}.row-gutter-4 .column-offset-9{margin-left:225%}.row-gutter-4 .column-span-10{width:250%}.row-gutter-4 .column-offset-10{margin-left:250%}.row-gutter-4 .column-span-11{width:275%}.row-gutter-4 .column-offset-11{margin-left:275%}.row-gutter-4 .column-span-12{width:300%}.row-gutter-4 .column-offset-12{margin-left:300%}.row-gutter-4 .column-span-13{width:325%}.row-gutter-4 .column-offset-13{margin-left:325%}.row-gutter-4 .column-span-14{width:350%}.row-gutter-4 .column-offset-14{margin-left:350%}.row-gutter-4 .column-span-15{width:375%}.row-gutter-4 .column-offset-15{margin-left:375%}.row-gutter-4 .column-span-16{width:400%}.row-gutter-4 .column-offset-16{margin-left:400%}.row-gutter-4 .column-span-17{width:425%}.row-gutter-4 .column-offset-17{margin-left:425%}.row-gutter-4 .column-span-18{width:450%}.row-gutter-4 .column-offset-18{margin-left:450%}.row-gutter-4 .column-span-19{width:475%}.row-gutter-4 .column-offset-19{margin-left:475%}.row-gutter-4 .column-span-20{width:500%}.row-gutter-4 .column-offset-20{margin-left:500%}.row-gutter-4 .column-span-21{width:525%}.row-gutter-4 .column-offset-21{margin-left:525%}.row-gutter-4 .column-span-22{width:550%}.row-gutter-4 .column-offset-22{margin-left:550%}.row-gutter-4 .column-span-23{width:575%}.row-gutter-4 .column-offset-23{margin-left:575%}.row-gutter-4 .column-span-24{width:600%}.row-gutter-4 .column-offset-24{margin-left:600%}.row-gutter-5{padding:12px 6px}.row-gutter-5 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-5 .column-span-1{width:20%}.row-gutter-5 .column-offset-1{margin-left:20%}.row-gutter-5 .column-span-2{width:40%}.row-gutter-5 .column-offset-2{margin-left:40%}.row-gutter-5 .column-span-3{width:60%}.row-gutter-5 .column-offset-3{margin-left:60%}.row-gutter-5 .column-span-4{width:80%}.row-gutter-5 .column-offset-4{margin-left:80%}.row-gutter-5 .column-span-5{width:100%}.row-gutter-5 .column-offset-5{margin-left:100%}.row-gutter-5 .column-span-6{width:120%}.row-gutter-5 .column-offset-6{margin-left:120%}.row-gutter-5 .column-span-7{width:140%}.row-gutter-5 .column-offset-7{margin-left:140%}.row-gutter-5 .column-span-8{width:160%}.row-gutter-5 .column-offset-8{margin-left:160%}.row-gutter-5 .column-span-9{width:180%}.row-gutter-5 .column-offset-9{margin-left:180%}.row-gutter-5 .column-span-10{width:200%}.row-gutter-5 .column-offset-10{margin-left:200%}.row-gutter-5 .column-span-11{width:220%}.row-gutter-5 .column-offset-11{margin-left:220%}.row-gutter-5 .column-span-12{width:240%}.row-gutter-5 .column-offset-12{margin-left:240%}.row-gutter-5 .column-span-13{width:260%}.row-gutter-5 .column-offset-13{margin-left:260%}.row-gutter-5 .column-span-14{width:280%}.row-gutter-5 .column-offset-14{margin-left:280%}.row-gutter-5 .column-span-15{width:300%}.row-gutter-5 .column-offset-15{margin-left:300%}.row-gutter-5 .column-span-16{width:320%}.row-gutter-5 .column-offset-16{margin-left:320%}.row-gutter-5 .column-span-17{width:340%}.row-gutter-5 .column-offset-17{margin-left:340%}.row-gutter-5 .column-span-18{width:360%}.row-gutter-5 .column-offset-18{margin-left:360%}.row-gutter-5 .column-span-19{width:380%}.row-gutter-5 .column-offset-19{margin-left:380%}.row-gutter-5 .column-span-20{width:400%}.row-gutter-5 .column-offset-20{margin-left:400%}.row-gutter-5 .column-span-21{width:420%}.row-gutter-5 .column-offset-21{margin-left:420%}.row-gutter-5 .column-span-22{width:440%}.row-gutter-5 .column-offset-22{margin-left:440%}.row-gutter-5 .column-span-23{width:460%}.row-gutter-5 .column-offset-23{margin-left:460%}.row-gutter-5 .column-span-24{width:480%}.row-gutter-5 .column-offset-24{margin-left:480%}.row-gutter-6{padding:12px 6px}.row-gutter-6 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-6 .column-span-1{width:16.6666666667%}.row-gutter-6 .column-offset-1{margin-left:16.6666666667%}.row-gutter-6 .column-span-2{width:33.3333333333%}.row-gutter-6 .column-offset-2{margin-left:33.3333333333%}.row-gutter-6 .column-span-3{width:50%}.row-gutter-6 .column-offset-3{margin-left:50%}.row-gutter-6 .column-span-4{width:66.6666666667%}.row-gutter-6 .column-offset-4{margin-left:66.6666666667%}.row-gutter-6 .column-span-5{width:83.3333333333%}.row-gutter-6 .column-offset-5{margin-left:83.3333333333%}.row-gutter-6 .column-span-6{width:100%}.row-gutter-6 .column-offset-6{margin-left:100%}.row-gutter-6 .column-span-7{width:116.6666666667%}.row-gutter-6 .column-offset-7{margin-left:116.6666666667%}.row-gutter-6 .column-span-8{width:133.3333333333%}.row-gutter-6 .column-offset-8{margin-left:133.3333333333%}.row-gutter-6 .column-span-9{width:150%}.row-gutter-6 .column-offset-9{margin-left:150%}.row-gutter-6 .column-span-10{width:166.6666666667%}.row-gutter-6 .column-offset-10{margin-left:166.6666666667%}.row-gutter-6 .column-span-11{width:183.3333333333%}.row-gutter-6 .column-offset-11{margin-left:183.3333333333%}.row-gutter-6 .column-span-12{width:200%}.row-gutter-6 .column-offset-12{margin-left:200%}.row-gutter-6 .column-span-13{width:216.6666666667%}.row-gutter-6 .column-offset-13{margin-left:216.6666666667%}.row-gutter-6 .column-span-14{width:233.3333333333%}.row-gutter-6 .column-offset-14{margin-left:233.3333333333%}.row-gutter-6 .column-span-15{width:250%}.row-gutter-6 .column-offset-15{margin-left:250%}.row-gutter-6 .column-span-16{width:266.6666666667%}.row-gutter-6 .column-offset-16{margin-left:266.6666666667%}.row-gutter-6 .column-span-17{width:283.3333333333%}.row-gutter-6 .column-offset-17{margin-left:283.3333333333%}.row-gutter-6 .column-span-18{width:300%}.row-gutter-6 .column-offset-18{margin-left:300%}.row-gutter-6 .column-span-19{width:316.6666666667%}.row-gutter-6 .column-offset-19{margin-left:316.6666666667%}.row-gutter-6 .column-span-20{width:333.3333333333%}.row-gutter-6 .column-offset-20{margin-left:333.3333333333%}.row-gutter-6 .column-span-21{width:350%}.row-gutter-6 .column-offset-21{margin-left:350%}.row-gutter-6 .column-span-22{width:366.6666666667%}.row-gutter-6 .column-offset-22{margin-left:366.6666666667%}.row-gutter-6 .column-span-23{width:383.3333333333%}.row-gutter-6 .column-offset-23{margin-left:383.3333333333%}.row-gutter-6 .column-span-24{width:400%}.row-gutter-6 .column-offset-24{margin-left:400%}.row-gutter-7{padding:12px 6px}.row-gutter-7 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-7 .column-span-1{width:14.2857142857%}.row-gutter-7 .column-offset-1{margin-left:14.2857142857%}.row-gutter-7 .column-span-2{width:28.5714285714%}.row-gutter-7 .column-offset-2{margin-left:28.5714285714%}.row-gutter-7 .column-span-3{width:42.8571428571%}.row-gutter-7 .column-offset-3{margin-left:42.8571428571%}.row-gutter-7 .column-span-4{width:57.1428571429%}.row-gutter-7 .column-offset-4{margin-left:57.1428571429%}.row-gutter-7 .column-span-5{width:71.4285714286%}.row-gutter-7 .column-offset-5{margin-left:71.4285714286%}.row-gutter-7 .column-span-6{width:85.7142857143%}.row-gutter-7 .column-offset-6{margin-left:85.7142857143%}.row-gutter-7 .column-span-7{width:100%}.row-gutter-7 .column-offset-7{margin-left:100%}.row-gutter-7 .column-span-8{width:114.2857142857%}.row-gutter-7 .column-offset-8{margin-left:114.2857142857%}.row-gutter-7 .column-span-9{width:128.5714285714%}.row-gutter-7 .column-offset-9{margin-left:128.5714285714%}.row-gutter-7 .column-span-10{width:142.8571428571%}.row-gutter-7 .column-offset-10{margin-left:142.8571428571%}.row-gutter-7 .column-span-11{width:157.1428571429%}.row-gutter-7 .column-offset-11{margin-left:157.1428571429%}.row-gutter-7 .column-span-12{width:171.4285714286%}.row-gutter-7 .column-offset-12{margin-left:171.4285714286%}.row-gutter-7 .column-span-13{width:185.7142857143%}.row-gutter-7 .column-offset-13{margin-left:185.7142857143%}.row-gutter-7 .column-span-14{width:200%}.row-gutter-7 .column-offset-14{margin-left:200%}.row-gutter-7 .column-span-15{width:214.2857142857%}.row-gutter-7 .column-offset-15{margin-left:214.2857142857%}.row-gutter-7 .column-span-16{width:228.5714285714%}.row-gutter-7 .column-offset-16{margin-left:228.5714285714%}.row-gutter-7 .column-span-17{width:242.8571428571%}.row-gutter-7 .column-offset-17{margin-left:242.8571428571%}.row-gutter-7 .column-span-18{width:257.1428571429%}.row-gutter-7 .column-offset-18{margin-left:257.1428571429%}.row-gutter-7 .column-span-19{width:271.4285714286%}.row-gutter-7 .column-offset-19{margin-left:271.4285714286%}.row-gutter-7 .column-span-20{width:285.7142857143%}.row-gutter-7 .column-offset-20{margin-left:285.7142857143%}.row-gutter-7 .column-span-21{width:300%}.row-gutter-7 .column-offset-21{margin-left:300%}.row-gutter-7 .column-span-22{width:314.2857142857%}.row-gutter-7 .column-offset-22{margin-left:314.2857142857%}.row-gutter-7 .column-span-23{width:328.5714285714%}.row-gutter-7 .column-offset-23{margin-left:328.5714285714%}.row-gutter-7 .column-span-24{width:342.8571428571%}.row-gutter-7 .column-offset-24{margin-left:342.8571428571%}.row-gutter-8{padding:12px 6px}.row-gutter-8 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-8 .column-span-1{width:12.5%}.row-gutter-8 .column-offset-1{margin-left:12.5%}.row-gutter-8 .column-span-2{width:25%}.row-gutter-8 .column-offset-2{margin-left:25%}.row-gutter-8 .column-span-3{width:37.5%}.row-gutter-8 .column-offset-3{margin-left:37.5%}.row-gutter-8 .column-span-4{width:50%}.row-gutter-8 .column-offset-4{margin-left:50%}.row-gutter-8 .column-span-5{width:62.5%}.row-gutter-8 .column-offset-5{margin-left:62.5%}.row-gutter-8 .column-span-6{width:75%}.row-gutter-8 .column-offset-6{margin-left:75%}.row-gutter-8 .column-span-7{width:87.5%}.row-gutter-8 .column-offset-7{margin-left:87.5%}.row-gutter-8 .column-span-8{width:100%}.row-gutter-8 .column-offset-8{margin-left:100%}.row-gutter-8 .column-span-9{width:112.5%}.row-gutter-8 .column-offset-9{margin-left:112.5%}.row-gutter-8 .column-span-10{width:125%}.row-gutter-8 .column-offset-10{margin-left:125%}.row-gutter-8 .column-span-11{width:137.5%}.row-gutter-8 .column-offset-11{margin-left:137.5%}.row-gutter-8 .column-span-12{width:150%}.row-gutter-8 .column-offset-12{margin-left:150%}.row-gutter-8 .column-span-13{width:162.5%}.row-gutter-8 .column-offset-13{margin-left:162.5%}.row-gutter-8 .column-span-14{width:175%}.row-gutter-8 .column-offset-14{margin-left:175%}.row-gutter-8 .column-span-15{width:187.5%}.row-gutter-8 .column-offset-15{margin-left:187.5%}.row-gutter-8 .column-span-16{width:200%}.row-gutter-8 .column-offset-16{margin-left:200%}.row-gutter-8 .column-span-17{width:212.5%}.row-gutter-8 .column-offset-17{margin-left:212.5%}.row-gutter-8 .column-span-18{width:225%}.row-gutter-8 .column-offset-18{margin-left:225%}.row-gutter-8 .column-span-19{width:237.5%}.row-gutter-8 .column-offset-19{margin-left:237.5%}.row-gutter-8 .column-span-20{width:250%}.row-gutter-8 .column-offset-20{margin-left:250%}.row-gutter-8 .column-span-21{width:262.5%}.row-gutter-8 .column-offset-21{margin-left:262.5%}.row-gutter-8 .column-span-22{width:275%}.row-gutter-8 .column-offset-22{margin-left:275%}.row-gutter-8 .column-span-23{width:287.5%}.row-gutter-8 .column-offset-23{margin-left:287.5%}.row-gutter-8 .column-span-24{width:300%}.row-gutter-8 .column-offset-24{margin-left:300%}.row-gutter-9{padding:12px 6px}.row-gutter-9 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-9 .column-span-1{width:11.1111111111%}.row-gutter-9 .column-offset-1{margin-left:11.1111111111%}.row-gutter-9 .column-span-2{width:22.2222222222%}.row-gutter-9 .column-offset-2{margin-left:22.2222222222%}.row-gutter-9 .column-span-3{width:33.3333333333%}.row-gutter-9 .column-offset-3{margin-left:33.3333333333%}.row-gutter-9 .column-span-4{width:44.4444444444%}.row-gutter-9 .column-offset-4{margin-left:44.4444444444%}.row-gutter-9 .column-span-5{width:55.5555555556%}.row-gutter-9 .column-offset-5{margin-left:55.5555555556%}.row-gutter-9 .column-span-6{width:66.6666666667%}.row-gutter-9 .column-offset-6{margin-left:66.6666666667%}.row-gutter-9 .column-span-7{width:77.7777777778%}.row-gutter-9 .column-offset-7{margin-left:77.7777777778%}.row-gutter-9 .column-span-8{width:88.8888888889%}.row-gutter-9 .column-offset-8{margin-left:88.8888888889%}.row-gutter-9 .column-span-9{width:100%}.row-gutter-9 .column-offset-9{margin-left:100%}.row-gutter-9 .column-span-10{width:111.1111111111%}.row-gutter-9 .column-offset-10{margin-left:111.1111111111%}.row-gutter-9 .column-span-11{width:122.2222222222%}.row-gutter-9 .column-offset-11{margin-left:122.2222222222%}.row-gutter-9 .column-span-12{width:133.3333333333%}.row-gutter-9 .column-offset-12{margin-left:133.3333333333%}.row-gutter-9 .column-span-13{width:144.4444444444%}.row-gutter-9 .column-offset-13{margin-left:144.4444444444%}.row-gutter-9 .column-span-14{width:155.5555555556%}.row-gutter-9 .column-offset-14{margin-left:155.5555555556%}.row-gutter-9 .column-span-15{width:166.6666666667%}.row-gutter-9 .column-offset-15{margin-left:166.6666666667%}.row-gutter-9 .column-span-16{width:177.7777777778%}.row-gutter-9 .column-offset-16{margin-left:177.7777777778%}.row-gutter-9 .column-span-17{width:188.8888888889%}.row-gutter-9 .column-offset-17{margin-left:188.8888888889%}.row-gutter-9 .column-span-18{width:200%}.row-gutter-9 .column-offset-18{margin-left:200%}.row-gutter-9 .column-span-19{width:211.1111111111%}.row-gutter-9 .column-offset-19{margin-left:211.1111111111%}.row-gutter-9 .column-span-20{width:222.2222222222%}.row-gutter-9 .column-offset-20{margin-left:222.2222222222%}.row-gutter-9 .column-span-21{width:233.3333333333%}.row-gutter-9 .column-offset-21{margin-left:233.3333333333%}.row-gutter-9 .column-span-22{width:244.4444444444%}.row-gutter-9 .column-offset-22{margin-left:244.4444444444%}.row-gutter-9 .column-span-23{width:255.5555555556%}.row-gutter-9 .column-offset-23{margin-left:255.5555555556%}.row-gutter-9 .column-span-24{width:266.6666666667%}.row-gutter-9 .column-offset-24{margin-left:266.6666666667%}.row-gutter-10{padding:12px 6px}.row-gutter-10 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-10 .column-span-1{width:10%}.row-gutter-10 .column-offset-1{margin-left:10%}.row-gutter-10 .column-span-2{width:20%}.row-gutter-10 .column-offset-2{margin-left:20%}.row-gutter-10 .column-span-3{width:30%}.row-gutter-10 .column-offset-3{margin-left:30%}.row-gutter-10 .column-span-4{width:40%}.row-gutter-10 .column-offset-4{margin-left:40%}.row-gutter-10 .column-span-5{width:50%}.row-gutter-10 .column-offset-5{margin-left:50%}.row-gutter-10 .column-span-6{width:60%}.row-gutter-10 .column-offset-6{margin-left:60%}.row-gutter-10 .column-span-7{width:70%}.row-gutter-10 .column-offset-7{margin-left:70%}.row-gutter-10 .column-span-8{width:80%}.row-gutter-10 .column-offset-8{margin-left:80%}.row-gutter-10 .column-span-9{width:90%}.row-gutter-10 .column-offset-9{margin-left:90%}.row-gutter-10 .column-span-10{width:100%}.row-gutter-10 .column-offset-10{margin-left:100%}.row-gutter-10 .column-span-11{width:110%}.row-gutter-10 .column-offset-11{margin-left:110%}.row-gutter-10 .column-span-12{width:120%}.row-gutter-10 .column-offset-12{margin-left:120%}.row-gutter-10 .column-span-13{width:130%}.row-gutter-10 .column-offset-13{margin-left:130%}.row-gutter-10 .column-span-14{width:140%}.row-gutter-10 .column-offset-14{margin-left:140%}.row-gutter-10 .column-span-15{width:150%}.row-gutter-10 .column-offset-15{margin-left:150%}.row-gutter-10 .column-span-16{width:160%}.row-gutter-10 .column-offset-16{margin-left:160%}.row-gutter-10 .column-span-17{width:170%}.row-gutter-10 .column-offset-17{margin-left:170%}.row-gutter-10 .column-span-18{width:180%}.row-gutter-10 .column-offset-18{margin-left:180%}.row-gutter-10 .column-span-19{width:190%}.row-gutter-10 .column-offset-19{margin-left:190%}.row-gutter-10 .column-span-20{width:200%}.row-gutter-10 .column-offset-20{margin-left:200%}.row-gutter-10 .column-span-21{width:210%}.row-gutter-10 .column-offset-21{margin-left:210%}.row-gutter-10 .column-span-22{width:220%}.row-gutter-10 .column-offset-22{margin-left:220%}.row-gutter-10 .column-span-23{width:230%}.row-gutter-10 .column-offset-23{margin-left:230%}.row-gutter-10 .column-span-24{width:240%}.row-gutter-10 .column-offset-24{margin-left:240%}.row-gutter-11{padding:12px 6px}.row-gutter-11 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-11 .column-span-1{width:9.0909090909%}.row-gutter-11 .column-offset-1{margin-left:9.0909090909%}.row-gutter-11 .column-span-2{width:18.1818181818%}.row-gutter-11 .column-offset-2{margin-left:18.1818181818%}.row-gutter-11 .column-span-3{width:27.2727272727%}.row-gutter-11 .column-offset-3{margin-left:27.2727272727%}.row-gutter-11 .column-span-4{width:36.3636363636%}.row-gutter-11 .column-offset-4{margin-left:36.3636363636%}.row-gutter-11 .column-span-5{width:45.4545454545%}.row-gutter-11 .column-offset-5{margin-left:45.4545454545%}.row-gutter-11 .column-span-6{width:54.5454545455%}.row-gutter-11 .column-offset-6{margin-left:54.5454545455%}.row-gutter-11 .column-span-7{width:63.6363636364%}.row-gutter-11 .column-offset-7{margin-left:63.6363636364%}.row-gutter-11 .column-span-8{width:72.7272727273%}.row-gutter-11 .column-offset-8{margin-left:72.7272727273%}.row-gutter-11 .column-span-9{width:81.8181818182%}.row-gutter-11 .column-offset-9{margin-left:81.8181818182%}.row-gutter-11 .column-span-10{width:90.9090909091%}.row-gutter-11 .column-offset-10{margin-left:90.9090909091%}.row-gutter-11 .column-span-11{width:100%}.row-gutter-11 .column-offset-11{margin-left:100%}.row-gutter-11 .column-span-12{width:109.0909090909%}.row-gutter-11 .column-offset-12{margin-left:109.0909090909%}.row-gutter-11 .column-span-13{width:118.1818181818%}.row-gutter-11 .column-offset-13{margin-left:118.1818181818%}.row-gutter-11 .column-span-14{width:127.2727272727%}.row-gutter-11 .column-offset-14{margin-left:127.2727272727%}.row-gutter-11 .column-span-15{width:136.3636363636%}.row-gutter-11 .column-offset-15{margin-left:136.3636363636%}.row-gutter-11 .column-span-16{width:145.4545454545%}.row-gutter-11 .column-offset-16{margin-left:145.4545454545%}.row-gutter-11 .column-span-17{width:154.5454545455%}.row-gutter-11 .column-offset-17{margin-left:154.5454545455%}.row-gutter-11 .column-span-18{width:163.6363636364%}.row-gutter-11 .column-offset-18{margin-left:163.6363636364%}.row-gutter-11 .column-span-19{width:172.7272727273%}.row-gutter-11 .column-offset-19{margin-left:172.7272727273%}.row-gutter-11 .column-span-20{width:181.8181818182%}.row-gutter-11 .column-offset-20{margin-left:181.8181818182%}.row-gutter-11 .column-span-21{width:190.9090909091%}.row-gutter-11 .column-offset-21{margin-left:190.9090909091%}.row-gutter-11 .column-span-22{width:200%}.row-gutter-11 .column-offset-22{margin-left:200%}.row-gutter-11 .column-span-23{width:209.0909090909%}.row-gutter-11 .column-offset-23{margin-left:209.0909090909%}.row-gutter-11 .column-span-24{width:218.1818181818%}.row-gutter-11 .column-offset-24{margin-left:218.1818181818%}.row-gutter-12{padding:12px 6px}.row-gutter-12 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-12 .column-span-1{width:8.3333333333%}.row-gutter-12 .column-offset-1{margin-left:8.3333333333%}.row-gutter-12 .column-span-2{width:16.6666666667%}.row-gutter-12 .column-offset-2{margin-left:16.6666666667%}.row-gutter-12 .column-span-3{width:25%}.row-gutter-12 .column-offset-3{margin-left:25%}.row-gutter-12 .column-span-4{width:33.3333333333%}.row-gutter-12 .column-offset-4{margin-left:33.3333333333%}.row-gutter-12 .column-span-5{width:41.6666666667%}.row-gutter-12 .column-offset-5{margin-left:41.6666666667%}.row-gutter-12 .column-span-6{width:50%}.row-gutter-12 .column-offset-6{margin-left:50%}.row-gutter-12 .column-span-7{width:58.3333333333%}.row-gutter-12 .column-offset-7{margin-left:58.3333333333%}.row-gutter-12 .column-span-8{width:66.6666666667%}.row-gutter-12 .column-offset-8{margin-left:66.6666666667%}.row-gutter-12 .column-span-9{width:75%}.row-gutter-12 .column-offset-9{margin-left:75%}.row-gutter-12 .column-span-10{width:83.3333333333%}.row-gutter-12 .column-offset-10{margin-left:83.3333333333%}.row-gutter-12 .column-span-11{width:91.6666666667%}.row-gutter-12 .column-offset-11{margin-left:91.6666666667%}.row-gutter-12 .column-span-12{width:100%}.row-gutter-12 .column-offset-12{margin-left:100%}.row-gutter-12 .column-span-13{width:108.3333333333%}.row-gutter-12 .column-offset-13{margin-left:108.3333333333%}.row-gutter-12 .column-span-14{width:116.6666666667%}.row-gutter-12 .column-offset-14{margin-left:116.6666666667%}.row-gutter-12 .column-span-15{width:125%}.row-gutter-12 .column-offset-15{margin-left:125%}.row-gutter-12 .column-span-16{width:133.3333333333%}.row-gutter-12 .column-offset-16{margin-left:133.3333333333%}.row-gutter-12 .column-span-17{width:141.6666666667%}.row-gutter-12 .column-offset-17{margin-left:141.6666666667%}.row-gutter-12 .column-span-18{width:150%}.row-gutter-12 .column-offset-18{margin-left:150%}.row-gutter-12 .column-span-19{width:158.3333333333%}.row-gutter-12 .column-offset-19{margin-left:158.3333333333%}.row-gutter-12 .column-span-20{width:166.6666666667%}.row-gutter-12 .column-offset-20{margin-left:166.6666666667%}.row-gutter-12 .column-span-21{width:175%}.row-gutter-12 .column-offset-21{margin-left:175%}.row-gutter-12 .column-span-22{width:183.3333333333%}.row-gutter-12 .column-offset-22{margin-left:183.3333333333%}.row-gutter-12 .column-span-23{width:191.6666666667%}.row-gutter-12 .column-offset-23{margin-left:191.6666666667%}.row-gutter-12 .column-span-24{width:200%}.row-gutter-12 .column-offset-24{margin-left:200%}.row-gutter-13{padding:12px 6px}.row-gutter-13 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-13 .column-span-1{width:7.6923076923%}.row-gutter-13 .column-offset-1{margin-left:7.6923076923%}.row-gutter-13 .column-span-2{width:15.3846153846%}.row-gutter-13 .column-offset-2{margin-left:15.3846153846%}.row-gutter-13 .column-span-3{width:23.0769230769%}.row-gutter-13 .column-offset-3{margin-left:23.0769230769%}.row-gutter-13 .column-span-4{width:30.7692307692%}.row-gutter-13 .column-offset-4{margin-left:30.7692307692%}.row-gutter-13 .column-span-5{width:38.4615384615%}.row-gutter-13 .column-offset-5{margin-left:38.4615384615%}.row-gutter-13 .column-span-6{width:46.1538461538%}.row-gutter-13 .column-offset-6{margin-left:46.1538461538%}.row-gutter-13 .column-span-7{width:53.8461538462%}.row-gutter-13 .column-offset-7{margin-left:53.8461538462%}.row-gutter-13 .column-span-8{width:61.5384615385%}.row-gutter-13 .column-offset-8{margin-left:61.5384615385%}.row-gutter-13 .column-span-9{width:69.2307692308%}.row-gutter-13 .column-offset-9{margin-left:69.2307692308%}.row-gutter-13 .column-span-10{width:76.9230769231%}.row-gutter-13 .column-offset-10{margin-left:76.9230769231%}.row-gutter-13 .column-span-11{width:84.6153846154%}.row-gutter-13 .column-offset-11{margin-left:84.6153846154%}.row-gutter-13 .column-span-12{width:92.3076923077%}.row-gutter-13 .column-offset-12{margin-left:92.3076923077%}.row-gutter-13 .column-span-13{width:100%}.row-gutter-13 .column-offset-13{margin-left:100%}.row-gutter-13 .column-span-14{width:107.6923076923%}.row-gutter-13 .column-offset-14{margin-left:107.6923076923%}.row-gutter-13 .column-span-15{width:115.3846153846%}.row-gutter-13 .column-offset-15{margin-left:115.3846153846%}.row-gutter-13 .column-span-16{width:123.0769230769%}.row-gutter-13 .column-offset-16{margin-left:123.0769230769%}.row-gutter-13 .column-span-17{width:130.7692307692%}.row-gutter-13 .column-offset-17{margin-left:130.7692307692%}.row-gutter-13 .column-span-18{width:138.4615384615%}.row-gutter-13 .column-offset-18{margin-left:138.4615384615%}.row-gutter-13 .column-span-19{width:146.1538461538%}.row-gutter-13 .column-offset-19{margin-left:146.1538461538%}.row-gutter-13 .column-span-20{width:153.8461538462%}.row-gutter-13 .column-offset-20{margin-left:153.8461538462%}.row-gutter-13 .column-span-21{width:161.5384615385%}.row-gutter-13 .column-offset-21{margin-left:161.5384615385%}.row-gutter-13 .column-span-22{width:169.2307692308%}.row-gutter-13 .column-offset-22{margin-left:169.2307692308%}.row-gutter-13 .column-span-23{width:176.9230769231%}.row-gutter-13 .column-offset-23{margin-left:176.9230769231%}.row-gutter-13 .column-span-24{width:184.6153846154%}.row-gutter-13 .column-offset-24{margin-left:184.6153846154%}.row-gutter-14{padding:12px 6px}.row-gutter-14 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-14 .column-span-1{width:7.1428571429%}.row-gutter-14 .column-offset-1{margin-left:7.1428571429%}.row-gutter-14 .column-span-2{width:14.2857142857%}.row-gutter-14 .column-offset-2{margin-left:14.2857142857%}.row-gutter-14 .column-span-3{width:21.4285714286%}.row-gutter-14 .column-offset-3{margin-left:21.4285714286%}.row-gutter-14 .column-span-4{width:28.5714285714%}.row-gutter-14 .column-offset-4{margin-left:28.5714285714%}.row-gutter-14 .column-span-5{width:35.7142857143%}.row-gutter-14 .column-offset-5{margin-left:35.7142857143%}.row-gutter-14 .column-span-6{width:42.8571428571%}.row-gutter-14 .column-offset-6{margin-left:42.8571428571%}.row-gutter-14 .column-span-7{width:50%}.row-gutter-14 .column-offset-7{margin-left:50%}.row-gutter-14 .column-span-8{width:57.1428571429%}.row-gutter-14 .column-offset-8{margin-left:57.1428571429%}.row-gutter-14 .column-span-9{width:64.2857142857%}.row-gutter-14 .column-offset-9{margin-left:64.2857142857%}.row-gutter-14 .column-span-10{width:71.4285714286%}.row-gutter-14 .column-offset-10{margin-left:71.4285714286%}.row-gutter-14 .column-span-11{width:78.5714285714%}.row-gutter-14 .column-offset-11{margin-left:78.5714285714%}.row-gutter-14 .column-span-12{width:85.7142857143%}.row-gutter-14 .column-offset-12{margin-left:85.7142857143%}.row-gutter-14 .column-span-13{width:92.8571428571%}.row-gutter-14 .column-offset-13{margin-left:92.8571428571%}.row-gutter-14 .column-span-14{width:100%}.row-gutter-14 .column-offset-14{margin-left:100%}.row-gutter-14 .column-span-15{width:107.1428571429%}.row-gutter-14 .column-offset-15{margin-left:107.1428571429%}.row-gutter-14 .column-span-16{width:114.2857142857%}.row-gutter-14 .column-offset-16{margin-left:114.2857142857%}.row-gutter-14 .column-span-17{width:121.4285714286%}.row-gutter-14 .column-offset-17{margin-left:121.4285714286%}.row-gutter-14 .column-span-18{width:128.5714285714%}.row-gutter-14 .column-offset-18{margin-left:128.5714285714%}.row-gutter-14 .column-span-19{width:135.7142857143%}.row-gutter-14 .column-offset-19{margin-left:135.7142857143%}.row-gutter-14 .column-span-20{width:142.8571428571%}.row-gutter-14 .column-offset-20{margin-left:142.8571428571%}.row-gutter-14 .column-span-21{width:150%}.row-gutter-14 .column-offset-21{margin-left:150%}.row-gutter-14 .column-span-22{width:157.1428571429%}.row-gutter-14 .column-offset-22{margin-left:157.1428571429%}.row-gutter-14 .column-span-23{width:164.2857142857%}.row-gutter-14 .column-offset-23{margin-left:164.2857142857%}.row-gutter-14 .column-span-24{width:171.4285714286%}.row-gutter-14 .column-offset-24{margin-left:171.4285714286%}.row-gutter-15{padding:12px 6px}.row-gutter-15 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-15 .column-span-1{width:6.6666666667%}.row-gutter-15 .column-offset-1{margin-left:6.6666666667%}.row-gutter-15 .column-span-2{width:13.3333333333%}.row-gutter-15 .column-offset-2{margin-left:13.3333333333%}.row-gutter-15 .column-span-3{width:20%}.row-gutter-15 .column-offset-3{margin-left:20%}.row-gutter-15 .column-span-4{width:26.6666666667%}.row-gutter-15 .column-offset-4{margin-left:26.6666666667%}.row-gutter-15 .column-span-5{width:33.3333333333%}.row-gutter-15 .column-offset-5{margin-left:33.3333333333%}.row-gutter-15 .column-span-6{width:40%}.row-gutter-15 .column-offset-6{margin-left:40%}.row-gutter-15 .column-span-7{width:46.6666666667%}.row-gutter-15 .column-offset-7{margin-left:46.6666666667%}.row-gutter-15 .column-span-8{width:53.3333333333%}.row-gutter-15 .column-offset-8{margin-left:53.3333333333%}.row-gutter-15 .column-span-9{width:60%}.row-gutter-15 .column-offset-9{margin-left:60%}.row-gutter-15 .column-span-10{width:66.6666666667%}.row-gutter-15 .column-offset-10{margin-left:66.6666666667%}.row-gutter-15 .column-span-11{width:73.3333333333%}.row-gutter-15 .column-offset-11{margin-left:73.3333333333%}.row-gutter-15 .column-span-12{width:80%}.row-gutter-15 .column-offset-12{margin-left:80%}.row-gutter-15 .column-span-13{width:86.6666666667%}.row-gutter-15 .column-offset-13{margin-left:86.6666666667%}.row-gutter-15 .column-span-14{width:93.3333333333%}.row-gutter-15 .column-offset-14{margin-left:93.3333333333%}.row-gutter-15 .column-span-15{width:100%}.row-gutter-15 .column-offset-15{margin-left:100%}.row-gutter-15 .column-span-16{width:106.6666666667%}.row-gutter-15 .column-offset-16{margin-left:106.6666666667%}.row-gutter-15 .column-span-17{width:113.3333333333%}.row-gutter-15 .column-offset-17{margin-left:113.3333333333%}.row-gutter-15 .column-span-18{width:120%}.row-gutter-15 .column-offset-18{margin-left:120%}.row-gutter-15 .column-span-19{width:126.6666666667%}.row-gutter-15 .column-offset-19{margin-left:126.6666666667%}.row-gutter-15 .column-span-20{width:133.3333333333%}.row-gutter-15 .column-offset-20{margin-left:133.3333333333%}.row-gutter-15 .column-span-21{width:140%}.row-gutter-15 .column-offset-21{margin-left:140%}.row-gutter-15 .column-span-22{width:146.6666666667%}.row-gutter-15 .column-offset-22{margin-left:146.6666666667%}.row-gutter-15 .column-span-23{width:153.3333333333%}.row-gutter-15 .column-offset-23{margin-left:153.3333333333%}.row-gutter-15 .column-span-24{width:160%}.row-gutter-15 .column-offset-24{margin-left:160%}.row-gutter-16{padding:12px 6px}.row-gutter-16 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-16 .column-span-1{width:6.25%}.row-gutter-16 .column-offset-1{margin-left:6.25%}.row-gutter-16 .column-span-2{width:12.5%}.row-gutter-16 .column-offset-2{margin-left:12.5%}.row-gutter-16 .column-span-3{width:18.75%}.row-gutter-16 .column-offset-3{margin-left:18.75%}.row-gutter-16 .column-span-4{width:25%}.row-gutter-16 .column-offset-4{margin-left:25%}.row-gutter-16 .column-span-5{width:31.25%}.row-gutter-16 .column-offset-5{margin-left:31.25%}.row-gutter-16 .column-span-6{width:37.5%}.row-gutter-16 .column-offset-6{margin-left:37.5%}.row-gutter-16 .column-span-7{width:43.75%}.row-gutter-16 .column-offset-7{margin-left:43.75%}.row-gutter-16 .column-span-8{width:50%}.row-gutter-16 .column-offset-8{margin-left:50%}.row-gutter-16 .column-span-9{width:56.25%}.row-gutter-16 .column-offset-9{margin-left:56.25%}.row-gutter-16 .column-span-10{width:62.5%}.row-gutter-16 .column-offset-10{margin-left:62.5%}.row-gutter-16 .column-span-11{width:68.75%}.row-gutter-16 .column-offset-11{margin-left:68.75%}.row-gutter-16 .column-span-12{width:75%}.row-gutter-16 .column-offset-12{margin-left:75%}.row-gutter-16 .column-span-13{width:81.25%}.row-gutter-16 .column-offset-13{margin-left:81.25%}.row-gutter-16 .column-span-14{width:87.5%}.row-gutter-16 .column-offset-14{margin-left:87.5%}.row-gutter-16 .column-span-15{width:93.75%}.row-gutter-16 .column-offset-15{margin-left:93.75%}.row-gutter-16 .column-span-16{width:100%}.row-gutter-16 .column-offset-16{margin-left:100%}.row-gutter-16 .column-span-17{width:106.25%}.row-gutter-16 .column-offset-17{margin-left:106.25%}.row-gutter-16 .column-span-18{width:112.5%}.row-gutter-16 .column-offset-18{margin-left:112.5%}.row-gutter-16 .column-span-19{width:118.75%}.row-gutter-16 .column-offset-19{margin-left:118.75%}.row-gutter-16 .column-span-20{width:125%}.row-gutter-16 .column-offset-20{margin-left:125%}.row-gutter-16 .column-span-21{width:131.25%}.row-gutter-16 .column-offset-21{margin-left:131.25%}.row-gutter-16 .column-span-22{width:137.5%}.row-gutter-16 .column-offset-22{margin-left:137.5%}.row-gutter-16 .column-span-23{width:143.75%}.row-gutter-16 .column-offset-23{margin-left:143.75%}.row-gutter-16 .column-span-24{width:150%}.row-gutter-16 .column-offset-24{margin-left:150%}.row-gutter-17{padding:12px 6px}.row-gutter-17 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-17 .column-span-1{width:5.8823529412%}.row-gutter-17 .column-offset-1{margin-left:5.8823529412%}.row-gutter-17 .column-span-2{width:11.7647058824%}.row-gutter-17 .column-offset-2{margin-left:11.7647058824%}.row-gutter-17 .column-span-3{width:17.6470588235%}.row-gutter-17 .column-offset-3{margin-left:17.6470588235%}.row-gutter-17 .column-span-4{width:23.5294117647%}.row-gutter-17 .column-offset-4{margin-left:23.5294117647%}.row-gutter-17 .column-span-5{width:29.4117647059%}.row-gutter-17 .column-offset-5{margin-left:29.4117647059%}.row-gutter-17 .column-span-6{width:35.2941176471%}.row-gutter-17 .column-offset-6{margin-left:35.2941176471%}.row-gutter-17 .column-span-7{width:41.1764705882%}.row-gutter-17 .column-offset-7{margin-left:41.1764705882%}.row-gutter-17 .column-span-8{width:47.0588235294%}.row-gutter-17 .column-offset-8{margin-left:47.0588235294%}.row-gutter-17 .column-span-9{width:52.9411764706%}.row-gutter-17 .column-offset-9{margin-left:52.9411764706%}.row-gutter-17 .column-span-10{width:58.8235294118%}.row-gutter-17 .column-offset-10{margin-left:58.8235294118%}.row-gutter-17 .column-span-11{width:64.7058823529%}.row-gutter-17 .column-offset-11{margin-left:64.7058823529%}.row-gutter-17 .column-span-12{width:70.5882352941%}.row-gutter-17 .column-offset-12{margin-left:70.5882352941%}.row-gutter-17 .column-span-13{width:76.4705882353%}.row-gutter-17 .column-offset-13{margin-left:76.4705882353%}.row-gutter-17 .column-span-14{width:82.3529411765%}.row-gutter-17 .column-offset-14{margin-left:82.3529411765%}.row-gutter-17 .column-span-15{width:88.2352941176%}.row-gutter-17 .column-offset-15{margin-left:88.2352941176%}.row-gutter-17 .column-span-16{width:94.1176470588%}.row-gutter-17 .column-offset-16{margin-left:94.1176470588%}.row-gutter-17 .column-span-17{width:100%}.row-gutter-17 .column-offset-17{margin-left:100%}.row-gutter-17 .column-span-18{width:105.8823529412%}.row-gutter-17 .column-offset-18{margin-left:105.8823529412%}.row-gutter-17 .column-span-19{width:111.7647058824%}.row-gutter-17 .column-offset-19{margin-left:111.7647058824%}.row-gutter-17 .column-span-20{width:117.6470588235%}.row-gutter-17 .column-offset-20{margin-left:117.6470588235%}.row-gutter-17 .column-span-21{width:123.5294117647%}.row-gutter-17 .column-offset-21{margin-left:123.5294117647%}.row-gutter-17 .column-span-22{width:129.4117647059%}.row-gutter-17 .column-offset-22{margin-left:129.4117647059%}.row-gutter-17 .column-span-23{width:135.2941176471%}.row-gutter-17 .column-offset-23{margin-left:135.2941176471%}.row-gutter-17 .column-span-24{width:141.1764705882%}.row-gutter-17 .column-offset-24{margin-left:141.1764705882%}.row-gutter-18{padding:12px 6px}.row-gutter-18 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-18 .column-span-1{width:5.5555555556%}.row-gutter-18 .column-offset-1{margin-left:5.5555555556%}.row-gutter-18 .column-span-2{width:11.1111111111%}.row-gutter-18 .column-offset-2{margin-left:11.1111111111%}.row-gutter-18 .column-span-3{width:16.6666666667%}.row-gutter-18 .column-offset-3{margin-left:16.6666666667%}.row-gutter-18 .column-span-4{width:22.2222222222%}.row-gutter-18 .column-offset-4{margin-left:22.2222222222%}.row-gutter-18 .column-span-5{width:27.7777777778%}.row-gutter-18 .column-offset-5{margin-left:27.7777777778%}.row-gutter-18 .column-span-6{width:33.3333333333%}.row-gutter-18 .column-offset-6{margin-left:33.3333333333%}.row-gutter-18 .column-span-7{width:38.8888888889%}.row-gutter-18 .column-offset-7{margin-left:38.8888888889%}.row-gutter-18 .column-span-8{width:44.4444444444%}.row-gutter-18 .column-offset-8{margin-left:44.4444444444%}.row-gutter-18 .column-span-9{width:50%}.row-gutter-18 .column-offset-9{margin-left:50%}.row-gutter-18 .column-span-10{width:55.5555555556%}.row-gutter-18 .column-offset-10{margin-left:55.5555555556%}.row-gutter-18 .column-span-11{width:61.1111111111%}.row-gutter-18 .column-offset-11{margin-left:61.1111111111%}.row-gutter-18 .column-span-12{width:66.6666666667%}.row-gutter-18 .column-offset-12{margin-left:66.6666666667%}.row-gutter-18 .column-span-13{width:72.2222222222%}.row-gutter-18 .column-offset-13{margin-left:72.2222222222%}.row-gutter-18 .column-span-14{width:77.7777777778%}.row-gutter-18 .column-offset-14{margin-left:77.7777777778%}.row-gutter-18 .column-span-15{width:83.3333333333%}.row-gutter-18 .column-offset-15{margin-left:83.3333333333%}.row-gutter-18 .column-span-16{width:88.8888888889%}.row-gutter-18 .column-offset-16{margin-left:88.8888888889%}.row-gutter-18 .column-span-17{width:94.4444444444%}.row-gutter-18 .column-offset-17{margin-left:94.4444444444%}.row-gutter-18 .column-span-18{width:100%}.row-gutter-18 .column-offset-18{margin-left:100%}.row-gutter-18 .column-span-19{width:105.5555555556%}.row-gutter-18 .column-offset-19{margin-left:105.5555555556%}.row-gutter-18 .column-span-20{width:111.1111111111%}.row-gutter-18 .column-offset-20{margin-left:111.1111111111%}.row-gutter-18 .column-span-21{width:116.6666666667%}.row-gutter-18 .column-offset-21{margin-left:116.6666666667%}.row-gutter-18 .column-span-22{width:122.2222222222%}.row-gutter-18 .column-offset-22{margin-left:122.2222222222%}.row-gutter-18 .column-span-23{width:127.7777777778%}.row-gutter-18 .column-offset-23{margin-left:127.7777777778%}.row-gutter-18 .column-span-24{width:133.3333333333%}.row-gutter-18 .column-offset-24{margin-left:133.3333333333%}.row-gutter-19{padding:12px 6px}.row-gutter-19 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-19 .column-span-1{width:5.2631578947%}.row-gutter-19 .column-offset-1{margin-left:5.2631578947%}.row-gutter-19 .column-span-2{width:10.5263157895%}.row-gutter-19 .column-offset-2{margin-left:10.5263157895%}.row-gutter-19 .column-span-3{width:15.7894736842%}.row-gutter-19 .column-offset-3{margin-left:15.7894736842%}.row-gutter-19 .column-span-4{width:21.0526315789%}.row-gutter-19 .column-offset-4{margin-left:21.0526315789%}.row-gutter-19 .column-span-5{width:26.3157894737%}.row-gutter-19 .column-offset-5{margin-left:26.3157894737%}.row-gutter-19 .column-span-6{width:31.5789473684%}.row-gutter-19 .column-offset-6{margin-left:31.5789473684%}.row-gutter-19 .column-span-7{width:36.8421052632%}.row-gutter-19 .column-offset-7{margin-left:36.8421052632%}.row-gutter-19 .column-span-8{width:42.1052631579%}.row-gutter-19 .column-offset-8{margin-left:42.1052631579%}.row-gutter-19 .column-span-9{width:47.3684210526%}.row-gutter-19 .column-offset-9{margin-left:47.3684210526%}.row-gutter-19 .column-span-10{width:52.6315789474%}.row-gutter-19 .column-offset-10{margin-left:52.6315789474%}.row-gutter-19 .column-span-11{width:57.8947368421%}.row-gutter-19 .column-offset-11{margin-left:57.8947368421%}.row-gutter-19 .column-span-12{width:63.1578947368%}.row-gutter-19 .column-offset-12{margin-left:63.1578947368%}.row-gutter-19 .column-span-13{width:68.4210526316%}.row-gutter-19 .column-offset-13{margin-left:68.4210526316%}.row-gutter-19 .column-span-14{width:73.6842105263%}.row-gutter-19 .column-offset-14{margin-left:73.6842105263%}.row-gutter-19 .column-span-15{width:78.9473684211%}.row-gutter-19 .column-offset-15{margin-left:78.9473684211%}.row-gutter-19 .column-span-16{width:84.2105263158%}.row-gutter-19 .column-offset-16{margin-left:84.2105263158%}.row-gutter-19 .column-span-17{width:89.4736842105%}.row-gutter-19 .column-offset-17{margin-left:89.4736842105%}.row-gutter-19 .column-span-18{width:94.7368421053%}.row-gutter-19 .column-offset-18{margin-left:94.7368421053%}.row-gutter-19 .column-span-19{width:100%}.row-gutter-19 .column-offset-19{margin-left:100%}.row-gutter-19 .column-span-20{width:105.2631578947%}.row-gutter-19 .column-offset-20{margin-left:105.2631578947%}.row-gutter-19 .column-span-21{width:110.5263157895%}.row-gutter-19 .column-offset-21{margin-left:110.5263157895%}.row-gutter-19 .column-span-22{width:115.7894736842%}.row-gutter-19 .column-offset-22{margin-left:115.7894736842%}.row-gutter-19 .column-span-23{width:121.0526315789%}.row-gutter-19 .column-offset-23{margin-left:121.0526315789%}.row-gutter-19 .column-span-24{width:126.3157894737%}.row-gutter-19 .column-offset-24{margin-left:126.3157894737%}.row-gutter-20{padding:12px 6px}.row-gutter-20 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-20 .column-span-1{width:5%}.row-gutter-20 .column-offset-1{margin-left:5%}.row-gutter-20 .column-span-2{width:10%}.row-gutter-20 .column-offset-2{margin-left:10%}.row-gutter-20 .column-span-3{width:15%}.row-gutter-20 .column-offset-3{margin-left:15%}.row-gutter-20 .column-span-4{width:20%}.row-gutter-20 .column-offset-4{margin-left:20%}.row-gutter-20 .column-span-5{width:25%}.row-gutter-20 .column-offset-5{margin-left:25%}.row-gutter-20 .column-span-6{width:30%}.row-gutter-20 .column-offset-6{margin-left:30%}.row-gutter-20 .column-span-7{width:35%}.row-gutter-20 .column-offset-7{margin-left:35%}.row-gutter-20 .column-span-8{width:40%}.row-gutter-20 .column-offset-8{margin-left:40%}.row-gutter-20 .column-span-9{width:45%}.row-gutter-20 .column-offset-9{margin-left:45%}.row-gutter-20 .column-span-10{width:50%}.row-gutter-20 .column-offset-10{margin-left:50%}.row-gutter-20 .column-span-11{width:55%}.row-gutter-20 .column-offset-11{margin-left:55%}.row-gutter-20 .column-span-12{width:60%}.row-gutter-20 .column-offset-12{margin-left:60%}.row-gutter-20 .column-span-13{width:65%}.row-gutter-20 .column-offset-13{margin-left:65%}.row-gutter-20 .column-span-14{width:70%}.row-gutter-20 .column-offset-14{margin-left:70%}.row-gutter-20 .column-span-15{width:75%}.row-gutter-20 .column-offset-15{margin-left:75%}.row-gutter-20 .column-span-16{width:80%}.row-gutter-20 .column-offset-16{margin-left:80%}.row-gutter-20 .column-span-17{width:85%}.row-gutter-20 .column-offset-17{margin-left:85%}.row-gutter-20 .column-span-18{width:90%}.row-gutter-20 .column-offset-18{margin-left:90%}.row-gutter-20 .column-span-19{width:95%}.row-gutter-20 .column-offset-19{margin-left:95%}.row-gutter-20 .column-span-20{width:100%}.row-gutter-20 .column-offset-20{margin-left:100%}.row-gutter-20 .column-span-21{width:105%}.row-gutter-20 .column-offset-21{margin-left:105%}.row-gutter-20 .column-span-22{width:110%}.row-gutter-20 .column-offset-22{margin-left:110%}.row-gutter-20 .column-span-23{width:115%}.row-gutter-20 .column-offset-23{margin-left:115%}.row-gutter-20 .column-span-24{width:120%}.row-gutter-20 .column-offset-24{margin-left:120%}.row-gutter-21{padding:12px 6px}.row-gutter-21 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-21 .column-span-1{width:4.7619047619%}.row-gutter-21 .column-offset-1{margin-left:4.7619047619%}.row-gutter-21 .column-span-2{width:9.5238095238%}.row-gutter-21 .column-offset-2{margin-left:9.5238095238%}.row-gutter-21 .column-span-3{width:14.2857142857%}.row-gutter-21 .column-offset-3{margin-left:14.2857142857%}.row-gutter-21 .column-span-4{width:19.0476190476%}.row-gutter-21 .column-offset-4{margin-left:19.0476190476%}.row-gutter-21 .column-span-5{width:23.8095238095%}.row-gutter-21 .column-offset-5{margin-left:23.8095238095%}.row-gutter-21 .column-span-6{width:28.5714285714%}.row-gutter-21 .column-offset-6{margin-left:28.5714285714%}.row-gutter-21 .column-span-7{width:33.3333333333%}.row-gutter-21 .column-offset-7{margin-left:33.3333333333%}.row-gutter-21 .column-span-8{width:38.0952380952%}.row-gutter-21 .column-offset-8{margin-left:38.0952380952%}.row-gutter-21 .column-span-9{width:42.8571428571%}.row-gutter-21 .column-offset-9{margin-left:42.8571428571%}.row-gutter-21 .column-span-10{width:47.619047619%}.row-gutter-21 .column-offset-10{margin-left:47.619047619%}.row-gutter-21 .column-span-11{width:52.380952381%}.row-gutter-21 .column-offset-11{margin-left:52.380952381%}.row-gutter-21 .column-span-12{width:57.1428571429%}.row-gutter-21 .column-offset-12{margin-left:57.1428571429%}.row-gutter-21 .column-span-13{width:61.9047619048%}.row-gutter-21 .column-offset-13{margin-left:61.9047619048%}.row-gutter-21 .column-span-14{width:66.6666666667%}.row-gutter-21 .column-offset-14{margin-left:66.6666666667%}.row-gutter-21 .column-span-15{width:71.4285714286%}.row-gutter-21 .column-offset-15{margin-left:71.4285714286%}.row-gutter-21 .column-span-16{width:76.1904761905%}.row-gutter-21 .column-offset-16{margin-left:76.1904761905%}.row-gutter-21 .column-span-17{width:80.9523809524%}.row-gutter-21 .column-offset-17{margin-left:80.9523809524%}.row-gutter-21 .column-span-18{width:85.7142857143%}.row-gutter-21 .column-offset-18{margin-left:85.7142857143%}.row-gutter-21 .column-span-19{width:90.4761904762%}.row-gutter-21 .column-offset-19{margin-left:90.4761904762%}.row-gutter-21 .column-span-20{width:95.2380952381%}.row-gutter-21 .column-offset-20{margin-left:95.2380952381%}.row-gutter-21 .column-span-21{width:100%}.row-gutter-21 .column-offset-21{margin-left:100%}.row-gutter-21 .column-span-22{width:104.7619047619%}.row-gutter-21 .column-offset-22{margin-left:104.7619047619%}.row-gutter-21 .column-span-23{width:109.5238095238%}.row-gutter-21 .column-offset-23{margin-left:109.5238095238%}.row-gutter-21 .column-span-24{width:114.2857142857%}.row-gutter-21 .column-offset-24{margin-left:114.2857142857%}.row-gutter-22{padding:12px 6px}.row-gutter-22 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-22 .column-span-1{width:4.5454545455%}.row-gutter-22 .column-offset-1{margin-left:4.5454545455%}.row-gutter-22 .column-span-2{width:9.0909090909%}.row-gutter-22 .column-offset-2{margin-left:9.0909090909%}.row-gutter-22 .column-span-3{width:13.6363636364%}.row-gutter-22 .column-offset-3{margin-left:13.6363636364%}.row-gutter-22 .column-span-4{width:18.1818181818%}.row-gutter-22 .column-offset-4{margin-left:18.1818181818%}.row-gutter-22 .column-span-5{width:22.7272727273%}.row-gutter-22 .column-offset-5{margin-left:22.7272727273%}.row-gutter-22 .column-span-6{width:27.2727272727%}.row-gutter-22 .column-offset-6{margin-left:27.2727272727%}.row-gutter-22 .column-span-7{width:31.8181818182%}.row-gutter-22 .column-offset-7{margin-left:31.8181818182%}.row-gutter-22 .column-span-8{width:36.3636363636%}.row-gutter-22 .column-offset-8{margin-left:36.3636363636%}.row-gutter-22 .column-span-9{width:40.9090909091%}.row-gutter-22 .column-offset-9{margin-left:40.9090909091%}.row-gutter-22 .column-span-10{width:45.4545454545%}.row-gutter-22 .column-offset-10{margin-left:45.4545454545%}.row-gutter-22 .column-span-11{width:50%}.row-gutter-22 .column-offset-11{margin-left:50%}.row-gutter-22 .column-span-12{width:54.5454545455%}.row-gutter-22 .column-offset-12{margin-left:54.5454545455%}.row-gutter-22 .column-span-13{width:59.0909090909%}.row-gutter-22 .column-offset-13{margin-left:59.0909090909%}.row-gutter-22 .column-span-14{width:63.6363636364%}.row-gutter-22 .column-offset-14{margin-left:63.6363636364%}.row-gutter-22 .column-span-15{width:68.1818181818%}.row-gutter-22 .column-offset-15{margin-left:68.1818181818%}.row-gutter-22 .column-span-16{width:72.7272727273%}.row-gutter-22 .column-offset-16{margin-left:72.7272727273%}.row-gutter-22 .column-span-17{width:77.2727272727%}.row-gutter-22 .column-offset-17{margin-left:77.2727272727%}.row-gutter-22 .column-span-18{width:81.8181818182%}.row-gutter-22 .column-offset-18{margin-left:81.8181818182%}.row-gutter-22 .column-span-19{width:86.3636363636%}.row-gutter-22 .column-offset-19{margin-left:86.3636363636%}.row-gutter-22 .column-span-20{width:90.9090909091%}.row-gutter-22 .column-offset-20{margin-left:90.9090909091%}.row-gutter-22 .column-span-21{width:95.4545454545%}.row-gutter-22 .column-offset-21{margin-left:95.4545454545%}.row-gutter-22 .column-span-22{width:100%}.row-gutter-22 .column-offset-22{margin-left:100%}.row-gutter-22 .column-span-23{width:104.5454545455%}.row-gutter-22 .column-offset-23{margin-left:104.5454545455%}.row-gutter-22 .column-span-24{width:109.0909090909%}.row-gutter-22 .column-offset-24{margin-left:109.0909090909%}.row-gutter-23{padding:12px 6px}.row-gutter-23 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-23 .column-span-1{width:4.347826087%}.row-gutter-23 .column-offset-1{margin-left:4.347826087%}.row-gutter-23 .column-span-2{width:8.6956521739%}.row-gutter-23 .column-offset-2{margin-left:8.6956521739%}.row-gutter-23 .column-span-3{width:13.0434782609%}.row-gutter-23 .column-offset-3{margin-left:13.0434782609%}.row-gutter-23 .column-span-4{width:17.3913043478%}.row-gutter-23 .column-offset-4{margin-left:17.3913043478%}.row-gutter-23 .column-span-5{width:21.7391304348%}.row-gutter-23 .column-offset-5{margin-left:21.7391304348%}.row-gutter-23 .column-span-6{width:26.0869565217%}.row-gutter-23 .column-offset-6{margin-left:26.0869565217%}.row-gutter-23 .column-span-7{width:30.4347826087%}.row-gutter-23 .column-offset-7{margin-left:30.4347826087%}.row-gutter-23 .column-span-8{width:34.7826086957%}.row-gutter-23 .column-offset-8{margin-left:34.7826086957%}.row-gutter-23 .column-span-9{width:39.1304347826%}.row-gutter-23 .column-offset-9{margin-left:39.1304347826%}.row-gutter-23 .column-span-10{width:43.4782608696%}.row-gutter-23 .column-offset-10{margin-left:43.4782608696%}.row-gutter-23 .column-span-11{width:47.8260869565%}.row-gutter-23 .column-offset-11{margin-left:47.8260869565%}.row-gutter-23 .column-span-12{width:52.1739130435%}.row-gutter-23 .column-offset-12{margin-left:52.1739130435%}.row-gutter-23 .column-span-13{width:56.5217391304%}.row-gutter-23 .column-offset-13{margin-left:56.5217391304%}.row-gutter-23 .column-span-14{width:60.8695652174%}.row-gutter-23 .column-offset-14{margin-left:60.8695652174%}.row-gutter-23 .column-span-15{width:65.2173913043%}.row-gutter-23 .column-offset-15{margin-left:65.2173913043%}.row-gutter-23 .column-span-16{width:69.5652173913%}.row-gutter-23 .column-offset-16{margin-left:69.5652173913%}.row-gutter-23 .column-span-17{width:73.9130434783%}.row-gutter-23 .column-offset-17{margin-left:73.9130434783%}.row-gutter-23 .column-span-18{width:78.2608695652%}.row-gutter-23 .column-offset-18{margin-left:78.2608695652%}.row-gutter-23 .column-span-19{width:82.6086956522%}.row-gutter-23 .column-offset-19{margin-left:82.6086956522%}.row-gutter-23 .column-span-20{width:86.9565217391%}.row-gutter-23 .column-offset-20{margin-left:86.9565217391%}.row-gutter-23 .column-span-21{width:91.3043478261%}.row-gutter-23 .column-offset-21{margin-left:91.3043478261%}.row-gutter-23 .column-span-22{width:95.652173913%}.row-gutter-23 .column-offset-22{margin-left:95.652173913%}.row-gutter-23 .column-span-23{width:100%}.row-gutter-23 .column-offset-23{margin-left:100%}.row-gutter-23 .column-span-24{width:104.347826087%}.row-gutter-23 .column-offset-24{margin-left:104.347826087%}.row-gutter-24{padding:12px 6px}.row-gutter-24 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-24 .column-span-1{width:4.1666666667%}.row-gutter-24 .column-offset-1{margin-left:4.1666666667%}.row-gutter-24 .column-span-2{width:8.3333333333%}.row-gutter-24 .column-offset-2{margin-left:8.3333333333%}.row-gutter-24 .column-span-3{width:12.5%}.row-gutter-24 .column-offset-3{margin-left:12.5%}.row-gutter-24 .column-span-4{width:16.6666666667%}.row-gutter-24 .column-offset-4{margin-left:16.6666666667%}.row-gutter-24 .column-span-5{width:20.8333333333%}.row-gutter-24 .column-offset-5{margin-left:20.8333333333%}.row-gutter-24 .column-span-6{width:25%}.row-gutter-24 .column-offset-6{margin-left:25%}.row-gutter-24 .column-span-7{width:29.1666666667%}.row-gutter-24 .column-offset-7{margin-left:29.1666666667%}.row-gutter-24 .column-span-8{width:33.3333333333%}.row-gutter-24 .column-offset-8{margin-left:33.3333333333%}.row-gutter-24 .column-span-9{width:37.5%}.row-gutter-24 .column-offset-9{margin-left:37.5%}.row-gutter-24 .column-span-10{width:41.6666666667%}.row-gutter-24 .column-offset-10{margin-left:41.6666666667%}.row-gutter-24 .column-span-11{width:45.8333333333%}.row-gutter-24 .column-offset-11{margin-left:45.8333333333%}.row-gutter-24 .column-span-12{width:50%}.row-gutter-24 .column-offset-12{margin-left:50%}.row-gutter-24 .column-span-13{width:54.1666666667%}.row-gutter-24 .column-offset-13{margin-left:54.1666666667%}.row-gutter-24 .column-span-14{width:58.3333333333%}.row-gutter-24 .column-offset-14{margin-left:58.3333333333%}.row-gutter-24 .column-span-15{width:62.5%}.row-gutter-24 .column-offset-15{margin-left:62.5%}.row-gutter-24 .column-span-16{width:66.6666666667%}.row-gutter-24 .column-offset-16{margin-left:66.6666666667%}.row-gutter-24 .column-span-17{width:70.8333333333%}.row-gutter-24 .column-offset-17{margin-left:70.8333333333%}.row-gutter-24 .column-span-18{width:75%}.row-gutter-24 .column-offset-18{margin-left:75%}.row-gutter-24 .column-span-19{width:79.1666666667%}.row-gutter-24 .column-offset-19{margin-left:79.1666666667%}.row-gutter-24 .column-span-20{width:83.3333333333%}.row-gutter-24 .column-offset-20{margin-left:83.3333333333%}.row-gutter-24 .column-span-21{width:87.5%}.row-gutter-24 .column-offset-21{margin-left:87.5%}.row-gutter-24 .column-span-22{width:91.6666666667%}.row-gutter-24 .column-offset-22{margin-left:91.6666666667%}.row-gutter-24 .column-span-23{width:95.8333333333%}.row-gutter-24 .column-offset-23{margin-left:95.8333333333%}.row-gutter-24 .column-span-24{width:100%}.row-gutter-24 .column-offset-24{margin-left:100%}.row-align-top{align-items:flex-start}.row-align-middle{align-items:center}.row-align-bottom{align-items:flex-end}.row-justify-start{justify-content:flex-start}.row-justify-end{justify-content:flex-end}.row-justify-center{justify-content:center}.row-justify-space-around{justify-content:space-around}.row-justify-space-between{justify-content:space-between}.button-select{display:flex;flex-direction:row}.button-select .button-select-options{height:30px;padding:0 15px;color:#54759a;font-size:12px;line-height:30px;background:#fff;border:1px solid #e4eaef;border-right:none;transition:all .3s ease;cursor:pointer;outline:0;display:block}.button-select .button-select-options:first-child{border-radius:3px 0 0 3px}.button-select .button-select-options:last-child{border-radius:0 3px 3px 0;border-right:1px solid #e4eaef}.button-select .button-select-options.actived{background:#57befc;color:#fff;border-color:#57befc;box-shadow:0 2px 5px rgba(87,190,252,.5)}.button-select .button-select-options.actived:active{box-shadow:none}.tags-container{display:flex;align-items:flex-start;overflow-y:hidden}.tags{flex:1;list-style:none;flex-wrap:wrap;box-sizing:content-box}.tags,.tags li{display:flex;align-items:center}.tags li{position:relative;justify-content:center;border:1px solid #2c8af8;color:#54759a;height:22px;border-radius:11px;padding:0 6px;margin:3px 4px;font-size:10px;cursor:default}.tags li.can-click{cursor:pointer}.tags li.error{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.tags li.tags-selected.error{background:linear-gradient(135deg,#2c8af8,#f56c6c);border:none;height:24px;padding:0 7px}.tags .tags-selected{background-color:#2c8af8;color:#fff}.tags-expand{height:30px;line-height:30px;padding:0 20px;user-select:none;cursor:pointer}.input{display:inline-block;height:30px;width:100%;padding:0 10px;font-size:14px;color:#54759a;border-radius:3px;border:1px solid #e4eaef;transition:all .3s;transition-property:border-color,color,box-shadow}.input:focus{outline:0;border-color:#57befc;color:#2c8af8;box-shadow:0 2px 5px rgba(87,190,252,.5)}.input-align-left{text-align:left}.input-align-center{text-align:center}.input-align-right{text-align:right}.input-inside:focus{box-shadow:none}.select{cursor:pointer;font-size:14px;line-height:30px;color:#54759a;display:flex;overflow:hidden}.select>i{margin-left:5px;color:#54759a}.select-list{position:absolute;max-width:170px;border-radius:4px;overflow:hidden;box-shadow:0 2px 5px rgba(183,197,214,.5);opacity:.8;pointer-events:none;transform:scaleY(0);transform-origin:top;transition:all .2s linear}.select-list .list{max-height:300px;overflow:auto;background:#fff;padding:5px 0;transform:scaleY(2);transform-origin:top;transition:all .2s linear}.select-list .list>.option{color:#54759a;padding:10px 15px;font-size:14px;list-style:none;cursor:pointer}.select-list .list>.option:hover,.select-list .list>.selected{background:rgba(228,234,239,.5)}.select-list-show{opacity:1;pointer-events:visible}.select-list-show,.select-list-show .list{transform:scaleY(1)}.modal-mask{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.15);opacity:0;pointer-events:none;transition:all .5s ease;display:flex;justify-content:center;align-items:center;z-index:11}.modal-mask .modal{margin-top:-50px;padding:20px 30px;background:#fff;box-shadow:0 2px 16px rgba(84,117,154,.2);border-radius:4px;display:flex;flex-direction:column;transform:scale(0);transition:all .3s cubic-bezier(.32,.26,.71,1.29)}.modal-mask .modal .modal-title{margin:5px 0;width:100%;display:flex;align-items:center;justify-content:space-between;font-weight:700;font-size:18px;color:#2c8af8;text-shadow:0 2px 6px rgba(44,138,248,.4)}.modal-mask .modal .modal-body{margin:10px 0;font-size:14px;color:#54759a}.modal-mask .modal .footer{width:100%;margin:5px 0;display:flex;align-items:center;justify-content:flex-end}.modal-mask .modal .footer .button{margin-left:10px}.modal-mask .modal-small{width:400px}.modal-mask .modal-big{width:600px}.modal-show{opacity:1;pointer-events:visible}.modal-show .modal{transform:scale(1)}@media(max-width:768px){.modal-mask .modal{margin-top:0;padding:18px 20px}.modal-mask .modal-small{width:280px}.modal-mask .modal-big{width:480px}}.alert{padding:15px;border-radius:4px;box-shadow:0 2px 8px rgba(44,138,248,.3);font-size:13px;line-height:1.6;text-align:justify}.alert,.alert .alert-icon{background:#fff;display:flex}.alert .alert-icon{margin-right:10px;width:20px;height:20px;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center}.alert .alert-icon>i{transform:scale(.5);font-weight:700}.alert .alert-message{width:100%;color:#fff}.alert-box-success{background:linear-gradient(135deg,#5dae34,#67c23a);box-shadow:0 2px 8px rgba(93,174,52,.3)}.alert-box-success .alert-icon>i{color:#67c23a}.alert-box-info{background:linear-gradient(135deg,#3eb4fc,#57befc);box-shadow:0 2px 8px rgba(62,180,252,.3)}.alert-box-info .alert-icon>i{color:#57befc}.alert-box-warning{background:linear-gradient(135deg,#e39725,#e6a23c);box-shadow:0 2px 8px rgba(227,151,37,.3)}.alert-box-warning .alert-icon>i{color:#e6a23c}.alert-box-error{background:linear-gradient(135deg,#f35454,#f56c6c);box-shadow:0 2px 8px rgba(243,84,84,.3)}.alert-box-error .alert-icon>i{color:#f56c6c}.alert-note-success{background:rgba(103,194,58,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #67c23a;box-shadow:0 2px 8px rgba(93,174,52,.3)}.alert-note-success .alert-icon{background:#67c23a}.alert-note-success .alert-icon>i{color:#fff}.alert-note-success .alert-message{color:#3d7323}.alert-note-info{background:rgba(87,190,252,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #57befc;box-shadow:0 2px 8px rgba(62,180,252,.3)}.alert-note-info .alert-icon{background:#57befc}.alert-note-info .alert-icon>i{color:#fff}.alert-note-info .alert-message{color:#0493e9}.alert-note-warning{background:rgba(230,162,60,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #e6a23c;box-shadow:0 2px 8px rgba(227,151,37,.3)}.alert-note-warning .alert-icon{background:#e6a23c}.alert-note-warning .alert-icon>i{color:#fff}.alert-note-warning .alert-message{color:#a76d15}.alert-note-error{background:rgba(245,108,108,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #f56c6c;box-shadow:0 2px 8px rgba(243,84,84,.3)}.alert-note-error .alert-icon{background:#f56c6c}.alert-note-error .alert-icon>i{color:#fff}.alert-note-error .alert-message{color:#eb1010}.button{outline:0;padding:0 15px;height:32px;line-height:32px;border-radius:16px;font-size:14px;cursor:pointer;transition:all .15s ease}.button-primary{color:#fff;border:none;background:linear-gradient(135deg,#57befc,#2c8af8);box-shadow:0 2px 8px rgba(44,138,248,.5)}.button-primary:hover{border:none}.button-primary:active{box-shadow:0 0 2px rgba(44,138,248,.5)}.button-normal{color:#909399;background:#fff;border:1px solid rgba(0,0,0,.1)}.button-normal:hover{border-color:#b7c5d6;color:#54759a}.button-normal:active{background:#fafafa;color:#54759a}.button-danger{color:#fff;border:none;background:linear-gradient(135deg,#f56c6c,#f23c3c);box-shadow:0 2px 8px rgba(242,60,60,.5)}.button-danger:hover{border:none}.button-danger:active{box-shadow:0 0 2px rgba(242,60,60,.5)}.button-success{color:#fff;border:none;background:linear-gradient(135deg,#67c23a,#5dae34);box-shadow:0 2px 8px rgba(93,174,52,.5)}.button-success:hover{border:none}.button-success:active{box-shadow:0 0 2px rgba(93,174,52,.5)}.button-warning{color:#fff;border:none;background:linear-gradient(135deg,#e6a23c,#e39725);box-shadow:0 2px 8px rgba(227,151,37,.5)}.button-warning:hover{border:none}.button-warning:active{box-shadow:0 0 2px rgba(227,151,37,.5)}.message{position:fixed;top:20px;right:20px;border-radius:4px;opacity:0;background:#fff;display:flex;box-shadow:0 0 20px rgba(44,138,248,.2);transition:all .2s ease;transform:translateX(100%)}.message .message-icon{width:36px;flex:1;border-radius:4px 0 0 4px;display:flex;justify-content:center;align-items:center}.message .message-icon>i{color:#fff}.message .message-content{padding:10px 15px;font-size:13px;color:#54759a}.message-info .message-icon{background:linear-gradient(135deg,#57befc,#2c8af8)}.message-success .message-icon{background:linear-gradient(135deg,#67c23a,#5dae34)}.message-warning .message-icon{background:linear-gradient(135deg,#e6a23c,#e39725)}.message-error .message-icon{background:linear-gradient(135deg,#f56c6c,#f23c3c)}.message-show{opacity:1;transition:all .2s ease;transform:translateX(0)}.checkbox{display:flex;position:relative;padding-left:26px;cursor:pointer;line-height:18px}.checkbox:before{content:"";display:inline-block;position:absolute;left:0;top:50%;width:18px;height:18px;border-radius:3px;transition:background-color .3s ease;transform:translateY(-9px);background-color:#fff;border:1px solid #e4eaef}.checkbox.checked:before{background-color:#57befc}.checkbox-icon{position:absolute;left:0;top:50%;color:#fff;line-height:18px;transform:translateY(-9px) scale(.6);text-shadow:none;font-weight:700}.tag{display:flex;align-items:center;justify-content:center;height:24px;font-size:12px;padding:0 12px;text-align:center;background-color:#fff;border:2px solid #2c8af8;color:#2c8af8;border-radius:12px}.spinner{position:relative;width:80px;height:80px;border-radius:100%;animation:spinner 5s linear infinite}.spinner-circle{position:absolute;width:100%;height:100%;transform-origin:48% 48%}.spinner-inner{width:100%;height:100%;border-radius:100%;border:5px solid rgba(44,138,248,.7);border-top:none;border-right:none;background-clip:padding-box;box-shadow:inset 0 0 10px rgba(44,138,248,.15)}@keyframes spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spinner-circle:nth-of-type(0){transform:rotate(0deg)}.spinner-circle:nth-of-type(0) .spinner-inner{animation:spinner 2s linear infinite}.spinner-circle:first-of-type{transform:rotate(70deg)}.spinner-circle:first-of-type .spinner-inner{animation:spinner 2s linear infinite}.spinner-circle:nth-of-type(2){transform:rotate(140deg)}.spinner-circle:nth-of-type(2) .spinner-inner{animation:spinner 2s linear infinite}.loading{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0;bottom:0;right:0;background-color:hsla(0,0%,100%,.9);box-shadow:inset 0 0 80px rgba(0,0,0,.1);z-index:1000}.proxy-item{position:relative;width:100%;height:110px;padding:10px;border-radius:4px;background:#fff;user-select:none;cursor:default;box-shadow:2px 5px 20px -3px rgba(44,138,248,.2);transition:all .3s ease}.proxy-item .proxy-type{padding:2px 5px;font-size:10px;color:#fff;border-radius:2px}.proxy-item .proxy-name{display:-webkit-box;margin-top:10px;color:#54759a;font-size:10px;overflow:hidden;word-break:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical}.proxy-item .proxy-delay{position:absolute;left:10px;bottom:13px;font-size:10px;color:rgba(84,117,154,.8)}.proxy-item .proxy-editor{position:absolute;right:10px;bottom:10px;cursor:pointer;color:rgba(84,117,154,.8);opacity:0;pointer-events:none;transition:all .3s ease}.proxy-item:hover{box-shadow:0 14px 20px -4px rgba(84,117,154,.4)}.proxy-item:hover .proxy-editor{opacity:1;pointer-events:visible}.proxy-error{opacity:.5}.proxy-error .proxy-type{background-color:#909399}@media(max-width:768px){.proxy-item{height:70px}.proxy-item .proxy-delay{left:unset;bottom:unset;top:0;right:20px;height:70px;line-height:70px}}.proxy-group{display:flex;align-items:flex-start;font-size:14px;color:#546b87}.proxy-group-part{display:flex;align-items:center;height:60px}.proxy-group-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 20px;width:120px;height:18px}.proxies-group-card{padding:0}.proxies-group-item{border-bottom:1px solid #d8dee2}.proxies-group-item:last-child{border-bottom:none}.proxy-group-tags-container{padding:15px 0}.proxy-group-tags{flex:1;margin-left:30px}@media(max-width:768px){.proxy-group{flex-direction:column}.proxy-group-name{width:140px}.proxy-group-part{width:100%;height:42px;margin-top:6px;justify-content:space-between}.proxy-group-type{margin-right:20px}.proxy-group-tags-container{padding:5px 0 10px}.proxy-group-tags{margin-left:20px}}.proxy-provider{position:relative;display:flex;flex-direction:column;font-size:16px;padding:20px;color:#546b87}.proxy-provider-header{justify-content:space-between}.proxy-provider-header,.proxy-provider-header-part{display:flex;align-items:center}.proxy-provider-name{margin-right:24px}.proxy-provider-proxies{list-style:none}.proxy-provider-item{box-shadow:0 0 24px 0 rgba(44,138,248,.2)}.proxy-provider-item:hover{box-shadow:0 0 24px 0 rgba(84,117,154,.4)}.proxy-provider-update{line-height:14px;font-size:14px}.proxy-provider-icon{margin-left:20px;cursor:pointer}.proxy-provider-icon.healthcheck{color:#f56c6c}@media(max-width:768px){.proxy-provider-header{flex-direction:column;align-items:flex-start}.proxy-provider-header-part{margin:6px 0}}.proxies-list{--item-width:calc(100%/(var(--columns) + 1));--gap:calc(var(--item-width)/var(--columns));display:flex;margin-right:calc(var(--gap)*-1);margin-top:20px;flex-wrap:wrap;align-content:flex-start;list-style:none}@media(min-width:2001px){.proxies-list{--columns:12}}@media(max-width:2000px){.proxies-list{--columns:10}}@media(max-width:1600px){.proxies-list{--columns:8}}@media(max-width:1340px){.proxies-list{--columns:7}}@media(max-width:960px){.proxies-list{--columns:6}}@media(max-width:860px){.proxies-list{--columns:5}}@media(max-width:760px){.proxies-list{--columns:3}}.proxies-list>li{display:inline-block;width:var(--item-width);margin-right:var(--gap);flex-shrink:0;margin-bottom:10px}.proxies-group-list{list-style:none}.proxies-group-card{margin:20px 0}.proxies-container .proxies-action-icon{margin-left:10px}.proxies-speed-test{line-height:32px;margin:0 2px 0 6px;color:#2c8af8;text-shadow:0 2px 6px rgba(44,138,248,.4);cursor:pointer}.proxies-providers-item{margin:20px 0}.proxies-providers-list{list-style:none}@media(max-width:768px){.proxies-group-card{margin:12px 0}.proxies-list{margin-right:0;padding-bottom:20px;flex-wrap:unset;flex-direction:column}.proxies-list>li{width:100%;margin-right:0;margin-bottom:10px}}.logs-card{display:flex;flex-direction:column;flex:1;margin-top:10px}.logs-panel{display:flex;flex-direction:column;flex-grow:1;flex-basis:0;list-style:none;padding:10px;border-radius:2px;background-color:#f3f6f9;font-size:12px;color:#73808f;overflow-y:auto;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.logs-panel li{line-height:20px;display:inline-block}.logs-panel-time{margin-right:10px;color:#adb7c3}.rule-provider{position:relative;display:flex;flex-direction:column;font-size:16px;padding:20px;color:#546b87}.rule-provider-header{justify-content:space-between}.rule-provider-header,.rule-provider-header-part{display:flex;align-items:center}.rule-provider-name{width:120px;margin-right:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rule-provider-behavior{width:80px;margin:0 20px 0 12px;background-color:#2c8af8;color:#fff}.rule-provider-spinner{transform:scale(.4)}.rule-provider-proxies{list-style:none}.rule-provider-item{box-shadow:0 0 24px 0 rgba(44,138,248,.2)}.rule-provider-item:hover{box-shadow:0 0 24px 0 rgba(84,117,154,.4)}.rule-provider-update{line-height:14px;font-size:14px}.rule-provider-icon{display:block;margin-left:20px;cursor:pointer}.rule-provider-icon.rule-provider-loading:before{color:#909399;cursor:not-allowed;animation:spinner 2s linear infinite}@media(max-width:768px){.rule-provider-header{flex-direction:column;align-items:flex-start}.rule-provider-header-part{margin:6px 0}}.rules-card{display:flex;flex-direction:column;flex:1;min-height:700px;margin-top:10px;padding:0}.rules-card:focus{outline:none}.rules-card .rules{flex:1 0 auto}.rule-item{line-height:30px;height:50px;overflow:hidden;list-style:none;user-select:none;border-bottom:1px solid rgba(228,234,239,.5)}.rule-item,.rule-item .rule-item-row{padding:5px 0}.rule-item .drag-handler{cursor:row-resize;margin:0 10px;display:flex;justify-content:center}.rule-item .drag-handler>i{font-weight:700;color:#b7c5d6}.rule-item .rule-type{font-size:14px;color:#54759a}.rule-item .rule-type>i{margin-left:5px;color:#54759a}.rule-item .payload{cursor:pointer}.rule-item .payload,.rule-item .rule-proxy{font-size:14px;color:#54759a}.rule-item .delete-btn{opacity:0;transition:all .3s ease}.rule-item .delete-btn span{font-size:14px;color:#f56c6c;cursor:pointer}.rule-item:last-child{border-bottom:none}.rule-item:hover .delete-btn{opacity:1}.rule-proxy-option{display:flex;align-items:center;overflow:hidden}.rule-proxy-option .label{margin-right:5px;height:20px;line-height:20px;padding:0 8px;font-size:10px;border-radius:10px;color:#fff;background:#b7c5d6}.rule-proxy-option .value{line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.settings-card{margin-top:10px;padding:20px 0}.settings-card .column{font-weight:700;align-items:center}.settings-card .value-column{justify-content:flex-end}.settings-card .label{font-size:14px;color:#54759a}.settings-card .external-controller{font-size:14px;color:#54759a;display:flex;justify-content:flex-end;font-weight:400;line-height:17px}.settings-card .external-controller .modify-btn{color:#2c8af8;cursor:pointer}.clash-version{position:relative;margin-top:10px;padding:20px 45px;display:flex}.clash-version .check-icon{width:24px;height:24px;border-radius:50%;background:linear-gradient(135deg,#57befc,#2c8af8);display:flex;justify-content:center;align-items:center}.clash-version .check-icon>i{transform:scale(.5);color:#fff;font-weight:700}.clash-version .version-info{margin-left:10px;font-size:14px;line-height:24px;color:#54759a}.clash-version .check-update-btn{position:absolute;right:45px;font-size:14px;line-height:24px;color:#b7c5d6;cursor:pointer;transition:all .15s ease}.clash-version .check-update-btn:hover{color:#54759a}@media(max-width:768px){.settings-card .row{flex-direction:column;padding-top:0;padding-bottom:0}.settings-card .row>.column{width:100%;margin:10px 0}}.sidebar{position:fixed;top:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;flex-shrink:0;width:160px;user-select:none}.sidebar-logo{margin-top:50px;width:60px;height:60px}.sidebar-menu{display:flex;flex-direction:column;flex:1;margin-top:12px}.sidebar-menu .item{display:block;margin-top:18px}.sidebar-menu .item>a{display:block;width:120px;height:36px;line-height:36px;font-size:14px;border-radius:18px;text-align:center}.sidebar-menu .item>a,.sidebar-menu .item a:active,.sidebar-menu .item a:visited{color:#909399;text-decoration:none}.sidebar-menu .item>a.active{background:linear-gradient(135deg,#57befc,#2c8af8);color:#fff;box-shadow:0 2px 8px rgba(44,138,248,.5)}.sidebar-version{display:flex;flex-direction:column;align-items:center;padding-bottom:20px}.sidebar-version-label{font-size:14px;color:#2c8af8;text-shadow:0 2px 6px rgba(44,138,248,.4)}.sidebar-version-text{text-align:center;font-size:14px;margin:8px 0;padding:0 10px;color:#54759a}@media(max-width:768px){.sidebar{width:100%;height:60px;flex-direction:row;background:#f4f5f6;z-index:10}.sidebar-logo{margin:0 15px;width:36px;height:36px}.sidebar-menu{flex:1;flex-direction:row;justify-content:center;margin-top:0;overflow-x:scroll;padding:10px}.sidebar-menu::-webkit-scrollbar{display:none}.sidebar-menu .item{margin:0 3px}.sidebar-menu .item>a{width:80px;height:32px;line-height:32px}.sidebar-menu .item.no-mobile,.sidebar-version{display:none}}.connections-devices{display:flex;padding:8px 2px}.connections-devices-item{padding:4px 0;margin-right:20px;font-size:14px;color:#909399;border-radius:3px;cursor:pointer;transition:color .3s ease}.connections-devices-item.selected{color:#2c8af8}.connections-card{display:flex;flex-direction:column;flex:1;margin-top:10px;padding:0;overflow:hidden}.connections-card .connections{display:flex;flex-direction:column;width:100%;flex-grow:1;flex-basis:0;overflow:auto}.connections-card .connections-body{flex:1 0 auto}.connections-card .connections-th{position:relative;text-align:center;color:#909399;background:#f3f6f9;height:30px;line-height:30px;font-weight:500;font-size:14px;cursor:pointer;user-select:none}.connections-card .connections-th.resizing .connections-resizer{opacity:1}.connections-card .connections-th.fixed{position:sticky!important;left:0;z-index:99;box-shadow:inset -9px 0 8px -14px #000}.connections-card .connections-resizer{position:absolute;opacity:0;right:-10px;top:8px;bottom:8px;width:20px;transition:opacity .3s ease;z-index:10;font-size:14px;font-weight:300;touch-action:none}.connections-card .connections-resizer:before{content:"";display:block;position:absolute;left:10px;transform:translateX(-2px);width:2px;height:100%;background-color:rgba(144,147,153,.6)}.connections-card .connections-header{position:sticky;top:0;z-index:9999;white-space:nowrap}.connections-card .connections-header:hover .connections-resizer{opacity:1}.connections-card .connetions-item{height:36px}.connections-card .connections-block{display:flex;align-items:center;font-size:14px;line-height:36px;padding:0 10px;color:#54759a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.connections-card .connections-block.center{text-align:center}.connections-card .connections-block.completed{background-color:#e9eef4;color:rgba(84,117,154,.5)}.connections-card .connections-block.fixed{position:sticky;left:0;z-index:999;background-color:#fff;box-shadow:inset -9px 0 8px -14px #000}.connections-filter{color:#2c8af8;font-size:14px;line-height:20px;margin-left:15px;text-shadow:0 0 6px rgba(44,138,248,.4);cursor:pointer}.connections-filter.dangerous{color:#f56c6c;text-shadow:0 0 6px rgba(87,190,252,.2)}.connections-filter.total{flex:1;cursor:unset}.external-controller .row{padding:0}.external-controller .alert{margin:10px 0}.external-controller .form,.external-controller .title{margin:15px 0}.external-controller .title{margin-top:15px;font-size:14px;font-weight:700}@media(max-width:768px){.external-controller .row{flex-direction:column;align-items:flex-start}.external-controller .form,.external-controller .title{margin:5px 0}.external-controller .column{width:100%}.external-controller .alert{display:none}} \ No newline at end of file +@font-face{font-family:"clash-iconfont";src:url(//at.alicdn.com/t/font_841708_ok9czskbhel.ttf?t=1576162884356) format("truetype")}.clash-iconfont{font-family:"clash-iconfont"!important;font-size:14px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c8af8}.icon-update:before{content:""}.icon-healthcheck:before{content:""}.icon-speed:before{content:""}.icon-close:before{content:""}.icon-drag:before{content:""}.icon-down-arrow-o:before{content:""}.icon-check:before{content:""}.icon-plus:before{content:""}.icon-triangle-up:before{content:""}.icon-triangle-down:before{content:""}.icon-up-arrow-o:before{content:""}.icon-info:before{content:""}.icon-info-o:before{content:""}.icon-setting:before{content:""}.icon-show:before{content:""}.icon-hide:before{content:""}.icon-sort:before{content:""}.icon-sort-descending:before{content:""}.icon-sort-ascending:before{content:""}.icon-close-all:before{content:""}html{box-sizing:border-box;background:hsla(0,0%,100%,.8);overflow:hidden}*,:after,:before{margin:0;padding:0;box-sizing:inherit}body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}body ::-webkit-scrollbar{z-index:11;background:transparent}body ::-webkit-scrollbar-thumb{border-radius:5px;background:#2c8af8}body ::-webkit-scrollbar:vertical{width:6px}body ::-webkit-scrollbar:horizontal{height:6px}.app{min-height:100vh;padding-left:150px}.app.not-clashx{background:#f4f5f6}.page-container{width:100%;height:100vh;padding-left:10px;overflow-y:scroll}.page{padding:20px 35px 30px 20px;width:100%;min-height:100vh;margin:0 auto;display:flex;flex-direction:column}.container{margin:20px 0}input{-webkit-appearance:none}@media(max-width:768px){.app{padding-left:0;padding-top:60px}.page-container{width:100%;padding:0 10px;height:calc(100vh - 60px);-webkit-overflow-scrolling:touch}.page-container::-webkit-scrollbar{display:none}.page{padding:0 0 20px;height:100%}}.header{margin:10px 0;width:100%;display:flex;flex-direction:row;align-items:center;justify-content:space-between;user-select:none}.header>h1{flex-shrink:0;font-size:24px;color:#2c8af8;font-weight:500;text-shadow:0 2px 6px rgba(44,138,248,.4);line-height:32px}.operations{display:flex;flex:1;align-items:center;justify-content:flex-end}@media(max-width:768px){.header>h1{font-size:20px}}.switch{display:inline-block;width:32px;height:16px;border-radius:8px;background-color:#d8dee2;transition:background-color .3s ease;position:relative;cursor:pointer}.switch.checked{background-color:#57befc}.switch.checked:after{transform:translateX(16px)}.switch.disabled{cursor:not-allowed;background-color:#b7c5d6}.switch.disabled:after{box-shadow:0 0 8px rgba(144,147,153,.5)}.switch.checked.disabled,.switch.disabled:after{background-color:#e4eaef}.switch:after{content:"";position:absolute;top:-1px;height:18px;width:18px;border-radius:9px;background-color:#fff;box-shadow:0 0 8px rgba(44,138,248,.4);transition:transform .3s ease;transform:translateX(-2px)}.switch-icon{position:absolute;transform:translateX(-1px) scale(.4);color:#fff;line-height:16px}.card{padding:15px;box-shadow:2px 5px 20px -3px rgba(44,138,248,.18);background-color:#fff;border-radius:4px}.row{width:100%;display:flex;flex-direction:row}.row-gutter-1{padding:12px 6px}.row-gutter-1 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-1 .column-span-1{width:100%}.row-gutter-1 .column-offset-1{margin-left:100%}.row-gutter-1 .column-span-2{width:200%}.row-gutter-1 .column-offset-2{margin-left:200%}.row-gutter-1 .column-span-3{width:300%}.row-gutter-1 .column-offset-3{margin-left:300%}.row-gutter-1 .column-span-4{width:400%}.row-gutter-1 .column-offset-4{margin-left:400%}.row-gutter-1 .column-span-5{width:500%}.row-gutter-1 .column-offset-5{margin-left:500%}.row-gutter-1 .column-span-6{width:600%}.row-gutter-1 .column-offset-6{margin-left:600%}.row-gutter-1 .column-span-7{width:700%}.row-gutter-1 .column-offset-7{margin-left:700%}.row-gutter-1 .column-span-8{width:800%}.row-gutter-1 .column-offset-8{margin-left:800%}.row-gutter-1 .column-span-9{width:900%}.row-gutter-1 .column-offset-9{margin-left:900%}.row-gutter-1 .column-span-10{width:1000%}.row-gutter-1 .column-offset-10{margin-left:1000%}.row-gutter-1 .column-span-11{width:1100%}.row-gutter-1 .column-offset-11{margin-left:1100%}.row-gutter-1 .column-span-12{width:1200%}.row-gutter-1 .column-offset-12{margin-left:1200%}.row-gutter-1 .column-span-13{width:1300%}.row-gutter-1 .column-offset-13{margin-left:1300%}.row-gutter-1 .column-span-14{width:1400%}.row-gutter-1 .column-offset-14{margin-left:1400%}.row-gutter-1 .column-span-15{width:1500%}.row-gutter-1 .column-offset-15{margin-left:1500%}.row-gutter-1 .column-span-16{width:1600%}.row-gutter-1 .column-offset-16{margin-left:1600%}.row-gutter-1 .column-span-17{width:1700%}.row-gutter-1 .column-offset-17{margin-left:1700%}.row-gutter-1 .column-span-18{width:1800%}.row-gutter-1 .column-offset-18{margin-left:1800%}.row-gutter-1 .column-span-19{width:1900%}.row-gutter-1 .column-offset-19{margin-left:1900%}.row-gutter-1 .column-span-20{width:2000%}.row-gutter-1 .column-offset-20{margin-left:2000%}.row-gutter-1 .column-span-21{width:2100%}.row-gutter-1 .column-offset-21{margin-left:2100%}.row-gutter-1 .column-span-22{width:2200%}.row-gutter-1 .column-offset-22{margin-left:2200%}.row-gutter-1 .column-span-23{width:2300%}.row-gutter-1 .column-offset-23{margin-left:2300%}.row-gutter-1 .column-span-24{width:2400%}.row-gutter-1 .column-offset-24{margin-left:2400%}.row-gutter-2{padding:12px 6px}.row-gutter-2 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-2 .column-span-1{width:50%}.row-gutter-2 .column-offset-1{margin-left:50%}.row-gutter-2 .column-span-2{width:100%}.row-gutter-2 .column-offset-2{margin-left:100%}.row-gutter-2 .column-span-3{width:150%}.row-gutter-2 .column-offset-3{margin-left:150%}.row-gutter-2 .column-span-4{width:200%}.row-gutter-2 .column-offset-4{margin-left:200%}.row-gutter-2 .column-span-5{width:250%}.row-gutter-2 .column-offset-5{margin-left:250%}.row-gutter-2 .column-span-6{width:300%}.row-gutter-2 .column-offset-6{margin-left:300%}.row-gutter-2 .column-span-7{width:350%}.row-gutter-2 .column-offset-7{margin-left:350%}.row-gutter-2 .column-span-8{width:400%}.row-gutter-2 .column-offset-8{margin-left:400%}.row-gutter-2 .column-span-9{width:450%}.row-gutter-2 .column-offset-9{margin-left:450%}.row-gutter-2 .column-span-10{width:500%}.row-gutter-2 .column-offset-10{margin-left:500%}.row-gutter-2 .column-span-11{width:550%}.row-gutter-2 .column-offset-11{margin-left:550%}.row-gutter-2 .column-span-12{width:600%}.row-gutter-2 .column-offset-12{margin-left:600%}.row-gutter-2 .column-span-13{width:650%}.row-gutter-2 .column-offset-13{margin-left:650%}.row-gutter-2 .column-span-14{width:700%}.row-gutter-2 .column-offset-14{margin-left:700%}.row-gutter-2 .column-span-15{width:750%}.row-gutter-2 .column-offset-15{margin-left:750%}.row-gutter-2 .column-span-16{width:800%}.row-gutter-2 .column-offset-16{margin-left:800%}.row-gutter-2 .column-span-17{width:850%}.row-gutter-2 .column-offset-17{margin-left:850%}.row-gutter-2 .column-span-18{width:900%}.row-gutter-2 .column-offset-18{margin-left:900%}.row-gutter-2 .column-span-19{width:950%}.row-gutter-2 .column-offset-19{margin-left:950%}.row-gutter-2 .column-span-20{width:1000%}.row-gutter-2 .column-offset-20{margin-left:1000%}.row-gutter-2 .column-span-21{width:1050%}.row-gutter-2 .column-offset-21{margin-left:1050%}.row-gutter-2 .column-span-22{width:1100%}.row-gutter-2 .column-offset-22{margin-left:1100%}.row-gutter-2 .column-span-23{width:1150%}.row-gutter-2 .column-offset-23{margin-left:1150%}.row-gutter-2 .column-span-24{width:1200%}.row-gutter-2 .column-offset-24{margin-left:1200%}.row-gutter-3{padding:12px 6px}.row-gutter-3 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-3 .column-span-1{width:33.3333333333%}.row-gutter-3 .column-offset-1{margin-left:33.3333333333%}.row-gutter-3 .column-span-2{width:66.6666666667%}.row-gutter-3 .column-offset-2{margin-left:66.6666666667%}.row-gutter-3 .column-span-3{width:100%}.row-gutter-3 .column-offset-3{margin-left:100%}.row-gutter-3 .column-span-4{width:133.3333333333%}.row-gutter-3 .column-offset-4{margin-left:133.3333333333%}.row-gutter-3 .column-span-5{width:166.6666666667%}.row-gutter-3 .column-offset-5{margin-left:166.6666666667%}.row-gutter-3 .column-span-6{width:200%}.row-gutter-3 .column-offset-6{margin-left:200%}.row-gutter-3 .column-span-7{width:233.3333333333%}.row-gutter-3 .column-offset-7{margin-left:233.3333333333%}.row-gutter-3 .column-span-8{width:266.6666666667%}.row-gutter-3 .column-offset-8{margin-left:266.6666666667%}.row-gutter-3 .column-span-9{width:300%}.row-gutter-3 .column-offset-9{margin-left:300%}.row-gutter-3 .column-span-10{width:333.3333333333%}.row-gutter-3 .column-offset-10{margin-left:333.3333333333%}.row-gutter-3 .column-span-11{width:366.6666666667%}.row-gutter-3 .column-offset-11{margin-left:366.6666666667%}.row-gutter-3 .column-span-12{width:400%}.row-gutter-3 .column-offset-12{margin-left:400%}.row-gutter-3 .column-span-13{width:433.3333333333%}.row-gutter-3 .column-offset-13{margin-left:433.3333333333%}.row-gutter-3 .column-span-14{width:466.6666666667%}.row-gutter-3 .column-offset-14{margin-left:466.6666666667%}.row-gutter-3 .column-span-15{width:500%}.row-gutter-3 .column-offset-15{margin-left:500%}.row-gutter-3 .column-span-16{width:533.3333333333%}.row-gutter-3 .column-offset-16{margin-left:533.3333333333%}.row-gutter-3 .column-span-17{width:566.6666666667%}.row-gutter-3 .column-offset-17{margin-left:566.6666666667%}.row-gutter-3 .column-span-18{width:600%}.row-gutter-3 .column-offset-18{margin-left:600%}.row-gutter-3 .column-span-19{width:633.3333333333%}.row-gutter-3 .column-offset-19{margin-left:633.3333333333%}.row-gutter-3 .column-span-20{width:666.6666666667%}.row-gutter-3 .column-offset-20{margin-left:666.6666666667%}.row-gutter-3 .column-span-21{width:700%}.row-gutter-3 .column-offset-21{margin-left:700%}.row-gutter-3 .column-span-22{width:733.3333333333%}.row-gutter-3 .column-offset-22{margin-left:733.3333333333%}.row-gutter-3 .column-span-23{width:766.6666666667%}.row-gutter-3 .column-offset-23{margin-left:766.6666666667%}.row-gutter-3 .column-span-24{width:800%}.row-gutter-3 .column-offset-24{margin-left:800%}.row-gutter-4{padding:12px 6px}.row-gutter-4 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-4 .column-span-1{width:25%}.row-gutter-4 .column-offset-1{margin-left:25%}.row-gutter-4 .column-span-2{width:50%}.row-gutter-4 .column-offset-2{margin-left:50%}.row-gutter-4 .column-span-3{width:75%}.row-gutter-4 .column-offset-3{margin-left:75%}.row-gutter-4 .column-span-4{width:100%}.row-gutter-4 .column-offset-4{margin-left:100%}.row-gutter-4 .column-span-5{width:125%}.row-gutter-4 .column-offset-5{margin-left:125%}.row-gutter-4 .column-span-6{width:150%}.row-gutter-4 .column-offset-6{margin-left:150%}.row-gutter-4 .column-span-7{width:175%}.row-gutter-4 .column-offset-7{margin-left:175%}.row-gutter-4 .column-span-8{width:200%}.row-gutter-4 .column-offset-8{margin-left:200%}.row-gutter-4 .column-span-9{width:225%}.row-gutter-4 .column-offset-9{margin-left:225%}.row-gutter-4 .column-span-10{width:250%}.row-gutter-4 .column-offset-10{margin-left:250%}.row-gutter-4 .column-span-11{width:275%}.row-gutter-4 .column-offset-11{margin-left:275%}.row-gutter-4 .column-span-12{width:300%}.row-gutter-4 .column-offset-12{margin-left:300%}.row-gutter-4 .column-span-13{width:325%}.row-gutter-4 .column-offset-13{margin-left:325%}.row-gutter-4 .column-span-14{width:350%}.row-gutter-4 .column-offset-14{margin-left:350%}.row-gutter-4 .column-span-15{width:375%}.row-gutter-4 .column-offset-15{margin-left:375%}.row-gutter-4 .column-span-16{width:400%}.row-gutter-4 .column-offset-16{margin-left:400%}.row-gutter-4 .column-span-17{width:425%}.row-gutter-4 .column-offset-17{margin-left:425%}.row-gutter-4 .column-span-18{width:450%}.row-gutter-4 .column-offset-18{margin-left:450%}.row-gutter-4 .column-span-19{width:475%}.row-gutter-4 .column-offset-19{margin-left:475%}.row-gutter-4 .column-span-20{width:500%}.row-gutter-4 .column-offset-20{margin-left:500%}.row-gutter-4 .column-span-21{width:525%}.row-gutter-4 .column-offset-21{margin-left:525%}.row-gutter-4 .column-span-22{width:550%}.row-gutter-4 .column-offset-22{margin-left:550%}.row-gutter-4 .column-span-23{width:575%}.row-gutter-4 .column-offset-23{margin-left:575%}.row-gutter-4 .column-span-24{width:600%}.row-gutter-4 .column-offset-24{margin-left:600%}.row-gutter-5{padding:12px 6px}.row-gutter-5 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-5 .column-span-1{width:20%}.row-gutter-5 .column-offset-1{margin-left:20%}.row-gutter-5 .column-span-2{width:40%}.row-gutter-5 .column-offset-2{margin-left:40%}.row-gutter-5 .column-span-3{width:60%}.row-gutter-5 .column-offset-3{margin-left:60%}.row-gutter-5 .column-span-4{width:80%}.row-gutter-5 .column-offset-4{margin-left:80%}.row-gutter-5 .column-span-5{width:100%}.row-gutter-5 .column-offset-5{margin-left:100%}.row-gutter-5 .column-span-6{width:120%}.row-gutter-5 .column-offset-6{margin-left:120%}.row-gutter-5 .column-span-7{width:140%}.row-gutter-5 .column-offset-7{margin-left:140%}.row-gutter-5 .column-span-8{width:160%}.row-gutter-5 .column-offset-8{margin-left:160%}.row-gutter-5 .column-span-9{width:180%}.row-gutter-5 .column-offset-9{margin-left:180%}.row-gutter-5 .column-span-10{width:200%}.row-gutter-5 .column-offset-10{margin-left:200%}.row-gutter-5 .column-span-11{width:220%}.row-gutter-5 .column-offset-11{margin-left:220%}.row-gutter-5 .column-span-12{width:240%}.row-gutter-5 .column-offset-12{margin-left:240%}.row-gutter-5 .column-span-13{width:260%}.row-gutter-5 .column-offset-13{margin-left:260%}.row-gutter-5 .column-span-14{width:280%}.row-gutter-5 .column-offset-14{margin-left:280%}.row-gutter-5 .column-span-15{width:300%}.row-gutter-5 .column-offset-15{margin-left:300%}.row-gutter-5 .column-span-16{width:320%}.row-gutter-5 .column-offset-16{margin-left:320%}.row-gutter-5 .column-span-17{width:340%}.row-gutter-5 .column-offset-17{margin-left:340%}.row-gutter-5 .column-span-18{width:360%}.row-gutter-5 .column-offset-18{margin-left:360%}.row-gutter-5 .column-span-19{width:380%}.row-gutter-5 .column-offset-19{margin-left:380%}.row-gutter-5 .column-span-20{width:400%}.row-gutter-5 .column-offset-20{margin-left:400%}.row-gutter-5 .column-span-21{width:420%}.row-gutter-5 .column-offset-21{margin-left:420%}.row-gutter-5 .column-span-22{width:440%}.row-gutter-5 .column-offset-22{margin-left:440%}.row-gutter-5 .column-span-23{width:460%}.row-gutter-5 .column-offset-23{margin-left:460%}.row-gutter-5 .column-span-24{width:480%}.row-gutter-5 .column-offset-24{margin-left:480%}.row-gutter-6{padding:12px 6px}.row-gutter-6 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-6 .column-span-1{width:16.6666666667%}.row-gutter-6 .column-offset-1{margin-left:16.6666666667%}.row-gutter-6 .column-span-2{width:33.3333333333%}.row-gutter-6 .column-offset-2{margin-left:33.3333333333%}.row-gutter-6 .column-span-3{width:50%}.row-gutter-6 .column-offset-3{margin-left:50%}.row-gutter-6 .column-span-4{width:66.6666666667%}.row-gutter-6 .column-offset-4{margin-left:66.6666666667%}.row-gutter-6 .column-span-5{width:83.3333333333%}.row-gutter-6 .column-offset-5{margin-left:83.3333333333%}.row-gutter-6 .column-span-6{width:100%}.row-gutter-6 .column-offset-6{margin-left:100%}.row-gutter-6 .column-span-7{width:116.6666666667%}.row-gutter-6 .column-offset-7{margin-left:116.6666666667%}.row-gutter-6 .column-span-8{width:133.3333333333%}.row-gutter-6 .column-offset-8{margin-left:133.3333333333%}.row-gutter-6 .column-span-9{width:150%}.row-gutter-6 .column-offset-9{margin-left:150%}.row-gutter-6 .column-span-10{width:166.6666666667%}.row-gutter-6 .column-offset-10{margin-left:166.6666666667%}.row-gutter-6 .column-span-11{width:183.3333333333%}.row-gutter-6 .column-offset-11{margin-left:183.3333333333%}.row-gutter-6 .column-span-12{width:200%}.row-gutter-6 .column-offset-12{margin-left:200%}.row-gutter-6 .column-span-13{width:216.6666666667%}.row-gutter-6 .column-offset-13{margin-left:216.6666666667%}.row-gutter-6 .column-span-14{width:233.3333333333%}.row-gutter-6 .column-offset-14{margin-left:233.3333333333%}.row-gutter-6 .column-span-15{width:250%}.row-gutter-6 .column-offset-15{margin-left:250%}.row-gutter-6 .column-span-16{width:266.6666666667%}.row-gutter-6 .column-offset-16{margin-left:266.6666666667%}.row-gutter-6 .column-span-17{width:283.3333333333%}.row-gutter-6 .column-offset-17{margin-left:283.3333333333%}.row-gutter-6 .column-span-18{width:300%}.row-gutter-6 .column-offset-18{margin-left:300%}.row-gutter-6 .column-span-19{width:316.6666666667%}.row-gutter-6 .column-offset-19{margin-left:316.6666666667%}.row-gutter-6 .column-span-20{width:333.3333333333%}.row-gutter-6 .column-offset-20{margin-left:333.3333333333%}.row-gutter-6 .column-span-21{width:350%}.row-gutter-6 .column-offset-21{margin-left:350%}.row-gutter-6 .column-span-22{width:366.6666666667%}.row-gutter-6 .column-offset-22{margin-left:366.6666666667%}.row-gutter-6 .column-span-23{width:383.3333333333%}.row-gutter-6 .column-offset-23{margin-left:383.3333333333%}.row-gutter-6 .column-span-24{width:400%}.row-gutter-6 .column-offset-24{margin-left:400%}.row-gutter-7{padding:12px 6px}.row-gutter-7 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-7 .column-span-1{width:14.2857142857%}.row-gutter-7 .column-offset-1{margin-left:14.2857142857%}.row-gutter-7 .column-span-2{width:28.5714285714%}.row-gutter-7 .column-offset-2{margin-left:28.5714285714%}.row-gutter-7 .column-span-3{width:42.8571428571%}.row-gutter-7 .column-offset-3{margin-left:42.8571428571%}.row-gutter-7 .column-span-4{width:57.1428571429%}.row-gutter-7 .column-offset-4{margin-left:57.1428571429%}.row-gutter-7 .column-span-5{width:71.4285714286%}.row-gutter-7 .column-offset-5{margin-left:71.4285714286%}.row-gutter-7 .column-span-6{width:85.7142857143%}.row-gutter-7 .column-offset-6{margin-left:85.7142857143%}.row-gutter-7 .column-span-7{width:100%}.row-gutter-7 .column-offset-7{margin-left:100%}.row-gutter-7 .column-span-8{width:114.2857142857%}.row-gutter-7 .column-offset-8{margin-left:114.2857142857%}.row-gutter-7 .column-span-9{width:128.5714285714%}.row-gutter-7 .column-offset-9{margin-left:128.5714285714%}.row-gutter-7 .column-span-10{width:142.8571428571%}.row-gutter-7 .column-offset-10{margin-left:142.8571428571%}.row-gutter-7 .column-span-11{width:157.1428571429%}.row-gutter-7 .column-offset-11{margin-left:157.1428571429%}.row-gutter-7 .column-span-12{width:171.4285714286%}.row-gutter-7 .column-offset-12{margin-left:171.4285714286%}.row-gutter-7 .column-span-13{width:185.7142857143%}.row-gutter-7 .column-offset-13{margin-left:185.7142857143%}.row-gutter-7 .column-span-14{width:200%}.row-gutter-7 .column-offset-14{margin-left:200%}.row-gutter-7 .column-span-15{width:214.2857142857%}.row-gutter-7 .column-offset-15{margin-left:214.2857142857%}.row-gutter-7 .column-span-16{width:228.5714285714%}.row-gutter-7 .column-offset-16{margin-left:228.5714285714%}.row-gutter-7 .column-span-17{width:242.8571428571%}.row-gutter-7 .column-offset-17{margin-left:242.8571428571%}.row-gutter-7 .column-span-18{width:257.1428571429%}.row-gutter-7 .column-offset-18{margin-left:257.1428571429%}.row-gutter-7 .column-span-19{width:271.4285714286%}.row-gutter-7 .column-offset-19{margin-left:271.4285714286%}.row-gutter-7 .column-span-20{width:285.7142857143%}.row-gutter-7 .column-offset-20{margin-left:285.7142857143%}.row-gutter-7 .column-span-21{width:300%}.row-gutter-7 .column-offset-21{margin-left:300%}.row-gutter-7 .column-span-22{width:314.2857142857%}.row-gutter-7 .column-offset-22{margin-left:314.2857142857%}.row-gutter-7 .column-span-23{width:328.5714285714%}.row-gutter-7 .column-offset-23{margin-left:328.5714285714%}.row-gutter-7 .column-span-24{width:342.8571428571%}.row-gutter-7 .column-offset-24{margin-left:342.8571428571%}.row-gutter-8{padding:12px 6px}.row-gutter-8 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-8 .column-span-1{width:12.5%}.row-gutter-8 .column-offset-1{margin-left:12.5%}.row-gutter-8 .column-span-2{width:25%}.row-gutter-8 .column-offset-2{margin-left:25%}.row-gutter-8 .column-span-3{width:37.5%}.row-gutter-8 .column-offset-3{margin-left:37.5%}.row-gutter-8 .column-span-4{width:50%}.row-gutter-8 .column-offset-4{margin-left:50%}.row-gutter-8 .column-span-5{width:62.5%}.row-gutter-8 .column-offset-5{margin-left:62.5%}.row-gutter-8 .column-span-6{width:75%}.row-gutter-8 .column-offset-6{margin-left:75%}.row-gutter-8 .column-span-7{width:87.5%}.row-gutter-8 .column-offset-7{margin-left:87.5%}.row-gutter-8 .column-span-8{width:100%}.row-gutter-8 .column-offset-8{margin-left:100%}.row-gutter-8 .column-span-9{width:112.5%}.row-gutter-8 .column-offset-9{margin-left:112.5%}.row-gutter-8 .column-span-10{width:125%}.row-gutter-8 .column-offset-10{margin-left:125%}.row-gutter-8 .column-span-11{width:137.5%}.row-gutter-8 .column-offset-11{margin-left:137.5%}.row-gutter-8 .column-span-12{width:150%}.row-gutter-8 .column-offset-12{margin-left:150%}.row-gutter-8 .column-span-13{width:162.5%}.row-gutter-8 .column-offset-13{margin-left:162.5%}.row-gutter-8 .column-span-14{width:175%}.row-gutter-8 .column-offset-14{margin-left:175%}.row-gutter-8 .column-span-15{width:187.5%}.row-gutter-8 .column-offset-15{margin-left:187.5%}.row-gutter-8 .column-span-16{width:200%}.row-gutter-8 .column-offset-16{margin-left:200%}.row-gutter-8 .column-span-17{width:212.5%}.row-gutter-8 .column-offset-17{margin-left:212.5%}.row-gutter-8 .column-span-18{width:225%}.row-gutter-8 .column-offset-18{margin-left:225%}.row-gutter-8 .column-span-19{width:237.5%}.row-gutter-8 .column-offset-19{margin-left:237.5%}.row-gutter-8 .column-span-20{width:250%}.row-gutter-8 .column-offset-20{margin-left:250%}.row-gutter-8 .column-span-21{width:262.5%}.row-gutter-8 .column-offset-21{margin-left:262.5%}.row-gutter-8 .column-span-22{width:275%}.row-gutter-8 .column-offset-22{margin-left:275%}.row-gutter-8 .column-span-23{width:287.5%}.row-gutter-8 .column-offset-23{margin-left:287.5%}.row-gutter-8 .column-span-24{width:300%}.row-gutter-8 .column-offset-24{margin-left:300%}.row-gutter-9{padding:12px 6px}.row-gutter-9 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-9 .column-span-1{width:11.1111111111%}.row-gutter-9 .column-offset-1{margin-left:11.1111111111%}.row-gutter-9 .column-span-2{width:22.2222222222%}.row-gutter-9 .column-offset-2{margin-left:22.2222222222%}.row-gutter-9 .column-span-3{width:33.3333333333%}.row-gutter-9 .column-offset-3{margin-left:33.3333333333%}.row-gutter-9 .column-span-4{width:44.4444444444%}.row-gutter-9 .column-offset-4{margin-left:44.4444444444%}.row-gutter-9 .column-span-5{width:55.5555555556%}.row-gutter-9 .column-offset-5{margin-left:55.5555555556%}.row-gutter-9 .column-span-6{width:66.6666666667%}.row-gutter-9 .column-offset-6{margin-left:66.6666666667%}.row-gutter-9 .column-span-7{width:77.7777777778%}.row-gutter-9 .column-offset-7{margin-left:77.7777777778%}.row-gutter-9 .column-span-8{width:88.8888888889%}.row-gutter-9 .column-offset-8{margin-left:88.8888888889%}.row-gutter-9 .column-span-9{width:100%}.row-gutter-9 .column-offset-9{margin-left:100%}.row-gutter-9 .column-span-10{width:111.1111111111%}.row-gutter-9 .column-offset-10{margin-left:111.1111111111%}.row-gutter-9 .column-span-11{width:122.2222222222%}.row-gutter-9 .column-offset-11{margin-left:122.2222222222%}.row-gutter-9 .column-span-12{width:133.3333333333%}.row-gutter-9 .column-offset-12{margin-left:133.3333333333%}.row-gutter-9 .column-span-13{width:144.4444444444%}.row-gutter-9 .column-offset-13{margin-left:144.4444444444%}.row-gutter-9 .column-span-14{width:155.5555555556%}.row-gutter-9 .column-offset-14{margin-left:155.5555555556%}.row-gutter-9 .column-span-15{width:166.6666666667%}.row-gutter-9 .column-offset-15{margin-left:166.6666666667%}.row-gutter-9 .column-span-16{width:177.7777777778%}.row-gutter-9 .column-offset-16{margin-left:177.7777777778%}.row-gutter-9 .column-span-17{width:188.8888888889%}.row-gutter-9 .column-offset-17{margin-left:188.8888888889%}.row-gutter-9 .column-span-18{width:200%}.row-gutter-9 .column-offset-18{margin-left:200%}.row-gutter-9 .column-span-19{width:211.1111111111%}.row-gutter-9 .column-offset-19{margin-left:211.1111111111%}.row-gutter-9 .column-span-20{width:222.2222222222%}.row-gutter-9 .column-offset-20{margin-left:222.2222222222%}.row-gutter-9 .column-span-21{width:233.3333333333%}.row-gutter-9 .column-offset-21{margin-left:233.3333333333%}.row-gutter-9 .column-span-22{width:244.4444444444%}.row-gutter-9 .column-offset-22{margin-left:244.4444444444%}.row-gutter-9 .column-span-23{width:255.5555555556%}.row-gutter-9 .column-offset-23{margin-left:255.5555555556%}.row-gutter-9 .column-span-24{width:266.6666666667%}.row-gutter-9 .column-offset-24{margin-left:266.6666666667%}.row-gutter-10{padding:12px 6px}.row-gutter-10 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-10 .column-span-1{width:10%}.row-gutter-10 .column-offset-1{margin-left:10%}.row-gutter-10 .column-span-2{width:20%}.row-gutter-10 .column-offset-2{margin-left:20%}.row-gutter-10 .column-span-3{width:30%}.row-gutter-10 .column-offset-3{margin-left:30%}.row-gutter-10 .column-span-4{width:40%}.row-gutter-10 .column-offset-4{margin-left:40%}.row-gutter-10 .column-span-5{width:50%}.row-gutter-10 .column-offset-5{margin-left:50%}.row-gutter-10 .column-span-6{width:60%}.row-gutter-10 .column-offset-6{margin-left:60%}.row-gutter-10 .column-span-7{width:70%}.row-gutter-10 .column-offset-7{margin-left:70%}.row-gutter-10 .column-span-8{width:80%}.row-gutter-10 .column-offset-8{margin-left:80%}.row-gutter-10 .column-span-9{width:90%}.row-gutter-10 .column-offset-9{margin-left:90%}.row-gutter-10 .column-span-10{width:100%}.row-gutter-10 .column-offset-10{margin-left:100%}.row-gutter-10 .column-span-11{width:110%}.row-gutter-10 .column-offset-11{margin-left:110%}.row-gutter-10 .column-span-12{width:120%}.row-gutter-10 .column-offset-12{margin-left:120%}.row-gutter-10 .column-span-13{width:130%}.row-gutter-10 .column-offset-13{margin-left:130%}.row-gutter-10 .column-span-14{width:140%}.row-gutter-10 .column-offset-14{margin-left:140%}.row-gutter-10 .column-span-15{width:150%}.row-gutter-10 .column-offset-15{margin-left:150%}.row-gutter-10 .column-span-16{width:160%}.row-gutter-10 .column-offset-16{margin-left:160%}.row-gutter-10 .column-span-17{width:170%}.row-gutter-10 .column-offset-17{margin-left:170%}.row-gutter-10 .column-span-18{width:180%}.row-gutter-10 .column-offset-18{margin-left:180%}.row-gutter-10 .column-span-19{width:190%}.row-gutter-10 .column-offset-19{margin-left:190%}.row-gutter-10 .column-span-20{width:200%}.row-gutter-10 .column-offset-20{margin-left:200%}.row-gutter-10 .column-span-21{width:210%}.row-gutter-10 .column-offset-21{margin-left:210%}.row-gutter-10 .column-span-22{width:220%}.row-gutter-10 .column-offset-22{margin-left:220%}.row-gutter-10 .column-span-23{width:230%}.row-gutter-10 .column-offset-23{margin-left:230%}.row-gutter-10 .column-span-24{width:240%}.row-gutter-10 .column-offset-24{margin-left:240%}.row-gutter-11{padding:12px 6px}.row-gutter-11 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-11 .column-span-1{width:9.0909090909%}.row-gutter-11 .column-offset-1{margin-left:9.0909090909%}.row-gutter-11 .column-span-2{width:18.1818181818%}.row-gutter-11 .column-offset-2{margin-left:18.1818181818%}.row-gutter-11 .column-span-3{width:27.2727272727%}.row-gutter-11 .column-offset-3{margin-left:27.2727272727%}.row-gutter-11 .column-span-4{width:36.3636363636%}.row-gutter-11 .column-offset-4{margin-left:36.3636363636%}.row-gutter-11 .column-span-5{width:45.4545454545%}.row-gutter-11 .column-offset-5{margin-left:45.4545454545%}.row-gutter-11 .column-span-6{width:54.5454545455%}.row-gutter-11 .column-offset-6{margin-left:54.5454545455%}.row-gutter-11 .column-span-7{width:63.6363636364%}.row-gutter-11 .column-offset-7{margin-left:63.6363636364%}.row-gutter-11 .column-span-8{width:72.7272727273%}.row-gutter-11 .column-offset-8{margin-left:72.7272727273%}.row-gutter-11 .column-span-9{width:81.8181818182%}.row-gutter-11 .column-offset-9{margin-left:81.8181818182%}.row-gutter-11 .column-span-10{width:90.9090909091%}.row-gutter-11 .column-offset-10{margin-left:90.9090909091%}.row-gutter-11 .column-span-11{width:100%}.row-gutter-11 .column-offset-11{margin-left:100%}.row-gutter-11 .column-span-12{width:109.0909090909%}.row-gutter-11 .column-offset-12{margin-left:109.0909090909%}.row-gutter-11 .column-span-13{width:118.1818181818%}.row-gutter-11 .column-offset-13{margin-left:118.1818181818%}.row-gutter-11 .column-span-14{width:127.2727272727%}.row-gutter-11 .column-offset-14{margin-left:127.2727272727%}.row-gutter-11 .column-span-15{width:136.3636363636%}.row-gutter-11 .column-offset-15{margin-left:136.3636363636%}.row-gutter-11 .column-span-16{width:145.4545454545%}.row-gutter-11 .column-offset-16{margin-left:145.4545454545%}.row-gutter-11 .column-span-17{width:154.5454545455%}.row-gutter-11 .column-offset-17{margin-left:154.5454545455%}.row-gutter-11 .column-span-18{width:163.6363636364%}.row-gutter-11 .column-offset-18{margin-left:163.6363636364%}.row-gutter-11 .column-span-19{width:172.7272727273%}.row-gutter-11 .column-offset-19{margin-left:172.7272727273%}.row-gutter-11 .column-span-20{width:181.8181818182%}.row-gutter-11 .column-offset-20{margin-left:181.8181818182%}.row-gutter-11 .column-span-21{width:190.9090909091%}.row-gutter-11 .column-offset-21{margin-left:190.9090909091%}.row-gutter-11 .column-span-22{width:200%}.row-gutter-11 .column-offset-22{margin-left:200%}.row-gutter-11 .column-span-23{width:209.0909090909%}.row-gutter-11 .column-offset-23{margin-left:209.0909090909%}.row-gutter-11 .column-span-24{width:218.1818181818%}.row-gutter-11 .column-offset-24{margin-left:218.1818181818%}.row-gutter-12{padding:12px 6px}.row-gutter-12 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-12 .column-span-1{width:8.3333333333%}.row-gutter-12 .column-offset-1{margin-left:8.3333333333%}.row-gutter-12 .column-span-2{width:16.6666666667%}.row-gutter-12 .column-offset-2{margin-left:16.6666666667%}.row-gutter-12 .column-span-3{width:25%}.row-gutter-12 .column-offset-3{margin-left:25%}.row-gutter-12 .column-span-4{width:33.3333333333%}.row-gutter-12 .column-offset-4{margin-left:33.3333333333%}.row-gutter-12 .column-span-5{width:41.6666666667%}.row-gutter-12 .column-offset-5{margin-left:41.6666666667%}.row-gutter-12 .column-span-6{width:50%}.row-gutter-12 .column-offset-6{margin-left:50%}.row-gutter-12 .column-span-7{width:58.3333333333%}.row-gutter-12 .column-offset-7{margin-left:58.3333333333%}.row-gutter-12 .column-span-8{width:66.6666666667%}.row-gutter-12 .column-offset-8{margin-left:66.6666666667%}.row-gutter-12 .column-span-9{width:75%}.row-gutter-12 .column-offset-9{margin-left:75%}.row-gutter-12 .column-span-10{width:83.3333333333%}.row-gutter-12 .column-offset-10{margin-left:83.3333333333%}.row-gutter-12 .column-span-11{width:91.6666666667%}.row-gutter-12 .column-offset-11{margin-left:91.6666666667%}.row-gutter-12 .column-span-12{width:100%}.row-gutter-12 .column-offset-12{margin-left:100%}.row-gutter-12 .column-span-13{width:108.3333333333%}.row-gutter-12 .column-offset-13{margin-left:108.3333333333%}.row-gutter-12 .column-span-14{width:116.6666666667%}.row-gutter-12 .column-offset-14{margin-left:116.6666666667%}.row-gutter-12 .column-span-15{width:125%}.row-gutter-12 .column-offset-15{margin-left:125%}.row-gutter-12 .column-span-16{width:133.3333333333%}.row-gutter-12 .column-offset-16{margin-left:133.3333333333%}.row-gutter-12 .column-span-17{width:141.6666666667%}.row-gutter-12 .column-offset-17{margin-left:141.6666666667%}.row-gutter-12 .column-span-18{width:150%}.row-gutter-12 .column-offset-18{margin-left:150%}.row-gutter-12 .column-span-19{width:158.3333333333%}.row-gutter-12 .column-offset-19{margin-left:158.3333333333%}.row-gutter-12 .column-span-20{width:166.6666666667%}.row-gutter-12 .column-offset-20{margin-left:166.6666666667%}.row-gutter-12 .column-span-21{width:175%}.row-gutter-12 .column-offset-21{margin-left:175%}.row-gutter-12 .column-span-22{width:183.3333333333%}.row-gutter-12 .column-offset-22{margin-left:183.3333333333%}.row-gutter-12 .column-span-23{width:191.6666666667%}.row-gutter-12 .column-offset-23{margin-left:191.6666666667%}.row-gutter-12 .column-span-24{width:200%}.row-gutter-12 .column-offset-24{margin-left:200%}.row-gutter-13{padding:12px 6px}.row-gutter-13 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-13 .column-span-1{width:7.6923076923%}.row-gutter-13 .column-offset-1{margin-left:7.6923076923%}.row-gutter-13 .column-span-2{width:15.3846153846%}.row-gutter-13 .column-offset-2{margin-left:15.3846153846%}.row-gutter-13 .column-span-3{width:23.0769230769%}.row-gutter-13 .column-offset-3{margin-left:23.0769230769%}.row-gutter-13 .column-span-4{width:30.7692307692%}.row-gutter-13 .column-offset-4{margin-left:30.7692307692%}.row-gutter-13 .column-span-5{width:38.4615384615%}.row-gutter-13 .column-offset-5{margin-left:38.4615384615%}.row-gutter-13 .column-span-6{width:46.1538461538%}.row-gutter-13 .column-offset-6{margin-left:46.1538461538%}.row-gutter-13 .column-span-7{width:53.8461538462%}.row-gutter-13 .column-offset-7{margin-left:53.8461538462%}.row-gutter-13 .column-span-8{width:61.5384615385%}.row-gutter-13 .column-offset-8{margin-left:61.5384615385%}.row-gutter-13 .column-span-9{width:69.2307692308%}.row-gutter-13 .column-offset-9{margin-left:69.2307692308%}.row-gutter-13 .column-span-10{width:76.9230769231%}.row-gutter-13 .column-offset-10{margin-left:76.9230769231%}.row-gutter-13 .column-span-11{width:84.6153846154%}.row-gutter-13 .column-offset-11{margin-left:84.6153846154%}.row-gutter-13 .column-span-12{width:92.3076923077%}.row-gutter-13 .column-offset-12{margin-left:92.3076923077%}.row-gutter-13 .column-span-13{width:100%}.row-gutter-13 .column-offset-13{margin-left:100%}.row-gutter-13 .column-span-14{width:107.6923076923%}.row-gutter-13 .column-offset-14{margin-left:107.6923076923%}.row-gutter-13 .column-span-15{width:115.3846153846%}.row-gutter-13 .column-offset-15{margin-left:115.3846153846%}.row-gutter-13 .column-span-16{width:123.0769230769%}.row-gutter-13 .column-offset-16{margin-left:123.0769230769%}.row-gutter-13 .column-span-17{width:130.7692307692%}.row-gutter-13 .column-offset-17{margin-left:130.7692307692%}.row-gutter-13 .column-span-18{width:138.4615384615%}.row-gutter-13 .column-offset-18{margin-left:138.4615384615%}.row-gutter-13 .column-span-19{width:146.1538461538%}.row-gutter-13 .column-offset-19{margin-left:146.1538461538%}.row-gutter-13 .column-span-20{width:153.8461538462%}.row-gutter-13 .column-offset-20{margin-left:153.8461538462%}.row-gutter-13 .column-span-21{width:161.5384615385%}.row-gutter-13 .column-offset-21{margin-left:161.5384615385%}.row-gutter-13 .column-span-22{width:169.2307692308%}.row-gutter-13 .column-offset-22{margin-left:169.2307692308%}.row-gutter-13 .column-span-23{width:176.9230769231%}.row-gutter-13 .column-offset-23{margin-left:176.9230769231%}.row-gutter-13 .column-span-24{width:184.6153846154%}.row-gutter-13 .column-offset-24{margin-left:184.6153846154%}.row-gutter-14{padding:12px 6px}.row-gutter-14 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-14 .column-span-1{width:7.1428571429%}.row-gutter-14 .column-offset-1{margin-left:7.1428571429%}.row-gutter-14 .column-span-2{width:14.2857142857%}.row-gutter-14 .column-offset-2{margin-left:14.2857142857%}.row-gutter-14 .column-span-3{width:21.4285714286%}.row-gutter-14 .column-offset-3{margin-left:21.4285714286%}.row-gutter-14 .column-span-4{width:28.5714285714%}.row-gutter-14 .column-offset-4{margin-left:28.5714285714%}.row-gutter-14 .column-span-5{width:35.7142857143%}.row-gutter-14 .column-offset-5{margin-left:35.7142857143%}.row-gutter-14 .column-span-6{width:42.8571428571%}.row-gutter-14 .column-offset-6{margin-left:42.8571428571%}.row-gutter-14 .column-span-7{width:50%}.row-gutter-14 .column-offset-7{margin-left:50%}.row-gutter-14 .column-span-8{width:57.1428571429%}.row-gutter-14 .column-offset-8{margin-left:57.1428571429%}.row-gutter-14 .column-span-9{width:64.2857142857%}.row-gutter-14 .column-offset-9{margin-left:64.2857142857%}.row-gutter-14 .column-span-10{width:71.4285714286%}.row-gutter-14 .column-offset-10{margin-left:71.4285714286%}.row-gutter-14 .column-span-11{width:78.5714285714%}.row-gutter-14 .column-offset-11{margin-left:78.5714285714%}.row-gutter-14 .column-span-12{width:85.7142857143%}.row-gutter-14 .column-offset-12{margin-left:85.7142857143%}.row-gutter-14 .column-span-13{width:92.8571428571%}.row-gutter-14 .column-offset-13{margin-left:92.8571428571%}.row-gutter-14 .column-span-14{width:100%}.row-gutter-14 .column-offset-14{margin-left:100%}.row-gutter-14 .column-span-15{width:107.1428571429%}.row-gutter-14 .column-offset-15{margin-left:107.1428571429%}.row-gutter-14 .column-span-16{width:114.2857142857%}.row-gutter-14 .column-offset-16{margin-left:114.2857142857%}.row-gutter-14 .column-span-17{width:121.4285714286%}.row-gutter-14 .column-offset-17{margin-left:121.4285714286%}.row-gutter-14 .column-span-18{width:128.5714285714%}.row-gutter-14 .column-offset-18{margin-left:128.5714285714%}.row-gutter-14 .column-span-19{width:135.7142857143%}.row-gutter-14 .column-offset-19{margin-left:135.7142857143%}.row-gutter-14 .column-span-20{width:142.8571428571%}.row-gutter-14 .column-offset-20{margin-left:142.8571428571%}.row-gutter-14 .column-span-21{width:150%}.row-gutter-14 .column-offset-21{margin-left:150%}.row-gutter-14 .column-span-22{width:157.1428571429%}.row-gutter-14 .column-offset-22{margin-left:157.1428571429%}.row-gutter-14 .column-span-23{width:164.2857142857%}.row-gutter-14 .column-offset-23{margin-left:164.2857142857%}.row-gutter-14 .column-span-24{width:171.4285714286%}.row-gutter-14 .column-offset-24{margin-left:171.4285714286%}.row-gutter-15{padding:12px 6px}.row-gutter-15 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-15 .column-span-1{width:6.6666666667%}.row-gutter-15 .column-offset-1{margin-left:6.6666666667%}.row-gutter-15 .column-span-2{width:13.3333333333%}.row-gutter-15 .column-offset-2{margin-left:13.3333333333%}.row-gutter-15 .column-span-3{width:20%}.row-gutter-15 .column-offset-3{margin-left:20%}.row-gutter-15 .column-span-4{width:26.6666666667%}.row-gutter-15 .column-offset-4{margin-left:26.6666666667%}.row-gutter-15 .column-span-5{width:33.3333333333%}.row-gutter-15 .column-offset-5{margin-left:33.3333333333%}.row-gutter-15 .column-span-6{width:40%}.row-gutter-15 .column-offset-6{margin-left:40%}.row-gutter-15 .column-span-7{width:46.6666666667%}.row-gutter-15 .column-offset-7{margin-left:46.6666666667%}.row-gutter-15 .column-span-8{width:53.3333333333%}.row-gutter-15 .column-offset-8{margin-left:53.3333333333%}.row-gutter-15 .column-span-9{width:60%}.row-gutter-15 .column-offset-9{margin-left:60%}.row-gutter-15 .column-span-10{width:66.6666666667%}.row-gutter-15 .column-offset-10{margin-left:66.6666666667%}.row-gutter-15 .column-span-11{width:73.3333333333%}.row-gutter-15 .column-offset-11{margin-left:73.3333333333%}.row-gutter-15 .column-span-12{width:80%}.row-gutter-15 .column-offset-12{margin-left:80%}.row-gutter-15 .column-span-13{width:86.6666666667%}.row-gutter-15 .column-offset-13{margin-left:86.6666666667%}.row-gutter-15 .column-span-14{width:93.3333333333%}.row-gutter-15 .column-offset-14{margin-left:93.3333333333%}.row-gutter-15 .column-span-15{width:100%}.row-gutter-15 .column-offset-15{margin-left:100%}.row-gutter-15 .column-span-16{width:106.6666666667%}.row-gutter-15 .column-offset-16{margin-left:106.6666666667%}.row-gutter-15 .column-span-17{width:113.3333333333%}.row-gutter-15 .column-offset-17{margin-left:113.3333333333%}.row-gutter-15 .column-span-18{width:120%}.row-gutter-15 .column-offset-18{margin-left:120%}.row-gutter-15 .column-span-19{width:126.6666666667%}.row-gutter-15 .column-offset-19{margin-left:126.6666666667%}.row-gutter-15 .column-span-20{width:133.3333333333%}.row-gutter-15 .column-offset-20{margin-left:133.3333333333%}.row-gutter-15 .column-span-21{width:140%}.row-gutter-15 .column-offset-21{margin-left:140%}.row-gutter-15 .column-span-22{width:146.6666666667%}.row-gutter-15 .column-offset-22{margin-left:146.6666666667%}.row-gutter-15 .column-span-23{width:153.3333333333%}.row-gutter-15 .column-offset-23{margin-left:153.3333333333%}.row-gutter-15 .column-span-24{width:160%}.row-gutter-15 .column-offset-24{margin-left:160%}.row-gutter-16{padding:12px 6px}.row-gutter-16 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-16 .column-span-1{width:6.25%}.row-gutter-16 .column-offset-1{margin-left:6.25%}.row-gutter-16 .column-span-2{width:12.5%}.row-gutter-16 .column-offset-2{margin-left:12.5%}.row-gutter-16 .column-span-3{width:18.75%}.row-gutter-16 .column-offset-3{margin-left:18.75%}.row-gutter-16 .column-span-4{width:25%}.row-gutter-16 .column-offset-4{margin-left:25%}.row-gutter-16 .column-span-5{width:31.25%}.row-gutter-16 .column-offset-5{margin-left:31.25%}.row-gutter-16 .column-span-6{width:37.5%}.row-gutter-16 .column-offset-6{margin-left:37.5%}.row-gutter-16 .column-span-7{width:43.75%}.row-gutter-16 .column-offset-7{margin-left:43.75%}.row-gutter-16 .column-span-8{width:50%}.row-gutter-16 .column-offset-8{margin-left:50%}.row-gutter-16 .column-span-9{width:56.25%}.row-gutter-16 .column-offset-9{margin-left:56.25%}.row-gutter-16 .column-span-10{width:62.5%}.row-gutter-16 .column-offset-10{margin-left:62.5%}.row-gutter-16 .column-span-11{width:68.75%}.row-gutter-16 .column-offset-11{margin-left:68.75%}.row-gutter-16 .column-span-12{width:75%}.row-gutter-16 .column-offset-12{margin-left:75%}.row-gutter-16 .column-span-13{width:81.25%}.row-gutter-16 .column-offset-13{margin-left:81.25%}.row-gutter-16 .column-span-14{width:87.5%}.row-gutter-16 .column-offset-14{margin-left:87.5%}.row-gutter-16 .column-span-15{width:93.75%}.row-gutter-16 .column-offset-15{margin-left:93.75%}.row-gutter-16 .column-span-16{width:100%}.row-gutter-16 .column-offset-16{margin-left:100%}.row-gutter-16 .column-span-17{width:106.25%}.row-gutter-16 .column-offset-17{margin-left:106.25%}.row-gutter-16 .column-span-18{width:112.5%}.row-gutter-16 .column-offset-18{margin-left:112.5%}.row-gutter-16 .column-span-19{width:118.75%}.row-gutter-16 .column-offset-19{margin-left:118.75%}.row-gutter-16 .column-span-20{width:125%}.row-gutter-16 .column-offset-20{margin-left:125%}.row-gutter-16 .column-span-21{width:131.25%}.row-gutter-16 .column-offset-21{margin-left:131.25%}.row-gutter-16 .column-span-22{width:137.5%}.row-gutter-16 .column-offset-22{margin-left:137.5%}.row-gutter-16 .column-span-23{width:143.75%}.row-gutter-16 .column-offset-23{margin-left:143.75%}.row-gutter-16 .column-span-24{width:150%}.row-gutter-16 .column-offset-24{margin-left:150%}.row-gutter-17{padding:12px 6px}.row-gutter-17 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-17 .column-span-1{width:5.8823529412%}.row-gutter-17 .column-offset-1{margin-left:5.8823529412%}.row-gutter-17 .column-span-2{width:11.7647058824%}.row-gutter-17 .column-offset-2{margin-left:11.7647058824%}.row-gutter-17 .column-span-3{width:17.6470588235%}.row-gutter-17 .column-offset-3{margin-left:17.6470588235%}.row-gutter-17 .column-span-4{width:23.5294117647%}.row-gutter-17 .column-offset-4{margin-left:23.5294117647%}.row-gutter-17 .column-span-5{width:29.4117647059%}.row-gutter-17 .column-offset-5{margin-left:29.4117647059%}.row-gutter-17 .column-span-6{width:35.2941176471%}.row-gutter-17 .column-offset-6{margin-left:35.2941176471%}.row-gutter-17 .column-span-7{width:41.1764705882%}.row-gutter-17 .column-offset-7{margin-left:41.1764705882%}.row-gutter-17 .column-span-8{width:47.0588235294%}.row-gutter-17 .column-offset-8{margin-left:47.0588235294%}.row-gutter-17 .column-span-9{width:52.9411764706%}.row-gutter-17 .column-offset-9{margin-left:52.9411764706%}.row-gutter-17 .column-span-10{width:58.8235294118%}.row-gutter-17 .column-offset-10{margin-left:58.8235294118%}.row-gutter-17 .column-span-11{width:64.7058823529%}.row-gutter-17 .column-offset-11{margin-left:64.7058823529%}.row-gutter-17 .column-span-12{width:70.5882352941%}.row-gutter-17 .column-offset-12{margin-left:70.5882352941%}.row-gutter-17 .column-span-13{width:76.4705882353%}.row-gutter-17 .column-offset-13{margin-left:76.4705882353%}.row-gutter-17 .column-span-14{width:82.3529411765%}.row-gutter-17 .column-offset-14{margin-left:82.3529411765%}.row-gutter-17 .column-span-15{width:88.2352941176%}.row-gutter-17 .column-offset-15{margin-left:88.2352941176%}.row-gutter-17 .column-span-16{width:94.1176470588%}.row-gutter-17 .column-offset-16{margin-left:94.1176470588%}.row-gutter-17 .column-span-17{width:100%}.row-gutter-17 .column-offset-17{margin-left:100%}.row-gutter-17 .column-span-18{width:105.8823529412%}.row-gutter-17 .column-offset-18{margin-left:105.8823529412%}.row-gutter-17 .column-span-19{width:111.7647058824%}.row-gutter-17 .column-offset-19{margin-left:111.7647058824%}.row-gutter-17 .column-span-20{width:117.6470588235%}.row-gutter-17 .column-offset-20{margin-left:117.6470588235%}.row-gutter-17 .column-span-21{width:123.5294117647%}.row-gutter-17 .column-offset-21{margin-left:123.5294117647%}.row-gutter-17 .column-span-22{width:129.4117647059%}.row-gutter-17 .column-offset-22{margin-left:129.4117647059%}.row-gutter-17 .column-span-23{width:135.2941176471%}.row-gutter-17 .column-offset-23{margin-left:135.2941176471%}.row-gutter-17 .column-span-24{width:141.1764705882%}.row-gutter-17 .column-offset-24{margin-left:141.1764705882%}.row-gutter-18{padding:12px 6px}.row-gutter-18 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-18 .column-span-1{width:5.5555555556%}.row-gutter-18 .column-offset-1{margin-left:5.5555555556%}.row-gutter-18 .column-span-2{width:11.1111111111%}.row-gutter-18 .column-offset-2{margin-left:11.1111111111%}.row-gutter-18 .column-span-3{width:16.6666666667%}.row-gutter-18 .column-offset-3{margin-left:16.6666666667%}.row-gutter-18 .column-span-4{width:22.2222222222%}.row-gutter-18 .column-offset-4{margin-left:22.2222222222%}.row-gutter-18 .column-span-5{width:27.7777777778%}.row-gutter-18 .column-offset-5{margin-left:27.7777777778%}.row-gutter-18 .column-span-6{width:33.3333333333%}.row-gutter-18 .column-offset-6{margin-left:33.3333333333%}.row-gutter-18 .column-span-7{width:38.8888888889%}.row-gutter-18 .column-offset-7{margin-left:38.8888888889%}.row-gutter-18 .column-span-8{width:44.4444444444%}.row-gutter-18 .column-offset-8{margin-left:44.4444444444%}.row-gutter-18 .column-span-9{width:50%}.row-gutter-18 .column-offset-9{margin-left:50%}.row-gutter-18 .column-span-10{width:55.5555555556%}.row-gutter-18 .column-offset-10{margin-left:55.5555555556%}.row-gutter-18 .column-span-11{width:61.1111111111%}.row-gutter-18 .column-offset-11{margin-left:61.1111111111%}.row-gutter-18 .column-span-12{width:66.6666666667%}.row-gutter-18 .column-offset-12{margin-left:66.6666666667%}.row-gutter-18 .column-span-13{width:72.2222222222%}.row-gutter-18 .column-offset-13{margin-left:72.2222222222%}.row-gutter-18 .column-span-14{width:77.7777777778%}.row-gutter-18 .column-offset-14{margin-left:77.7777777778%}.row-gutter-18 .column-span-15{width:83.3333333333%}.row-gutter-18 .column-offset-15{margin-left:83.3333333333%}.row-gutter-18 .column-span-16{width:88.8888888889%}.row-gutter-18 .column-offset-16{margin-left:88.8888888889%}.row-gutter-18 .column-span-17{width:94.4444444444%}.row-gutter-18 .column-offset-17{margin-left:94.4444444444%}.row-gutter-18 .column-span-18{width:100%}.row-gutter-18 .column-offset-18{margin-left:100%}.row-gutter-18 .column-span-19{width:105.5555555556%}.row-gutter-18 .column-offset-19{margin-left:105.5555555556%}.row-gutter-18 .column-span-20{width:111.1111111111%}.row-gutter-18 .column-offset-20{margin-left:111.1111111111%}.row-gutter-18 .column-span-21{width:116.6666666667%}.row-gutter-18 .column-offset-21{margin-left:116.6666666667%}.row-gutter-18 .column-span-22{width:122.2222222222%}.row-gutter-18 .column-offset-22{margin-left:122.2222222222%}.row-gutter-18 .column-span-23{width:127.7777777778%}.row-gutter-18 .column-offset-23{margin-left:127.7777777778%}.row-gutter-18 .column-span-24{width:133.3333333333%}.row-gutter-18 .column-offset-24{margin-left:133.3333333333%}.row-gutter-19{padding:12px 6px}.row-gutter-19 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-19 .column-span-1{width:5.2631578947%}.row-gutter-19 .column-offset-1{margin-left:5.2631578947%}.row-gutter-19 .column-span-2{width:10.5263157895%}.row-gutter-19 .column-offset-2{margin-left:10.5263157895%}.row-gutter-19 .column-span-3{width:15.7894736842%}.row-gutter-19 .column-offset-3{margin-left:15.7894736842%}.row-gutter-19 .column-span-4{width:21.0526315789%}.row-gutter-19 .column-offset-4{margin-left:21.0526315789%}.row-gutter-19 .column-span-5{width:26.3157894737%}.row-gutter-19 .column-offset-5{margin-left:26.3157894737%}.row-gutter-19 .column-span-6{width:31.5789473684%}.row-gutter-19 .column-offset-6{margin-left:31.5789473684%}.row-gutter-19 .column-span-7{width:36.8421052632%}.row-gutter-19 .column-offset-7{margin-left:36.8421052632%}.row-gutter-19 .column-span-8{width:42.1052631579%}.row-gutter-19 .column-offset-8{margin-left:42.1052631579%}.row-gutter-19 .column-span-9{width:47.3684210526%}.row-gutter-19 .column-offset-9{margin-left:47.3684210526%}.row-gutter-19 .column-span-10{width:52.6315789474%}.row-gutter-19 .column-offset-10{margin-left:52.6315789474%}.row-gutter-19 .column-span-11{width:57.8947368421%}.row-gutter-19 .column-offset-11{margin-left:57.8947368421%}.row-gutter-19 .column-span-12{width:63.1578947368%}.row-gutter-19 .column-offset-12{margin-left:63.1578947368%}.row-gutter-19 .column-span-13{width:68.4210526316%}.row-gutter-19 .column-offset-13{margin-left:68.4210526316%}.row-gutter-19 .column-span-14{width:73.6842105263%}.row-gutter-19 .column-offset-14{margin-left:73.6842105263%}.row-gutter-19 .column-span-15{width:78.9473684211%}.row-gutter-19 .column-offset-15{margin-left:78.9473684211%}.row-gutter-19 .column-span-16{width:84.2105263158%}.row-gutter-19 .column-offset-16{margin-left:84.2105263158%}.row-gutter-19 .column-span-17{width:89.4736842105%}.row-gutter-19 .column-offset-17{margin-left:89.4736842105%}.row-gutter-19 .column-span-18{width:94.7368421053%}.row-gutter-19 .column-offset-18{margin-left:94.7368421053%}.row-gutter-19 .column-span-19{width:100%}.row-gutter-19 .column-offset-19{margin-left:100%}.row-gutter-19 .column-span-20{width:105.2631578947%}.row-gutter-19 .column-offset-20{margin-left:105.2631578947%}.row-gutter-19 .column-span-21{width:110.5263157895%}.row-gutter-19 .column-offset-21{margin-left:110.5263157895%}.row-gutter-19 .column-span-22{width:115.7894736842%}.row-gutter-19 .column-offset-22{margin-left:115.7894736842%}.row-gutter-19 .column-span-23{width:121.0526315789%}.row-gutter-19 .column-offset-23{margin-left:121.0526315789%}.row-gutter-19 .column-span-24{width:126.3157894737%}.row-gutter-19 .column-offset-24{margin-left:126.3157894737%}.row-gutter-20{padding:12px 6px}.row-gutter-20 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-20 .column-span-1{width:5%}.row-gutter-20 .column-offset-1{margin-left:5%}.row-gutter-20 .column-span-2{width:10%}.row-gutter-20 .column-offset-2{margin-left:10%}.row-gutter-20 .column-span-3{width:15%}.row-gutter-20 .column-offset-3{margin-left:15%}.row-gutter-20 .column-span-4{width:20%}.row-gutter-20 .column-offset-4{margin-left:20%}.row-gutter-20 .column-span-5{width:25%}.row-gutter-20 .column-offset-5{margin-left:25%}.row-gutter-20 .column-span-6{width:30%}.row-gutter-20 .column-offset-6{margin-left:30%}.row-gutter-20 .column-span-7{width:35%}.row-gutter-20 .column-offset-7{margin-left:35%}.row-gutter-20 .column-span-8{width:40%}.row-gutter-20 .column-offset-8{margin-left:40%}.row-gutter-20 .column-span-9{width:45%}.row-gutter-20 .column-offset-9{margin-left:45%}.row-gutter-20 .column-span-10{width:50%}.row-gutter-20 .column-offset-10{margin-left:50%}.row-gutter-20 .column-span-11{width:55%}.row-gutter-20 .column-offset-11{margin-left:55%}.row-gutter-20 .column-span-12{width:60%}.row-gutter-20 .column-offset-12{margin-left:60%}.row-gutter-20 .column-span-13{width:65%}.row-gutter-20 .column-offset-13{margin-left:65%}.row-gutter-20 .column-span-14{width:70%}.row-gutter-20 .column-offset-14{margin-left:70%}.row-gutter-20 .column-span-15{width:75%}.row-gutter-20 .column-offset-15{margin-left:75%}.row-gutter-20 .column-span-16{width:80%}.row-gutter-20 .column-offset-16{margin-left:80%}.row-gutter-20 .column-span-17{width:85%}.row-gutter-20 .column-offset-17{margin-left:85%}.row-gutter-20 .column-span-18{width:90%}.row-gutter-20 .column-offset-18{margin-left:90%}.row-gutter-20 .column-span-19{width:95%}.row-gutter-20 .column-offset-19{margin-left:95%}.row-gutter-20 .column-span-20{width:100%}.row-gutter-20 .column-offset-20{margin-left:100%}.row-gutter-20 .column-span-21{width:105%}.row-gutter-20 .column-offset-21{margin-left:105%}.row-gutter-20 .column-span-22{width:110%}.row-gutter-20 .column-offset-22{margin-left:110%}.row-gutter-20 .column-span-23{width:115%}.row-gutter-20 .column-offset-23{margin-left:115%}.row-gutter-20 .column-span-24{width:120%}.row-gutter-20 .column-offset-24{margin-left:120%}.row-gutter-21{padding:12px 6px}.row-gutter-21 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-21 .column-span-1{width:4.7619047619%}.row-gutter-21 .column-offset-1{margin-left:4.7619047619%}.row-gutter-21 .column-span-2{width:9.5238095238%}.row-gutter-21 .column-offset-2{margin-left:9.5238095238%}.row-gutter-21 .column-span-3{width:14.2857142857%}.row-gutter-21 .column-offset-3{margin-left:14.2857142857%}.row-gutter-21 .column-span-4{width:19.0476190476%}.row-gutter-21 .column-offset-4{margin-left:19.0476190476%}.row-gutter-21 .column-span-5{width:23.8095238095%}.row-gutter-21 .column-offset-5{margin-left:23.8095238095%}.row-gutter-21 .column-span-6{width:28.5714285714%}.row-gutter-21 .column-offset-6{margin-left:28.5714285714%}.row-gutter-21 .column-span-7{width:33.3333333333%}.row-gutter-21 .column-offset-7{margin-left:33.3333333333%}.row-gutter-21 .column-span-8{width:38.0952380952%}.row-gutter-21 .column-offset-8{margin-left:38.0952380952%}.row-gutter-21 .column-span-9{width:42.8571428571%}.row-gutter-21 .column-offset-9{margin-left:42.8571428571%}.row-gutter-21 .column-span-10{width:47.619047619%}.row-gutter-21 .column-offset-10{margin-left:47.619047619%}.row-gutter-21 .column-span-11{width:52.380952381%}.row-gutter-21 .column-offset-11{margin-left:52.380952381%}.row-gutter-21 .column-span-12{width:57.1428571429%}.row-gutter-21 .column-offset-12{margin-left:57.1428571429%}.row-gutter-21 .column-span-13{width:61.9047619048%}.row-gutter-21 .column-offset-13{margin-left:61.9047619048%}.row-gutter-21 .column-span-14{width:66.6666666667%}.row-gutter-21 .column-offset-14{margin-left:66.6666666667%}.row-gutter-21 .column-span-15{width:71.4285714286%}.row-gutter-21 .column-offset-15{margin-left:71.4285714286%}.row-gutter-21 .column-span-16{width:76.1904761905%}.row-gutter-21 .column-offset-16{margin-left:76.1904761905%}.row-gutter-21 .column-span-17{width:80.9523809524%}.row-gutter-21 .column-offset-17{margin-left:80.9523809524%}.row-gutter-21 .column-span-18{width:85.7142857143%}.row-gutter-21 .column-offset-18{margin-left:85.7142857143%}.row-gutter-21 .column-span-19{width:90.4761904762%}.row-gutter-21 .column-offset-19{margin-left:90.4761904762%}.row-gutter-21 .column-span-20{width:95.2380952381%}.row-gutter-21 .column-offset-20{margin-left:95.2380952381%}.row-gutter-21 .column-span-21{width:100%}.row-gutter-21 .column-offset-21{margin-left:100%}.row-gutter-21 .column-span-22{width:104.7619047619%}.row-gutter-21 .column-offset-22{margin-left:104.7619047619%}.row-gutter-21 .column-span-23{width:109.5238095238%}.row-gutter-21 .column-offset-23{margin-left:109.5238095238%}.row-gutter-21 .column-span-24{width:114.2857142857%}.row-gutter-21 .column-offset-24{margin-left:114.2857142857%}.row-gutter-22{padding:12px 6px}.row-gutter-22 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-22 .column-span-1{width:4.5454545455%}.row-gutter-22 .column-offset-1{margin-left:4.5454545455%}.row-gutter-22 .column-span-2{width:9.0909090909%}.row-gutter-22 .column-offset-2{margin-left:9.0909090909%}.row-gutter-22 .column-span-3{width:13.6363636364%}.row-gutter-22 .column-offset-3{margin-left:13.6363636364%}.row-gutter-22 .column-span-4{width:18.1818181818%}.row-gutter-22 .column-offset-4{margin-left:18.1818181818%}.row-gutter-22 .column-span-5{width:22.7272727273%}.row-gutter-22 .column-offset-5{margin-left:22.7272727273%}.row-gutter-22 .column-span-6{width:27.2727272727%}.row-gutter-22 .column-offset-6{margin-left:27.2727272727%}.row-gutter-22 .column-span-7{width:31.8181818182%}.row-gutter-22 .column-offset-7{margin-left:31.8181818182%}.row-gutter-22 .column-span-8{width:36.3636363636%}.row-gutter-22 .column-offset-8{margin-left:36.3636363636%}.row-gutter-22 .column-span-9{width:40.9090909091%}.row-gutter-22 .column-offset-9{margin-left:40.9090909091%}.row-gutter-22 .column-span-10{width:45.4545454545%}.row-gutter-22 .column-offset-10{margin-left:45.4545454545%}.row-gutter-22 .column-span-11{width:50%}.row-gutter-22 .column-offset-11{margin-left:50%}.row-gutter-22 .column-span-12{width:54.5454545455%}.row-gutter-22 .column-offset-12{margin-left:54.5454545455%}.row-gutter-22 .column-span-13{width:59.0909090909%}.row-gutter-22 .column-offset-13{margin-left:59.0909090909%}.row-gutter-22 .column-span-14{width:63.6363636364%}.row-gutter-22 .column-offset-14{margin-left:63.6363636364%}.row-gutter-22 .column-span-15{width:68.1818181818%}.row-gutter-22 .column-offset-15{margin-left:68.1818181818%}.row-gutter-22 .column-span-16{width:72.7272727273%}.row-gutter-22 .column-offset-16{margin-left:72.7272727273%}.row-gutter-22 .column-span-17{width:77.2727272727%}.row-gutter-22 .column-offset-17{margin-left:77.2727272727%}.row-gutter-22 .column-span-18{width:81.8181818182%}.row-gutter-22 .column-offset-18{margin-left:81.8181818182%}.row-gutter-22 .column-span-19{width:86.3636363636%}.row-gutter-22 .column-offset-19{margin-left:86.3636363636%}.row-gutter-22 .column-span-20{width:90.9090909091%}.row-gutter-22 .column-offset-20{margin-left:90.9090909091%}.row-gutter-22 .column-span-21{width:95.4545454545%}.row-gutter-22 .column-offset-21{margin-left:95.4545454545%}.row-gutter-22 .column-span-22{width:100%}.row-gutter-22 .column-offset-22{margin-left:100%}.row-gutter-22 .column-span-23{width:104.5454545455%}.row-gutter-22 .column-offset-23{margin-left:104.5454545455%}.row-gutter-22 .column-span-24{width:109.0909090909%}.row-gutter-22 .column-offset-24{margin-left:109.0909090909%}.row-gutter-23{padding:12px 6px}.row-gutter-23 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-23 .column-span-1{width:4.347826087%}.row-gutter-23 .column-offset-1{margin-left:4.347826087%}.row-gutter-23 .column-span-2{width:8.6956521739%}.row-gutter-23 .column-offset-2{margin-left:8.6956521739%}.row-gutter-23 .column-span-3{width:13.0434782609%}.row-gutter-23 .column-offset-3{margin-left:13.0434782609%}.row-gutter-23 .column-span-4{width:17.3913043478%}.row-gutter-23 .column-offset-4{margin-left:17.3913043478%}.row-gutter-23 .column-span-5{width:21.7391304348%}.row-gutter-23 .column-offset-5{margin-left:21.7391304348%}.row-gutter-23 .column-span-6{width:26.0869565217%}.row-gutter-23 .column-offset-6{margin-left:26.0869565217%}.row-gutter-23 .column-span-7{width:30.4347826087%}.row-gutter-23 .column-offset-7{margin-left:30.4347826087%}.row-gutter-23 .column-span-8{width:34.7826086957%}.row-gutter-23 .column-offset-8{margin-left:34.7826086957%}.row-gutter-23 .column-span-9{width:39.1304347826%}.row-gutter-23 .column-offset-9{margin-left:39.1304347826%}.row-gutter-23 .column-span-10{width:43.4782608696%}.row-gutter-23 .column-offset-10{margin-left:43.4782608696%}.row-gutter-23 .column-span-11{width:47.8260869565%}.row-gutter-23 .column-offset-11{margin-left:47.8260869565%}.row-gutter-23 .column-span-12{width:52.1739130435%}.row-gutter-23 .column-offset-12{margin-left:52.1739130435%}.row-gutter-23 .column-span-13{width:56.5217391304%}.row-gutter-23 .column-offset-13{margin-left:56.5217391304%}.row-gutter-23 .column-span-14{width:60.8695652174%}.row-gutter-23 .column-offset-14{margin-left:60.8695652174%}.row-gutter-23 .column-span-15{width:65.2173913043%}.row-gutter-23 .column-offset-15{margin-left:65.2173913043%}.row-gutter-23 .column-span-16{width:69.5652173913%}.row-gutter-23 .column-offset-16{margin-left:69.5652173913%}.row-gutter-23 .column-span-17{width:73.9130434783%}.row-gutter-23 .column-offset-17{margin-left:73.9130434783%}.row-gutter-23 .column-span-18{width:78.2608695652%}.row-gutter-23 .column-offset-18{margin-left:78.2608695652%}.row-gutter-23 .column-span-19{width:82.6086956522%}.row-gutter-23 .column-offset-19{margin-left:82.6086956522%}.row-gutter-23 .column-span-20{width:86.9565217391%}.row-gutter-23 .column-offset-20{margin-left:86.9565217391%}.row-gutter-23 .column-span-21{width:91.3043478261%}.row-gutter-23 .column-offset-21{margin-left:91.3043478261%}.row-gutter-23 .column-span-22{width:95.652173913%}.row-gutter-23 .column-offset-22{margin-left:95.652173913%}.row-gutter-23 .column-span-23{width:100%}.row-gutter-23 .column-offset-23{margin-left:100%}.row-gutter-23 .column-span-24{width:104.347826087%}.row-gutter-23 .column-offset-24{margin-left:104.347826087%}.row-gutter-24{padding:12px 6px}.row-gutter-24 .column{padding:0 6px;display:flex;flex-shrink:0}.row-gutter-24 .column-span-1{width:4.1666666667%}.row-gutter-24 .column-offset-1{margin-left:4.1666666667%}.row-gutter-24 .column-span-2{width:8.3333333333%}.row-gutter-24 .column-offset-2{margin-left:8.3333333333%}.row-gutter-24 .column-span-3{width:12.5%}.row-gutter-24 .column-offset-3{margin-left:12.5%}.row-gutter-24 .column-span-4{width:16.6666666667%}.row-gutter-24 .column-offset-4{margin-left:16.6666666667%}.row-gutter-24 .column-span-5{width:20.8333333333%}.row-gutter-24 .column-offset-5{margin-left:20.8333333333%}.row-gutter-24 .column-span-6{width:25%}.row-gutter-24 .column-offset-6{margin-left:25%}.row-gutter-24 .column-span-7{width:29.1666666667%}.row-gutter-24 .column-offset-7{margin-left:29.1666666667%}.row-gutter-24 .column-span-8{width:33.3333333333%}.row-gutter-24 .column-offset-8{margin-left:33.3333333333%}.row-gutter-24 .column-span-9{width:37.5%}.row-gutter-24 .column-offset-9{margin-left:37.5%}.row-gutter-24 .column-span-10{width:41.6666666667%}.row-gutter-24 .column-offset-10{margin-left:41.6666666667%}.row-gutter-24 .column-span-11{width:45.8333333333%}.row-gutter-24 .column-offset-11{margin-left:45.8333333333%}.row-gutter-24 .column-span-12{width:50%}.row-gutter-24 .column-offset-12{margin-left:50%}.row-gutter-24 .column-span-13{width:54.1666666667%}.row-gutter-24 .column-offset-13{margin-left:54.1666666667%}.row-gutter-24 .column-span-14{width:58.3333333333%}.row-gutter-24 .column-offset-14{margin-left:58.3333333333%}.row-gutter-24 .column-span-15{width:62.5%}.row-gutter-24 .column-offset-15{margin-left:62.5%}.row-gutter-24 .column-span-16{width:66.6666666667%}.row-gutter-24 .column-offset-16{margin-left:66.6666666667%}.row-gutter-24 .column-span-17{width:70.8333333333%}.row-gutter-24 .column-offset-17{margin-left:70.8333333333%}.row-gutter-24 .column-span-18{width:75%}.row-gutter-24 .column-offset-18{margin-left:75%}.row-gutter-24 .column-span-19{width:79.1666666667%}.row-gutter-24 .column-offset-19{margin-left:79.1666666667%}.row-gutter-24 .column-span-20{width:83.3333333333%}.row-gutter-24 .column-offset-20{margin-left:83.3333333333%}.row-gutter-24 .column-span-21{width:87.5%}.row-gutter-24 .column-offset-21{margin-left:87.5%}.row-gutter-24 .column-span-22{width:91.6666666667%}.row-gutter-24 .column-offset-22{margin-left:91.6666666667%}.row-gutter-24 .column-span-23{width:95.8333333333%}.row-gutter-24 .column-offset-23{margin-left:95.8333333333%}.row-gutter-24 .column-span-24{width:100%}.row-gutter-24 .column-offset-24{margin-left:100%}.row-align-top{align-items:flex-start}.row-align-middle{align-items:center}.row-align-bottom{align-items:flex-end}.row-justify-start{justify-content:flex-start}.row-justify-end{justify-content:flex-end}.row-justify-center{justify-content:center}.row-justify-space-around{justify-content:space-around}.row-justify-space-between{justify-content:space-between}.button-select{display:flex;flex-direction:row}.button-select .button-select-options{height:30px;padding:0 15px;color:#54759a;font-size:12px;line-height:30px;background:#fff;border:1px solid #e4eaef;border-right:none;transition:all .3s ease;cursor:pointer;outline:0;display:block}.button-select .button-select-options:first-child{border-radius:3px 0 0 3px}.button-select .button-select-options:last-child{border-radius:0 3px 3px 0;border-right:1px solid #e4eaef}.button-select .button-select-options.actived{background:#57befc;color:#fff;border-color:#57befc;box-shadow:0 2px 5px rgba(87,190,252,.5)}.button-select .button-select-options.actived:active{box-shadow:none}.tags-container{display:flex;align-items:flex-start;overflow-y:hidden}.tags{flex:1;list-style:none;flex-wrap:wrap;box-sizing:content-box}.tags,.tags li{display:flex;align-items:center}.tags li{position:relative;justify-content:center;border:1px solid #2c8af8;color:#54759a;height:22px;border-radius:11px;padding:0 6px;margin:3px 4px;font-size:10px;cursor:default}.tags li.can-click{cursor:pointer}.tags li.error{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.tags li.tags-selected.error{background:linear-gradient(135deg,#2c8af8,#f56c6c);border:none;height:24px;padding:0 7px}.tags .tags-selected{background-color:#2c8af8;color:#fff}.tags-expand{height:30px;line-height:30px;padding:0 20px;user-select:none;cursor:pointer}.input{display:inline-block;height:30px;width:100%;padding:0 10px;font-size:14px;color:#54759a;border-radius:3px;border:1px solid #e4eaef;transition:all .3s;transition-property:border-color,color,box-shadow}.input:focus{outline:0;border-color:#57befc;color:#2c8af8;box-shadow:0 2px 5px rgba(87,190,252,.5)}.input-align-left{text-align:left}.input-align-center{text-align:center}.input-align-right{text-align:right}.input-inside:focus{box-shadow:none}.select{cursor:pointer;font-size:14px;line-height:30px;color:#54759a;display:flex;overflow:hidden}.select>i{margin-left:5px;color:#54759a}.select-list{position:absolute;max-width:170px;border-radius:4px;overflow:hidden;box-shadow:0 2px 5px rgba(183,197,214,.5);opacity:.8;pointer-events:none;transform:scaleY(0);transform-origin:top;transition:all .2s linear}.select-list .list{max-height:300px;overflow:auto;background:#fff;padding:5px 0;transform:scaleY(2);transform-origin:top;transition:all .2s linear}.select-list .list>.option{color:#54759a;padding:10px 15px;font-size:14px;list-style:none;cursor:pointer}.select-list .list>.option:hover,.select-list .list>.selected{background:rgba(228,234,239,.5)}.select-list-show{opacity:1;pointer-events:visible}.select-list-show,.select-list-show .list{transform:scaleY(1)}.modal-mask{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.15);opacity:0;pointer-events:none;transition:all .5s ease;display:flex;justify-content:center;align-items:center;z-index:9999}.modal-mask .modal{margin-top:-50px;padding:20px 30px;background:#fff;box-shadow:0 2px 16px rgba(84,117,154,.2);border-radius:4px;display:flex;flex-direction:column;transform:scale(0);transition:all .3s cubic-bezier(.32,.26,.71,1.29)}.modal-mask .modal .modal-title{margin:5px 0;width:100%;display:flex;align-items:center;justify-content:space-between;font-weight:700;font-size:18px;color:#2c8af8;text-shadow:0 2px 6px rgba(44,138,248,.4)}.modal-mask .modal .modal-body{margin:10px 0;font-size:14px;color:#54759a}.modal-mask .modal .footer{width:100%;margin:5px 0;display:flex;align-items:center;justify-content:flex-end}.modal-mask .modal .footer .button{margin-left:10px}.modal-mask .modal-small{width:400px}.modal-mask .modal-big{width:600px}.modal-show{opacity:1;pointer-events:visible}.modal-show .modal{transform:scale(1)}@media(max-width:768px){.modal-mask .modal{margin-top:0;padding:18px 20px}.modal-mask .modal-small{width:280px}.modal-mask .modal-big{width:480px}}.alert{padding:15px;border-radius:4px;box-shadow:0 2px 8px rgba(44,138,248,.3);font-size:13px;line-height:1.6;text-align:justify}.alert,.alert .alert-icon{background:#fff;display:flex}.alert .alert-icon{margin-right:10px;width:20px;height:20px;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center}.alert .alert-icon>i{transform:scale(.5);font-weight:700}.alert .alert-message{width:100%;color:#fff}.alert-box-success{background:linear-gradient(135deg,#5dae34,#67c23a);box-shadow:0 2px 8px rgba(93,174,52,.3)}.alert-box-success .alert-icon>i{color:#67c23a}.alert-box-info{background:linear-gradient(135deg,#3eb4fc,#57befc);box-shadow:0 2px 8px rgba(62,180,252,.3)}.alert-box-info .alert-icon>i{color:#57befc}.alert-box-warning{background:linear-gradient(135deg,#e39725,#e6a23c);box-shadow:0 2px 8px rgba(227,151,37,.3)}.alert-box-warning .alert-icon>i{color:#e6a23c}.alert-box-error{background:linear-gradient(135deg,#f35454,#f56c6c);box-shadow:0 2px 8px rgba(243,84,84,.3)}.alert-box-error .alert-icon>i{color:#f56c6c}.alert-note-success{background:rgba(103,194,58,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #67c23a;box-shadow:0 2px 8px rgba(93,174,52,.3)}.alert-note-success .alert-icon{background:#67c23a}.alert-note-success .alert-icon>i{color:#fff}.alert-note-success .alert-message{color:#3d7323}.alert-note-info{background:rgba(87,190,252,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #57befc;box-shadow:0 2px 8px rgba(62,180,252,.3)}.alert-note-info .alert-icon{background:#57befc}.alert-note-info .alert-icon>i{color:#fff}.alert-note-info .alert-message{color:#0493e9}.alert-note-warning{background:rgba(230,162,60,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #e6a23c;box-shadow:0 2px 8px rgba(227,151,37,.3)}.alert-note-warning .alert-icon{background:#e6a23c}.alert-note-warning .alert-icon>i{color:#fff}.alert-note-warning .alert-message{color:#a76d15}.alert-note-error{background:rgba(245,108,108,.05);border-radius:1px 4px 4px 1px;border-left:2px solid #f56c6c;box-shadow:0 2px 8px rgba(243,84,84,.3)}.alert-note-error .alert-icon{background:#f56c6c}.alert-note-error .alert-icon>i{color:#fff}.alert-note-error .alert-message{color:#eb1010}.button{outline:0;padding:0 15px;height:32px;line-height:32px;border-radius:16px;font-size:14px;cursor:pointer;transition:all .15s ease}.button-primary{color:#fff;border:none;background:linear-gradient(135deg,#57befc,#2c8af8);box-shadow:0 2px 8px rgba(44,138,248,.5)}.button-primary:hover{border:none}.button-primary:active{box-shadow:0 0 2px rgba(44,138,248,.5)}.button-normal{color:#909399;background:#fff;border:1px solid rgba(0,0,0,.1)}.button-normal:hover{border-color:#b7c5d6;color:#54759a}.button-normal:active{background:#fafafa;color:#54759a}.button-danger{color:#fff;border:none;background:linear-gradient(135deg,#f56c6c,#f23c3c);box-shadow:0 2px 8px rgba(242,60,60,.5)}.button-danger:hover{border:none}.button-danger:active{box-shadow:0 0 2px rgba(242,60,60,.5)}.button-success{color:#fff;border:none;background:linear-gradient(135deg,#67c23a,#5dae34);box-shadow:0 2px 8px rgba(93,174,52,.5)}.button-success:hover{border:none}.button-success:active{box-shadow:0 0 2px rgba(93,174,52,.5)}.button-warning{color:#fff;border:none;background:linear-gradient(135deg,#e6a23c,#e39725);box-shadow:0 2px 8px rgba(227,151,37,.5)}.button-warning:hover{border:none}.button-warning:active{box-shadow:0 0 2px rgba(227,151,37,.5)}.message{position:fixed;top:20px;right:20px;border-radius:4px;opacity:0;background:#fff;display:flex;box-shadow:0 0 20px rgba(44,138,248,.2);transition:all .2s ease;transform:translateX(100%)}.message .message-icon{width:36px;flex:1;border-radius:4px 0 0 4px;display:flex;justify-content:center;align-items:center}.message .message-icon>i{color:#fff}.message .message-content{padding:10px 15px;font-size:13px;color:#54759a}.message-info .message-icon{background:linear-gradient(135deg,#57befc,#2c8af8)}.message-success .message-icon{background:linear-gradient(135deg,#67c23a,#5dae34)}.message-warning .message-icon{background:linear-gradient(135deg,#e6a23c,#e39725)}.message-error .message-icon{background:linear-gradient(135deg,#f56c6c,#f23c3c)}.message-show{opacity:1;transition:all .2s ease;transform:translateX(0)}.checkbox{display:flex;position:relative;padding-left:26px;cursor:pointer;line-height:18px}.checkbox:before{content:"";display:inline-block;position:absolute;left:0;top:50%;width:18px;height:18px;border-radius:3px;transition:background-color .3s ease;transform:translateY(-9px);background-color:#fff;border:1px solid #e4eaef}.checkbox.checked:before{background-color:#57befc}.checkbox-icon{position:absolute;left:0;top:50%;color:#fff;line-height:18px;transform:translateY(-9px) scale(.6);text-shadow:none;font-weight:700}.tag{display:flex;align-items:center;justify-content:center;height:24px;font-size:12px;padding:0 12px;text-align:center;background-color:#fff;border:2px solid #2c8af8;color:#2c8af8;border-radius:12px}.spinner{position:relative;width:80px;height:80px;border-radius:100%;animation:spinner 5s linear infinite}.spinner-circle{position:absolute;width:100%;height:100%;transform-origin:48% 48%}.spinner-inner{width:100%;height:100%;border-radius:100%;border:5px solid rgba(44,138,248,.7);border-top:none;border-right:none;background-clip:padding-box;box-shadow:inset 0 0 10px rgba(44,138,248,.15)}@keyframes spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spinner-circle:nth-of-type(0){transform:rotate(0deg)}.spinner-circle:nth-of-type(0) .spinner-inner{animation:spinner 2s linear infinite}.spinner-circle:first-of-type{transform:rotate(70deg)}.spinner-circle:first-of-type .spinner-inner{animation:spinner 2s linear infinite}.spinner-circle:nth-of-type(2){transform:rotate(140deg)}.spinner-circle:nth-of-type(2) .spinner-inner{animation:spinner 2s linear infinite}.loading{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0;bottom:0;right:0;background-color:hsla(0,0%,100%,.9);box-shadow:inset 0 0 80px rgba(0,0,0,.1);z-index:1000}.proxy-item{position:relative;width:100%;height:110px;padding:10px;border-radius:4px;background:#fff;user-select:none;cursor:default;box-shadow:2px 5px 20px -3px rgba(44,138,248,.2);transition:all .3s ease}.proxy-item .proxy-type{padding:2px 5px;font-size:10px;color:#fff;border-radius:2px}.proxy-item .proxy-name{display:-webkit-box;margin-top:10px;color:#54759a;font-size:10px;overflow:hidden;word-break:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical}.proxy-item .proxy-delay{position:absolute;left:10px;bottom:13px;font-size:10px;color:rgba(84,117,154,.8)}.proxy-item .proxy-editor{position:absolute;right:10px;bottom:10px;cursor:pointer;color:rgba(84,117,154,.8);opacity:0;pointer-events:none;transition:all .3s ease}.proxy-item:hover{box-shadow:0 14px 20px -4px rgba(84,117,154,.4)}.proxy-item:hover .proxy-editor{opacity:1;pointer-events:visible}.proxy-error{opacity:.5}.proxy-error .proxy-type{background-color:#909399}@media(max-width:768px){.proxy-item{height:70px}.proxy-item .proxy-delay{left:unset;bottom:unset;top:0;right:20px;height:70px;line-height:70px}}.proxy-group{display:flex;align-items:flex-start;font-size:14px;color:#546b87}.proxy-group-part{display:flex;align-items:center;height:60px}.proxy-group-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 20px;width:120px;height:18px}.proxies-group-card{padding:0}.proxies-group-item{border-bottom:1px solid #d8dee2}.proxies-group-item:last-child{border-bottom:none}.proxy-group-tags-container{padding:15px 0}.proxy-group-tags{flex:1;margin-left:30px}@media(max-width:768px){.proxy-group{flex-direction:column}.proxy-group-name{width:140px}.proxy-group-part{width:100%;height:42px;margin-top:6px;justify-content:space-between}.proxy-group-type{margin-right:20px}.proxy-group-tags-container{padding:5px 0 10px}.proxy-group-tags{margin-left:20px}}.proxy-provider{position:relative;display:flex;flex-direction:column;font-size:16px;padding:20px;color:#546b87}.proxy-provider-header{justify-content:space-between}.proxy-provider-header,.proxy-provider-header-part{display:flex;align-items:center}.proxy-provider-name{margin-right:24px}.proxy-provider-proxies{list-style:none}.proxy-provider-item{box-shadow:0 0 24px 0 rgba(44,138,248,.2)}.proxy-provider-item:hover{box-shadow:0 0 24px 0 rgba(84,117,154,.4)}.proxy-provider-update{line-height:14px;font-size:14px}.proxy-provider-icon{margin-left:20px;cursor:pointer}.proxy-provider-icon.healthcheck{color:#f56c6c}@media(max-width:768px){.proxy-provider-header{flex-direction:column;align-items:flex-start}.proxy-provider-header-part{margin:6px 0}}.proxies-list{--item-width:calc(100%/(var(--columns) + 1));--gap:calc(var(--item-width)/var(--columns));display:flex;margin-right:calc(var(--gap)*-1);margin-top:20px;flex-wrap:wrap;align-content:flex-start;list-style:none}@media(min-width:2001px){.proxies-list{--columns:12}}@media(max-width:2000px){.proxies-list{--columns:10}}@media(max-width:1600px){.proxies-list{--columns:8}}@media(max-width:1340px){.proxies-list{--columns:7}}@media(max-width:960px){.proxies-list{--columns:6}}@media(max-width:860px){.proxies-list{--columns:5}}@media(max-width:760px){.proxies-list{--columns:3}}.proxies-list>li{display:inline-block;width:var(--item-width);margin-right:var(--gap);flex-shrink:0;margin-bottom:10px}.proxies-group-list{list-style:none}.proxies-group-card{margin:20px 0}.proxies-container .proxies-action-icon{margin-left:10px}.proxies-speed-test{line-height:32px;margin:0 2px 0 6px;color:#2c8af8;text-shadow:0 2px 6px rgba(44,138,248,.4);cursor:pointer}.proxies-providers-item{margin:20px 0}.proxies-providers-list{list-style:none}@media(max-width:768px){.proxies-group-card{margin:12px 0}.proxies-list{margin-right:0;padding-bottom:20px;flex-wrap:unset;flex-direction:column}.proxies-list>li{width:100%;margin-right:0;margin-bottom:10px}}.logs-card{display:flex;flex-direction:column;flex:1;margin-top:10px}.logs-panel{display:flex;flex-direction:column;flex-grow:1;flex-basis:0;list-style:none;padding:10px;border-radius:2px;background-color:#f3f6f9;font-size:12px;color:#73808f;overflow-y:auto;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.logs-panel li{line-height:20px;display:inline-block}.logs-panel-time{margin-right:10px;color:#adb7c3}.rule-provider{position:relative;display:flex;flex-direction:column;font-size:16px;padding:20px;color:#546b87}.rule-provider-header{justify-content:space-between}.rule-provider-header,.rule-provider-header-part{display:flex;align-items:center}.rule-provider-name{width:120px;margin-right:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rule-provider-behavior{width:80px;margin:0 20px 0 12px;background-color:#2c8af8;color:#fff}.rule-provider-spinner{transform:scale(.4)}.rule-provider-proxies{list-style:none}.rule-provider-item{box-shadow:0 0 24px 0 rgba(44,138,248,.2)}.rule-provider-item:hover{box-shadow:0 0 24px 0 rgba(84,117,154,.4)}.rule-provider-update{line-height:14px;font-size:14px}.rule-provider-icon{display:block;margin-left:20px;cursor:pointer}.rule-provider-icon.rule-provider-loading:before{color:#909399;cursor:not-allowed;animation:spinner 2s linear infinite}@media(max-width:768px){.rule-provider-header{flex-direction:column;align-items:flex-start}.rule-provider-header-part{margin:6px 0}}.rules-card{display:flex;flex-direction:column;flex:1;min-height:700px;margin-top:10px;padding:0}.rules-card:focus{outline:none}.rules-card .rules{flex:1 0 auto}.rule-item{line-height:30px;height:50px;overflow:hidden;list-style:none;user-select:none;border-bottom:1px solid rgba(228,234,239,.5)}.rule-item,.rule-item .rule-item-row{padding:5px 0}.rule-item .drag-handler{cursor:row-resize;margin:0 10px;display:flex;justify-content:center}.rule-item .drag-handler>i{font-weight:700;color:#b7c5d6}.rule-item .rule-type{font-size:14px;color:#54759a}.rule-item .rule-type>i{margin-left:5px;color:#54759a}.rule-item .payload{cursor:pointer}.rule-item .payload,.rule-item .rule-proxy{font-size:14px;color:#54759a}.rule-item .delete-btn{opacity:0;transition:all .3s ease}.rule-item .delete-btn span{font-size:14px;color:#f56c6c;cursor:pointer}.rule-item:last-child{border-bottom:none}.rule-item:hover .delete-btn{opacity:1}.rule-proxy-option{display:flex;align-items:center;overflow:hidden}.rule-proxy-option .label{margin-right:5px;height:20px;line-height:20px;padding:0 8px;font-size:10px;border-radius:10px;color:#fff;background:#b7c5d6}.rule-proxy-option .value{line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.settings-card{margin-top:10px;padding:20px 0}.settings-card .column{font-weight:700;align-items:center}.settings-card .value-column{justify-content:flex-end}.settings-card .label{font-size:14px;color:#54759a}.settings-card .external-controller{font-size:14px;color:#54759a;display:flex;justify-content:flex-end;font-weight:400;line-height:17px}.settings-card .external-controller .modify-btn{color:#2c8af8;cursor:pointer}.clash-version{position:relative;margin-top:10px;padding:20px 45px;display:flex}.clash-version .check-icon{width:24px;height:24px;border-radius:50%;background:linear-gradient(135deg,#57befc,#2c8af8);display:flex;justify-content:center;align-items:center}.clash-version .check-icon>i{transform:scale(.5);color:#fff;font-weight:700}.clash-version .version-info{margin-left:10px;font-size:14px;line-height:24px;color:#54759a}.clash-version .check-update-btn{position:absolute;right:45px;font-size:14px;line-height:24px;color:#b7c5d6;cursor:pointer;transition:all .15s ease}.clash-version .check-update-btn:hover{color:#54759a}@media(max-width:768px){.settings-card .row{flex-direction:column;padding-top:0;padding-bottom:0}.settings-card .row>.column{width:100%;margin:10px 0}}.sidebar{position:fixed;top:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;flex-shrink:0;width:160px;user-select:none}.sidebar-logo{margin-top:50px;width:60px;height:60px}.sidebar-menu{display:flex;flex-direction:column;flex:1;margin-top:12px}.sidebar-menu .item{display:block;margin-top:18px}.sidebar-menu .item>a{display:block;width:120px;height:36px;line-height:36px;font-size:14px;border-radius:18px;text-align:center}.sidebar-menu .item>a,.sidebar-menu .item a:active,.sidebar-menu .item a:visited{color:#909399;text-decoration:none}.sidebar-menu .item>a.active{background:linear-gradient(135deg,#57befc,#2c8af8);color:#fff;box-shadow:0 2px 8px rgba(44,138,248,.5)}.sidebar-version{display:flex;flex-direction:column;align-items:center;padding-bottom:20px}.sidebar-version-label{font-size:14px;color:#2c8af8;text-shadow:0 2px 6px rgba(44,138,248,.4)}.sidebar-version-text{text-align:center;font-size:14px;margin:8px 0;padding:0 10px;color:#54759a}@media(max-width:768px){.sidebar{width:100%;height:60px;flex-direction:row;background:#f4f5f6;z-index:10}.sidebar-logo{margin:0 15px;width:36px;height:36px}.sidebar-menu{flex:1;flex-direction:row;justify-content:center;margin-top:0;overflow-x:scroll;padding:10px}.sidebar-menu::-webkit-scrollbar{display:none}.sidebar-menu .item{margin:0 3px}.sidebar-menu .item>a{width:80px;height:32px;line-height:32px}.sidebar-menu .item.no-mobile,.sidebar-version{display:none}}.connections-devices{display:flex;padding:8px 2px}.connections-devices-item{padding:4px 0;margin-right:20px;font-size:14px;color:#909399;border-radius:3px;cursor:pointer;transition:color .3s ease}.connections-devices-item.selected{color:#2c8af8}.connections-card{display:flex;flex-direction:column;flex:1;margin-top:10px;padding:0;overflow:hidden}.connections-card .connections{display:flex;flex-direction:column;width:100%;flex-grow:1;flex-basis:0;overflow:auto}.connections-card .connections-body{flex:1 0 auto}.connections-card .connections-th{position:relative;text-align:center;color:#909399;background:#f3f6f9;height:30px;line-height:30px;font-weight:500;font-size:14px;cursor:pointer;user-select:none}.connections-card .connections-th.resizing .connections-resizer{opacity:1}.connections-card .connections-th.fixed{position:sticky!important;left:0;z-index:99;box-shadow:inset -9px 0 8px -14px #000}.connections-card .connections-resizer{position:absolute;opacity:0;right:-10px;top:8px;bottom:8px;width:20px;transition:opacity .3s ease;z-index:10;font-size:14px;font-weight:300;touch-action:none}.connections-card .connections-resizer:before{content:"";display:block;position:absolute;left:10px;transform:translateX(-2px);width:2px;height:100%;background-color:rgba(144,147,153,.6)}.connections-card .connections-header{position:sticky;top:0;z-index:9999;white-space:nowrap}.connections-card .connections-header:hover .connections-resizer{opacity:1}.connections-card .connetions-item{height:36px}.connections-card .connections-block{display:flex;align-items:center;font-size:14px;line-height:36px;padding:0 10px;color:#54759a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.connections-card .connections-block.center{text-align:center}.connections-card .connections-block.completed{background-color:#e9eef4;color:rgba(84,117,154,.5)}.connections-card .connections-block.fixed{position:sticky;left:0;z-index:999;background-color:#fff;box-shadow:inset -9px 0 8px -14px #000}.connections-filter{color:#2c8af8;font-size:14px;line-height:20px;margin-left:15px;text-shadow:0 0 6px rgba(44,138,248,.4);cursor:pointer}.connections-filter.dangerous{color:#f56c6c;text-shadow:0 0 6px rgba(87,190,252,.2)}.connections-filter.total{flex:1;cursor:unset}.external-controller .row{padding:0}.external-controller .alert{margin:10px 0}.external-controller .form,.external-controller .title{margin:15px 0}.external-controller .title{margin-top:15px;font-size:14px;font-weight:700}@media(max-width:768px){.external-controller .row{flex-direction:column;align-items:flex-start}.external-controller .form,.external-controller .title{margin:5px 0}.external-controller .column{width:100%}.external-controller .alert{display:none}} \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/js/main.b9320252.chunk.js b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/js/main.8e23a89d.chunk.js similarity index 93% rename from package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/js/main.b9320252.chunk.js rename to package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/js/main.8e23a89d.chunk.js index 75f2d87e27..22e4e64f92 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/js/main.b9320252.chunk.js +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/dashboard/static/js/main.8e23a89d.chunk.js @@ -1 +1 @@ -(this["webpackJsonpclash-dashboard"]=this["webpackJsonpclash-dashboard"]||[]).push([[0],{150:function(e,t,n){"use strict";n.r(t);var a=n(0),r=n.n(a),c=n(17),o=n(26),s=n(8),i=n(9),l=n(3),u=n.n(l),p=n(10),d=n(18);function m(){return"ClashX Runtime"===navigator.userAgent}var f=null,v=function(){function e(t){var n=this;Object(p.a)(this,e),this.instance=null,window.WebViewJavascriptBridge&&(this.instance=window.WebViewJavascriptBridge),this.initBridge((function(e){n.instance=e,t()}))}return Object(d.a)(e,[{key:"initBridge",value:function(e){if(!m())return null===e||void 0===e?void 0:e(null);if(window.WebViewJavascriptBridge)return e(window.WebViewJavascriptBridge);if(window.WVJBCallbacks)return window.WVJBCallbacks.push(e);window.WVJBCallbacks=[e];var t=document.createElement("iframe");t.style.display="none",t.src="https://__bridge_loaded__",document.documentElement.appendChild(t),setTimeout((function(){return document.documentElement.removeChild(t)}),0)}},{key:"callHandler",value:function(e,t){var n=this;return new Promise((function(a){var r;null===(r=n.instance)||void 0===r||r.callHandler(e,t,a)}))}},{key:"ping",value:function(){return this.callHandler("ping")}},{key:"readConfigString",value:function(){return this.callHandler("readConfigString")}},{key:"getPasteboard",value:function(){return this.callHandler("getPasteboard")}},{key:"getAPIInfo",value:function(){return this.callHandler("apiInfo")}},{key:"setPasteboard",value:function(e){return this.callHandler("setPasteboard",e)}},{key:"writeConfigWithString",value:function(e){return this.callHandler("writeConfigWithString",e)}},{key:"setSystemProxy",value:function(e){return this.callHandler("setSystemProxy",e)}},{key:"getStartAtLogin",value:function(){return this.callHandler("getStartAtLogin")}},{key:"getProxyDelay",value:function(e){return this.callHandler("speedTest",e)}},{key:"setStartAtLogin",value:function(e){return this.callHandler("setStartAtLogin",e)}},{key:"isSystemProxySet",value:function(){return this.callHandler("isSystemProxySet")}}]),e}();var h,b=n(21),y=n(36),g=n.n(y);!function(e){e.SPEED_NOTIFY="speed-notify"}(h||(h={}));var x=new(function(){function e(){Object(p.a)(this,e),this.EE=new g.a}return Object(d.a)(e,[{key:"notifySpeedTest",value:function(){this.EE.emit(h.SPEED_NOTIFY)}},{key:"subscribe",value:function(e,t){this.EE.addListener(e,t)}},{key:"unsubscribe",value:function(e,t){this.EE.removeListener(e,t)}}]),e}()),E=n(2),w=n(64),k=n(1),O=n.n(k),j=n(5),N=n(4);function C(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return window.localStorage.getItem(e)||t}function P(e,t){return window.localStorage.setItem(e,t)}function S(){}function T(e){return L.apply(this,arguments)}function L(){return(L=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,t;case 3:return n=e.sent,e.abrupt("return",[n,null]);case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",[null,e.t0]);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function R(e,t){var n,a=[],r=[],c=Object(j.a)(e);try{for(c.s();!(n=c.n()).done;){var o=n.value;t(o)?a.push(o):r.push(o)}}catch(s){c.e(s)}finally{c.f()}return[a,r]}function D(e){var t=Object(w.a)(e),n=Object(E.a)(t,2),r=n[0],c=n[1];return[r,Object(a.useMemo)((function(){return function(e,t){"string"===typeof e?c((function(n){var a=t;n[e]=a})):"function"===typeof e?c(e):"object"===typeof e&&c((function(t){for(var n=e,a=0,r=Object.keys(n);a0&&void 0!==arguments[0]&&arguments[0],t=Object(a.useState)(e),n=Object(E.a)(t,2),r=n[0],c=n[1];function o(){c(!1)}function s(){c(!0)}return{visible:r,hide:o,show:s}}function A(e){var t=e.title,n=e.children,r=e.className,c=e.style;return a.createElement("header",{className:u()("header",r),style:c},a.createElement("h1",null,t),a.createElement("div",{className:"operations"},n))}var B=n(6);function H(e){var t=e.type,n=e.size,r=void 0===n?14:n,c=e.className,o=e.style,s=u()("clash-iconfont","icon-".concat(t),c),i=Object(B.a)({fontSize:r},o),l=Object(B.a)(Object(B.a)({},e),{},{className:s,style:i});return a.createElement("i",l)}function M(e){var t=e.className,n=e.checked,r=void 0!==n&&n,c=e.disabled,o=void 0!==c&&c,s=e.onChange,i=void 0===s?S:s,l=u()("switch",{checked:r,disabled:o},t);return a.createElement("div",{className:l,onClick:function(){o||i(!r)}},a.createElement(H,{className:"switch-icon",type:"check",size:20,style:{fontWeight:"bold"}}))}function U(e){var t=e.className,n=e.style,r=e.children;return a.createElement("div",{className:u()("card",t),style:n},r)}function z(e){var t=e.gutter,n=void 0===t?24:t,r=e.align,c=void 0===r?"top":r,o=e.justify,s=void 0===o?"start":o,i=e.className,l=e.style,p=e.children;return a.createElement("div",{className:u()("row","row-gutter-".concat(n),"row-align-".concat(c),"row-justify-".concat(s),i),style:l},p)}function W(e){var t=e.offset,n=void 0===t?0:t,r=e.order,c=void 0===r?0:r,o=e.span,s=void 0===o?1:o,i=e.className,l=e.style,p=e.children,d=Object.assign({},{order:c},l);return a.createElement("div",{className:u()("column","column-offset-".concat(n),"column-span-".concat(s),i),style:d},p)}function F(e){var t=e.options,n=e.value,r=e.onSelect;return a.createElement("div",{className:"button-select"},t.map((function(e){return a.createElement("button",{value:e.value,key:e.value,className:u()("button-select-options",{actived:n===e.value}),onClick:function(){return null===r||void 0===r?void 0:r(e.value)}},e.label)})))}var _=n(65),G=n.n(_),J=n(19),V={en_US:{SideBar:{Proxies:"Proxies",Overview:"Overview",Logs:"Logs",Rules:"Rules",Settings:"Setting",Connections:"Connections",Version:"Version"},Settings:{title:"Settings",labels:{startAtLogin:"Start at login",language:"language",setAsSystemProxy:"Set as system proxy",allowConnectFromLan:"Allow connect from Lan",proxyMode:"Mode",socks5ProxyPort:"Socks5 proxy port",httpProxyPort:"HTTP proxy port",mixedProxyPort:"Mixed proxy port",externalController:"External controller"},values:{cn:"\u4e2d\u6587",en:"English",global:"Global",rules:"Rules",direct:"Direct",script:"Script"},versionString:"Current ClashX is the latest version\uff1a{{version}}",checkUpdate:"Check Update",externalControllerSetting:{title:"External Controller",note:"Please note that modifying this configuration will only configure Dashboard. Will not modify your Clash configuration file. Please make sure that the external controller address matches the address in the Clash configuration file, otherwise, Dashboard will not be able to connect to Clash.",host:"Host",port:"Port",secret:"Secret"}},Logs:{title:"Logs"},Rules:{title:"Rules",providerTitle:"Providers",providerUpdateTime:"Last updated at",ruleCount:"Rule count"},Connections:{title:"Connections",keepClosed:"Keep closed connections",total:{text:"total",upload:"upload",download:"download"},closeAll:{title:"Warning",content:"This would close all connections"},filter:{all:"All"},columns:{host:"Host",network:"Network",type:"Type",chains:"Chains",rule:"Rule",time:"Time",speed:"Speed",upload:"Upload",download:"Download",sourceIP:"Source IP"}},Proxies:{title:"Proxies",editDialog:{title:"Edit Proxy",color:"Color",name:"Name",type:"Type",server:"Server",port:"Port",password:"Password",cipher:"Cipher",obfs:"Obfs","obfs-host":"Obfs-host",uuid:"UUID",alterId:"AlterId",tls:"TLS"},groupTitle:"Policy Group",providerTitle:"Providers",providerUpdateTime:"Last updated at",expandText:"Expand",collapseText:"Collapse",speedTestText:"Speed Test",breakConnectionsText:"Close connections which include the group"},Modal:{ok:"Ok",cancel:"Cancel"}},zh_CN:{SideBar:{Proxies:"\u4ee3\u7406",Overview:"\u603b\u89c8",Logs:"\u65e5\u5fd7",Rules:"\u89c4\u5219",Settings:"\u8bbe\u7f6e",Connections:"\u8fde\u63a5",Version:"\u7248\u672c"},Settings:{title:"\u8bbe\u7f6e",labels:{startAtLogin:"\u5f00\u673a\u65f6\u542f\u52a8",language:"\u8bed\u8a00",setAsSystemProxy:"\u8bbe\u7f6e\u4e3a\u7cfb\u7edf\u4ee3\u7406",allowConnectFromLan:"\u5141\u8bb8\u6765\u81ea\u5c40\u57df\u7f51\u7684\u8fde\u63a5",proxyMode:"\u4ee3\u7406\u6a21\u5f0f",socks5ProxyPort:"Socks5 \u4ee3\u7406\u7aef\u53e3",httpProxyPort:"HTTP \u4ee3\u7406\u7aef\u53e3",mixedProxyPort:"\u6df7\u5408\u4ee3\u7406\u7aef\u53e3",externalController:"\u5916\u90e8\u63a7\u5236\u8bbe\u7f6e"},values:{cn:"\u4e2d\u6587",en:"English",global:"\u5168\u5c40",rules:"\u89c4\u5219",direct:"\u76f4\u8fde",script:"\u811a\u672c"},versionString:"\u5f53\u524d ClashX \u5df2\u662f\u6700\u65b0\u7248\u672c\uff1a{{version}}",checkUpdate:"\u68c0\u67e5\u66f4\u65b0",externalControllerSetting:{title:"\u7f16\u8f91\u5916\u90e8\u63a7\u5236\u8bbe\u7f6e",note:"\u8bf7\u6ce8\u610f\uff0c\u4fee\u6539\u8be5\u914d\u7f6e\u9879\u5e76\u4e0d\u4f1a\u4fee\u6539\u4f60\u7684 Clash \u914d\u7f6e\u6587\u4ef6\uff0c\u8bf7\u786e\u8ba4\u4fee\u6539\u540e\u7684\u5916\u90e8\u63a7\u5236\u5730\u5740\u548c Clash \u914d\u7f6e\u6587\u4ef6\u5185\u7684\u5730\u5740\u4e00\u81f4\uff0c\u5426\u5219\u4f1a\u5bfc\u81f4 Dashboard \u65e0\u6cd5\u8fde\u63a5\u3002",host:"Host",port:"\u7aef\u53e3",secret:"\u5bc6\u94a5"}},Logs:{title:"\u65e5\u5fd7"},Rules:{title:"\u89c4\u5219",providerTitle:"\u89c4\u5219\u96c6",providerUpdateTime:"\u6700\u540e\u66f4\u65b0\u4e8e",ruleCount:"\u89c4\u5219\u6761\u6570"},Connections:{title:"\u8fde\u63a5",keepClosed:"\u4fdd\u7559\u5173\u95ed\u8fde\u63a5",total:{text:"\u603b\u91cf",upload:"\u4e0a\u4f20",download:"\u4e0b\u8f7d"},closeAll:{title:"\u8b66\u544a",content:"\u5c06\u4f1a\u5173\u95ed\u6240\u6709\u8fde\u63a5"},filter:{all:"\u5168\u90e8"},columns:{host:"\u57df\u540d",network:"\u7f51\u7edc",type:"\u7c7b\u578b",chains:"\u8282\u70b9\u94fe",rule:"\u89c4\u5219",time:"\u8fde\u63a5\u65f6\u95f4",speed:"\u901f\u7387",upload:"\u4e0a\u4f20",download:"\u4e0b\u8f7d",sourceIP:"\u6765\u6e90 IP"}},Proxies:{title:"\u4ee3\u7406",editDialog:{title:"\u7f16\u8f91\u4ee3\u7406",color:"\u989c\u8272",name:"\u540d\u5b57",type:"\u7c7b\u578b",server:"\u670d\u52a1\u5668",port:"\u7aef\u53e3",password:"\u5bc6\u7801",cipher:"\u52a0\u5bc6\u65b9\u5f0f",obfs:"Obfs","obfs-host":"Obfs-host",uuid:"UUID",alterId:"AlterId",tls:"TLS"},groupTitle:"\u7b56\u7565\u7ec4",providerTitle:"\u4ee3\u7406\u96c6",providerUpdateTime:"\u6700\u540e\u66f4\u65b0\u4e8e",expandText:"\u5c55\u5f00",collapseText:"\u6536\u8d77",speedTestText:"\u6d4b\u901f",breakConnectionsText:"\u5207\u6362\u65f6\u6253\u65ad\u5305\u542b\u7b56\u7565\u7ec4\u7684\u8fde\u63a5"},Modal:{ok:"\u786e \u5b9a",cancel:"\u53d6 \u6d88"}}},X="language",Y=Object.keys(V);var K=n(22);function q(e){var t=Object(s.d)(e),n=Object(E.a)(t,2),r=n[0],c=n[1];return[r,Object(a.useMemo)((function(){return function(e,t){if("string"===typeof e)c((function(n){return Object(K.a)(n,(function(n){var a=t;n[e]=a}))}));else if("function"===typeof e){var n=e;c((function(e){return Object(K.a)(e,n)}))}else"object"===typeof e&&c((function(t){return Object(K.a)(t,(function(t){for(var n=e,a=0,r=Object.keys(n);a0&&(t.innerBuffer.push(n),t.innerBuffer.length>t.config.bufferLength&&t.innerBuffer.splice(0,t.innerBuffer.length-t.config.bufferLength))})),a.addEventListener("close",(function(){return setTimeout(t.websocketLoop,t.config.retryInterval)})),a.addEventListener("error",(function(e){t.EE.emit("error",e),setTimeout(t.websocketLoop,t.config.retryInterval)}))}},{key:"loop",value:function(){var e=Object(N.a)(O.a.mark((function e(){var t,n,a,r,c,o,s,i,l,u,p,d,m;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T(fetch(this.config.url,{mode:"cors",headers:this.config.token?{Authorization:"Bearer ".concat(this.config.token)}:{}}));case 2:if(t=e.sent,n=Object(E.a)(t,2),a=n[0],!(r=n[1])&&a.body){e.next=9;break}return this.retry(r),e.abrupt("return");case 9:c=a.body.getReader(),o=new TextDecoder;case 11:if(!this.isClose){e.next=14;break}return e.abrupt("break",29);case 14:return e.next=16,T(null===c||void 0===c?void 0:c.read());case 16:if(s=e.sent,i=Object(E.a)(s,2),l=i[0].value,!(u=i[1])){e.next=23;break}return this.retry(u),e.abrupt("break",29);case 23:p=o.decode(l).trim().split("\n"),d=p.map((function(e){return JSON.parse(e)})),this.EE.emit("data",d),this.config.bufferLength>0&&((m=this.innerBuffer).push.apply(m,Object(ee.a)(d)),this.innerBuffer.length>this.config.bufferLength&&this.innerBuffer.splice(0,this.innerBuffer.length-this.config.bufferLength)),e.next=11;break;case 29:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}()},{key:"retry",value:function(e){this.isClose||(this.EE.emit("error",e),window.setTimeout(this.loop,this.config.retryInterval))}},{key:"subscribe",value:function(e,t){this.EE.addListener(e,t)}},{key:"unsubscribe",value:function(e,t){this.EE.removeListener(e,t)}},{key:"buffer",value:function(){return this.innerBuffer.slice()}},{key:"destory",value:function(){this.EE.removeAllListeners(),this.isClose=!0}}]),e}();function ne(){return ae.apply(this,arguments)}function ae(){return(ae=Object(N.a)(O.a.mark((function e(){var t,n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!m()){e.next=5;break}return e.next=3,f.getAPIInfo();case 3:return t=e.sent,e.abrupt("return",{hostname:t.host,port:t.port,secret:t.secret});case 5:if(n=C("externalControllerAddr","127.0.0.1"),a=C("externalControllerPort","9090"),r=C("secret",""),n&&a){e.next=10;break}throw new Error("can't get hostname or port");case 10:return e.abrupt("return",{hostname:n,port:a,secret:r});case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var re=$(Object(N.a)(O.a.mark((function e(){var t,n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:return t=e.sent,n=t.hostname,a=t.port,r=t.secret,e.abrupt("return",Z.a.create({baseURL:"//".concat(n,":").concat(a),headers:r?{Authorization:"Bearer ".concat(r)}:{}}));case 7:case"end":return e.stop()}}),e)}))));function ce(){return oe.apply(this,arguments)}function oe(){return(oe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("configs"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.patch("configs",t));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(){return ue.apply(this,arguments)}function ue(){return(ue=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("rules"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(){return de.apply(this,arguments)}function de(){return(de=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("providers/proxies",{validateStatus:function(e){return e>=200&&e<300||404===e}}).then((function(e){return 404===e.status&&(e.data={providers:{}}),e})));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(){return fe.apply(this,arguments)}function fe(){return(fe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("providers/rules"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ve(){return(ve=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.put("providers/proxies/".concat(encodeURIComponent(t))));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function he(){return(he=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.put("providers/rules/".concat(encodeURIComponent(t))));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function be(){return(be=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.get("providers/proxies/".concat(encodeURIComponent(t),"/healthcheck")));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ye(){return ge.apply(this,arguments)}function ge(){return(ge=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("proxies"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function xe(){return Ee.apply(this,arguments)}function Ee(){return(Ee=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("version"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function we(e){return ke.apply(this,arguments)}function ke(){return(ke=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.get("proxies/".concat(encodeURIComponent(t),"/delay"),{params:{timeout:5e3,url:"http://www.gstatic.com/generate_204"}}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Oe(){return(Oe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.delete("connections"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function je(e){return Ne.apply(this,arguments)}function Ne(){return(Ne=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.delete("connections/".concat(t)));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ce(){return Pe.apply(this,arguments)}function Pe(){return(Pe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("connections"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Se(e,t){return Te.apply(this,arguments)}function Te(){return(Te=Object(N.a)(O.a.mark((function e(t,n){var a;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return a=e.sent,e.abrupt("return",a.put("proxies/".concat(encodeURIComponent(t)),{name:n}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Le=$(Object(N.a)(O.a.mark((function e(){var t,n,a,r,c,o,s,i,l,u;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:return t=e.sent,e.next=5,ce();case 5:return n=e.sent,a=n.data,e.next=9,T(xe());case 9:return r=e.sent,c=Object(E.a)(r,2),o=c[0],s=c[1],i=s?"unkonwn version":o.data.version,l=!!i||!0,u="".concat(window.location.protocol,"//").concat(t.hostname,":").concat(t.port,"/logs?level=").concat(a["log-level"]),e.abrupt("return",new te({url:u,bufferLength:200,token:t.secret,useWebsocket:l}));case 17:case"end":return e.stop()}}),e)})))),Re=$(Object(N.a)(O.a.mark((function e(){var t,n,a,r,c,o,s,i;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:return t=e.sent,e.next=5,T(xe());case 5:return n=e.sent,a=Object(E.a)(n,2),r=a[0],c=a[1],o=c?"unkonwn version":r.data.version,s=!!o||!0,i="".concat(window.location.protocol,"//").concat(t.hostname,":").concat(t.port,"/connections"),e.abrupt("return",new te({url:i,bufferLength:200,token:t.secret,useWebsocket:s}));case 13:case"end":return e.stop()}}),e)})))),De=Object(s.b)({key:"identity",default:!0});function Ie(){var e=Object(s.d)(De),t=Object(E.a)(e,2),n=t[0],a=t[1];return{identity:n,wrapFetcher:function(e){return Object(N.a)(O.a.mark((function t(){var n,r,c,o,s,i=arguments;return O.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,T(e.apply(void 0,i));case 2:if(n=t.sent,r=Object(E.a)(n,2),c=r[0],o=r[1],!(s=o)||s.response&&401!==s.response.status){t.next=10;break}throw a(!1),o;case 10:return a(!0),t.abrupt("return",c);case 12:case"end":return t.stop()}}),t)})))},set:a}}var Ae=Object(s.b)({key:"i18n",default:function(){var e=C(X);if(e&&Y.includes(e))return e;var t,n=function(){var e=[];if(window.navigator)if(window.navigator.languages){var t,n=Object(j.a)(window.navigator.languages);try{for(n.s();!(t=n.n()).done;){var a=t.value;e.push(a)}}catch(r){n.e(r)}finally{n.f()}}else window.navigator.language&&e.push(navigator.language);return e}(),a=Object(j.a)(n);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.includes("zh"))return"zh_CN";if(r.includes("us"))return"en_US"}}catch(c){a.e(c)}finally{a.f()}return"en_US"}()});function Be(){var e=Object(s.d)(Ae),t=Object(E.a)(e,2),n=t[0],r=t[1];var c=Object(a.useCallback)((function(e){return{t:function(t){return G()(V[n][e],t)}}}),[n]);return{lang:n,locales:Y,setLang:function(e){r(e),function(e){P(X,e)}(e)},translation:c}}var He=Object(s.b)({key:"version",default:{version:"",premium:!1}});function Me(){var e=Object(s.d)(He),t=Object(E.a)(e,2),n=t[0],a=t[1],r=Ie().set;function c(){return(c=Object(N.a)(O.a.mark((function e(){var t,n,c,o;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T(xe());case 2:t=e.sent,n=Object(E.a)(t,2),c=n[0],o=n[1],r(!o),a(o?{version:"",premium:!1}:{version:c.data.version,premium:!!c.data.premium});case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{version:n.version,premium:n.premium,update:function(){return c.apply(this,arguments)}}}var Ue=Object(s.b)({key:"config",default:{breakConnections:!1}});function ze(){var e=q(Ue),t=Object(E.a)(e,2);return{data:t[0],set:t[1]}}var We=Object(s.b)({key:"proxyProvider",default:[]});function Fe(){var e=Object(s.d)(We),t=Object(E.a)(e,2),n=t[0],r=t[1],c=Object(J.a)("/providers/proxy",Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,pe();case 2:return t=e.sent,e.abrupt("return",Object.keys(t.data.providers).map((function(e){return t.data.providers[e]})).filter((function(e){return"default"!==e.name})).filter((function(e){return"Compatible"!==e.vehicleType})));case 4:case"end":return e.stop()}}),e)})))),o=c.data,i=c.mutate;return Object(a.useEffect)((function(){return r(null!==o&&void 0!==o?o:[])}),[o,r]),{providers:n,update:i}}function _e(){var e=Object(s.d)(He),t=Object(E.a)(e,1)[0].premium,n=Object(J.a)("/providers/rule",Object(N.a)(O.a.mark((function e(){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,me();case 4:return n=e.sent,e.abrupt("return",Object.keys(n.data.providers).map((function(e){return n.data.providers[e]})));case 6:case"end":return e.stop()}}),e)})))),a=n.data;return{providers:null!==a&&void 0!==a?a:[],update:n.mutate}}function Ge(){var e=Object(J.a)("/config",Object(N.a)(O.a.mark((function e(){var t,n,a;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ce();case 2:return n=e.sent,a=n.data,e.abrupt("return",{port:a.port,socksPort:a["socks-port"],mixedPort:null!==(t=a["mixed-port"])&&void 0!==t?t:0,redirPort:a["redir-port"],mode:a.mode.toLowerCase(),logLevel:a["log-level"],allowLan:a["allow-lan"]});case 5:case"end":return e.stop()}}),e)})))),t=e.data;return{general:null!==t&&void 0!==t?t:{},update:e.mutate}}var Je=Object(s.b)({key:"proxies",default:{proxies:[],groups:[],global:{name:"GLOBAL",type:"Selector",now:"",history:[],all:[]}}});function Ve(){var e=q(Je),t=Object(E.a)(e,2),n=t[0],r=t[1],c=Object(J.a)("/proxies",Object(N.a)(O.a.mark((function e(){var t,n,a,c,o,s,i,l,u;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ye();case 2:t=e.sent,(n=t.data.proxies.GLOBAL).name="GLOBAL",a=new Set(["Selector","URLTest","Fallback","LoadBalance"]),c=new Set(["DIRECT","REJECT","GLOBAL"]),o=n.all.filter((function(e){return!c.has(e)})).map((function(e){return Object(B.a)(Object(B.a)({},t.data.proxies[e]),{},{name:e})})),s=R(o,(function(e){return!a.has(e.type)})),i=Object(E.a)(s,2),l=i[0],u=i[1],r({proxies:l,groups:u,global:n});case 10:case"end":return e.stop()}}),e)})))).mutate,o=Object(a.useCallback)((function(e,t){r((function(n){var a,r=Object(j.a)(n.groups);try{for(r.s();!(a=r.n()).done;){var c=a.value;c.name===e&&(c.now=t)}}catch(o){r.e(o)}finally{r.f()}}))}),[r]);return{proxies:n.proxies,groups:n.groups,global:n.global,update:c,markProxySelected:o,set:r}}var Xe=Object(s.c)({key:"proxyMapping",get:function(e){var t,n=e.get,a=n(Je),r=n(We),c=new Map,o=Object(j.a)(a.proxies);try{for(o.s();!(t=o.n()).done;){var s=t.value;c.set(s.name,s)}}catch(f){o.e(f)}finally{o.f()}var i,l=Object(j.a)(r);try{for(l.s();!(i=l.n()).done;){var u,p=i.value,d=Object(j.a)(p.proxies);try{for(d.s();!(u=d.n()).done;){var m=u.value;c.set(m.name,m)}}catch(f){d.e(f)}finally{d.f()}}}catch(f){l.e(f)}finally{l.f()}return c}});function Ye(){var e=Object(J.a)("/clashx",Object(N.a)(O.a.mark((function e(){var t,n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(m()){e.next=2;break}return e.abrupt("return",{isClashX:!1,startAtLogin:!1,systemProxy:!1});case 2:return e.next=4,null===f||void 0===f?void 0:f.getStartAtLogin();case 4:if(e.t1=t=e.sent,e.t0=null!==e.t1,!e.t0){e.next=8;break}e.t0=void 0!==t;case 8:if(!e.t0){e.next=12;break}e.t2=t,e.next=13;break;case 12:e.t2=!1;case 13:return a=e.t2,e.next=16,null===f||void 0===f?void 0:f.isSystemProxySet();case 16:if(e.t4=n=e.sent,e.t3=null!==e.t4,!e.t3){e.next=20;break}e.t3=void 0!==n;case 20:if(!e.t3){e.next=24;break}e.t5=n,e.next=25;break;case 24:e.t5=!1;case 25:return r=e.t5,e.abrupt("return",{startAtLogin:a,systemProxy:r,isClashX:!0});case 27:case"end":return e.stop()}}),e)}))));return{data:e.data,update:e.mutate}}var Ke=Object(s.b)({key:"apiData",default:{hostname:"127.0.0.1",port:"9090",secret:""}});function qe(){var e=Object(s.d)(Ke),t=Object(E.a)(e,2),n=t[0],r=t[1];function c(){return(c=Object(N.a)(O.a.mark((function e(t){var n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=t.hostname,a=t.port,r=t.secret,P("externalControllerAddr",n),P("externalControllerPort",a),P("secret",r),window.location.reload();case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{data:n,fetch:Object(a.useCallback)(function(){var e=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:t=e.sent,r(Object(B.a)({},t));case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),[r]),update:function(e){return c.apply(this,arguments)}}}var Qe=Object(s.b)({key:"rules",default:[]});function Ze(e){var t=e.className,n=e.data,c=e.onClick,o=e.select,s=e.canClick,i=e.errSet,l=e.rowHeight,p=(0,Be().translation)("Proxies").t,d=Object(a.useState)(!1),m=Object(E.a)(d,2),f=m[0],v=m[1],h=Object(a.useState)(!1),b=Object(E.a)(h,2),y=b[0],g=b[1],x=Object(a.useRef)(null);Object(a.useLayoutEffect)((function(){var e,t;g((null!==(e=null===x||void 0===x||null===(t=x.current)||void 0===t?void 0:t.offsetHeight)&&void 0!==e?e:0)>30)}),[]);var w=f?"auto":l,k=s?c:S;var O=n.map((function(e){var t=u()({"tags-selected":o===e,"can-click":s,error:null===i||void 0===i?void 0:i.has(e)});return r.a.createElement("li",{className:t,key:e,onClick:function(){return k(e)}},e)}));return r.a.createElement("div",{className:u()("tags-container",t),style:{height:w}},r.a.createElement("ul",{ref:x,className:u()("tags",{expand:f})},O),y&&r.a.createElement("span",{className:"tags-expand",onClick:function(){v(!f)}},p(f?"collapseText":"expandText")))}function $e(e){var t=e.className,n=e.style,r=e.value,c=void 0===r?"":r,o=e.align,s=void 0===o?"center":o,i=e.inside,l=void 0!==i&&i,p=e.autoFocus,d=void 0!==p&&p,m=e.type,f=void 0===m?"text":m,v=e.disabled,h=void 0!==v&&v,b=e.onChange,y=void 0===b?S:b,g=e.onBlur,x=void 0===g?S:g,E=u()("input","input-align-".concat(s),{"input-inside":l},t);return a.createElement("input",{disabled:h,className:E,style:n,value:c,autoFocus:d,type:f,onChange:function(e){return y(e.target.value,e)},onBlur:x})}function et(e){var t=e.show,n=void 0===t||t,o=e.title,s=void 0===o?"Modal":o,i=e.size,l=void 0===i?"small":i,p=e.footer,d=void 0===p||p,m=e.onOk,f=void 0===m?S:m,v=e.onClose,h=void 0===v?S:v,b=e.bodyClassName,y=e.bodyStyle,g=e.className,x=e.style,E=e.children,w=(0,Be().translation)("Modal").t,k=Object(a.useRef)(document.createElement("div")),O=Object(a.useRef)(null);Object(a.useLayoutEffect)((function(){var e=k.current;return document.body.appendChild(e),function(){document.body.removeChild(e)}}),[]);var j=r.a.createElement("div",{className:u()("modal-mask",{"modal-show":n}),ref:O,onMouseDown:function(e){e.target===O.current&&h()}},r.a.createElement("div",{className:u()("modal","modal-".concat(l),g),style:x},r.a.createElement("div",{className:"modal-title"},s),r.a.createElement("div",{className:u()("modal-body",b),style:y},E),d&&r.a.createElement("div",{className:"footer"},r.a.createElement(at,{onClick:function(){return h()}},w("cancel")),r.a.createElement(at,{type:"primary",onClick:function(){return f()}},w("ok")))));return Object(c.createPortal)(j,k.current)}var tt={success:"check",info:"info",warning:"info",error:"close"};function nt(e){var t=e.message,n=void 0===t?"":t,a=e.type,c=void 0===a?"info":a,o=e.inside,s=void 0!==o&&o,i=e.children,l=e.className,p=e.style,d=u()("alert","alert-".concat(s?"note":"box","-").concat(c),l);return r.a.createElement("div",{className:d,style:p},r.a.createElement("span",{className:"alert-icon"},r.a.createElement(H,{type:tt[c],size:26})),n?r.a.createElement("p",{className:"alert-message"},n):r.a.createElement("div",{className:"alert-message"},i))}function at(e){var t=e.type,n=void 0===t?"normal":t,r=e.onClick,c=void 0===r?S:r,o=e.children,s=e.className,i=e.style,l=u()("button","button-".concat(n),s);return a.createElement("button",{className:l,style:i,onClick:c},o)}function rt(e){var t=e.className,n=e.checked,r=void 0!==n&&n,c=e.onChange,o=void 0===c?S:c,s=u()("checkbox",{checked:r},t);return a.createElement("div",{className:s,onClick:function(){o(!r)}},a.createElement(H,{className:"checkbox-icon",type:"check",size:18}),a.createElement("div",null,e.children))}function ct(e){var t=e.color,n=e.className,r=e.style,c=u()("tag",n),o=Object(B.a)({color:t},r),s=Object(B.a)(Object(B.a)({},e),{},{className:c,style:o});return a.createElement("span",s,e.children)}function ot(e){var t=u()("spinner",e.className);return a.createElement("div",{className:t},a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})))}function st(e){var t=u()("loading","visible",e.className);return e.visible?r.a.createElement("div",{className:t},r.a.createElement(ot,{className:e.spinnerClassName})):null}var it={"#909399":0,"#00c520":260,"#ff9a28":600,"#ff3e5e":1/0};function lt(e){return ut.apply(this,arguments)}function ut(){return(ut=Object(N.a)(O.a.mark((function e(t){var n,a,r,c;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!m()){e.next=14;break}return e.next=3,null===f||void 0===f?void 0:f.getProxyDelay(t);case 3:if(e.t1=n=e.sent,e.t0=null!==e.t1,!e.t0){e.next=7;break}e.t0=void 0!==n;case 7:if(!e.t0){e.next=11;break}e.t2=n,e.next=12;break;case 11:e.t2=0;case 12:return a=e.t2,e.abrupt("return",a);case 14:return e.next=16,we(t);case 16:return r=e.sent,c=r.data.delay,e.abrupt("return",c);case 19:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pt(e){var t=e.config,n=e.className,c=Ve().set,o=Object(a.useCallback)(Object(N.a)(O.a.mark((function e(){var n,a,r,o,s;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T(lt(t.name));case 2:n=e.sent,a=Object(E.a)(n,2),r=a[0],o=a[1],s=o?0:r,c((function(e){var n=e.proxies.find((function(e){return e.name===t.name}));n&&n.history.push({time:Date.now().toString(),delay:s})}));case 8:case"end":return e.stop()}}),e)}))),[t.name,c]),s=Object(a.useMemo)((function(){var e;return(null===(e=t.history)||void 0===e?void 0:e.length)?t.history.slice(-1)[0].delay:0}),[t]);Object(a.useLayoutEffect)((function(){return x.subscribe(h.SPEED_NOTIFY,o),function(){return x.unsubscribe(h.SPEED_NOTIFY,o)}}),[o]);var i=Object(a.useMemo)((function(){return 0===s}),[s]),l=Object(a.useMemo)((function(){return Object.keys(it).find((function(e){return s<=it[e]}))}),[s]),p=i?void 0:l;return r.a.createElement("div",{className:u()("proxy-item",{"proxy-error":i},n)},r.a.createElement("span",{className:"proxy-type",style:{backgroundColor:p}},t.type),r.a.createElement("p",{className:"proxy-name"},t.name),r.a.createElement("p",{className:"proxy-delay"},0===s?"-":"".concat(s,"ms")))}function dt(e){var t=Ve().markProxySelected,n=Object(s.e)(Xe),c=ze().data,o=e.config;function i(){return(i=Object(N.a)(O.a.mark((function n(a){var r,o,s,i,l,u,p;return O.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,Se(e.config.name,a);case 2:if(t(e.config.name,a),!c.breakConnections){n.next=11;break}return r=[],n.next=7,Ce();case 7:o=n.sent,s=Object(j.a)(o.data.connections);try{for(s.s();!(i=s.n()).done;)(l=i.value).chains.includes(e.config.name)&&r.push(l.id)}catch(d){s.e(d)}finally{s.f()}for(u=0,p=r;u1&&void 0!==arguments[1]?arguments[1]:0;if(e.length<2)throw new Error("List requires at least two elements");var n=Object(a.useState)(t),r=Object(E.a)(n,2),c=r[0],o=r[1];function s(){o((c+1)%e.length)}return{current:Object(a.useMemo)((function(){return e[c]}),[e,c]),next:s}}([ft.Asc,ft.Desc,ft.None]),c=n.current,o=n.next,s=Object(a.useMemo)((function(){switch(c){case ft.Desc:return e.slice().sort((function(e,t){return wt(e,t)}));case ft.Asc:return e.slice().sort((function(e,t){return-1*wt(e,t)}));default:return e.slice()}}),[c,e]),i=o;return r.a.createElement(r.a.Fragment,null,0!==s.length&&r.a.createElement("div",{className:"proxies-container"},r.a.createElement(A,{title:t("title")},r.a.createElement(H,{className:"proxies-action-icon",type:Et[c],onClick:i,size:20}),r.a.createElement(H,{className:"proxies-action-icon",type:"speed",size:20}),r.a.createElement("span",{className:"proxies-speed-test",onClick:function(){x.notifySpeedTest()}},t("speedTestText"))),r.a.createElement("ul",{className:"proxies-list"},s.map((function(e){return r.a.createElement("li",{key:e.name},r.a.createElement(pt,{config:e}))})))))}function Nt(){return r.a.createElement("div",{className:"page"},r.a.createElement(kt,null),r.a.createElement(Ot,null),r.a.createElement(jt,null))}function Ct(){var e=Object(a.useRef)(null),t=Object(a.useRef)([]),n=Object(a.useState)([]),c=Object(E.a)(n,2),o=c[0],s=c[1],i=(0,Be().translation)("Logs").t;return Object(a.useLayoutEffect)((function(){var t=e.current;t&&(t.scrollTop=t.scrollHeight)})),Object(a.useEffect)((function(){var e=null;function n(e){t.current=t.current.slice().concat(e.map((function(e){return Object(B.a)(Object(B.a)({},e),{},{time:new Date})}))),s(t.current)}return Object(N.a)(O.a.mark((function a(){return O.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,Le();case 2:e=a.sent,t.current=e.buffer(),s(t.current),e.subscribe("data",n);case 6:case"end":return a.stop()}}),a)})))(),function(){var t;return null===(t=e)||void 0===t?void 0:t.unsubscribe("data",n)}}),[]),r.a.createElement("div",{className:"page"},r.a.createElement(A,{title:i("title")}),r.a.createElement(U,{className:"logs-card"},r.a.createElement("ul",{className:"logs-panel",ref:e},o.map((function(e,t){return r.a.createElement("li",{key:t},r.a.createElement("span",{className:"logs-panel-time"},ht()(e.time).format("YYYY-MM-DD HH:mm:ss")),r.a.createElement("span",null,"[",e.type,"] ",e.payload))})))))}var Pt=n(73),St=n(68);function Tt(e){var t=_e().update,n=Be(),r=n.translation,c=n.lang,o=e.provider,s=r("Rules").t,i=I(),l=i.visible,p=i.hide,d=i.show;var m=u()("rule-provider-icon",{"rule-provider-loading":l});return a.createElement(U,{className:"rule-provider"},a.createElement("div",{className:"rule-provider-header"},a.createElement("div",{className:"rule-provider-header-part"},a.createElement("span",{className:"rule-provider-name"},o.name),a.createElement(ct,null,o.vehicleType),a.createElement(ct,{className:"rule-provider-behavior"},o.behavior),a.createElement("span",{className:"rule-provider-update"},"".concat(s("ruleCount"),": ").concat(o.ruleCount))),a.createElement("div",{className:"rule-provider-header-part"},o.updatedAt&&a.createElement("span",{className:"rule-provider-update"},"".concat(s("providerUpdateTime"),": ").concat(gt(new Date(o.updatedAt),c))),a.createElement(H,{className:m,type:"update",size:18,onClick:function(){d(),function(e){return he.apply(this,arguments)}(o.name).then((function(){return t()})).finally((function(){return p()}))}}))))}function Lt(){var e=_e().providers,t=(0,Be().translation)("Rules").t;return r.a.createElement(r.a.Fragment,null,0!==e.length&&r.a.createElement("div",{className:"proxies-container"},r.a.createElement(A,{title:t("providerTitle")}),r.a.createElement("ul",{className:"proxies-providers-list"},e.map((function(e){return r.a.createElement("li",{className:"proxies-providers-item",key:e.name},r.a.createElement(Tt,{provider:e}))})))))}function Rt(){var e=function(){var e=q(Qe),t=Object(E.a)(e,2),n=t[0],a=t[1];function r(){return(r=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,le();case 2:t=e.sent,a(t.data.rules);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{rules:n,update:function(){return r.apply(this,arguments)}}}(),t=e.rules,n=e.update,a=(0,Be().translation)("Rules").t;function c(e){var n=e.index,a=e.style,c=t[n];return r.a.createElement("li",{className:"rule-item",style:a},r.a.createElement(z,{className:"rule-item-row",gutter:24,align:"middle"},r.a.createElement(W,{className:"rule-type",span:6,offset:1},c.type),r.a.createElement(W,{className:"payload",span:11},c.payload),r.a.createElement(W,{className:"rule-proxy",span:6},c.proxy)))}return Object(J.a)("rules",n),r.a.createElement("div",{className:"page"},r.a.createElement(Lt,null),r.a.createElement(A,{title:a("title")}),r.a.createElement(U,{className:"rules-card"},r.a.createElement(St.a,{className:"rules"},(function(e){var n=e.height,a=e.width;return r.a.createElement(Pt.a,{height:n,width:a,itemCount:t.length,itemSize:50},c)}))))}var Dt=n(69),It=n.n(Dt),At=[{label:"\u4e2d\u6587",value:"zh_CN"},{label:"English",value:"en_US"}];function Bt(){var e,t,n,c=Me().premium,o=Ye(),s=o.data,i=o.update,l=Ge(),p=l.general,d=l.update,m=Ie().set,v=qe().data,h=Be(),b=h.translation,y=h.setLang,g=h.lang,x=b("Settings").t,w=D({socks5ProxyPort:7891,httpProxyPort:7890,mixedProxyPort:0}),k=Object(E.a)(w,2),j=k[0],C=k[1];function P(){return(P=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({mode:t});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function S(){return(S=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,null===f||void 0===f?void 0:f.setStartAtLogin(t);case 2:i();case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function T(){return(T=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,null===f||void 0===f?void 0:f.setSystemProxy(t);case 2:i();case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function L(){return(L=Object(N.a)(O.a.mark((function e(){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({port:j.httpProxyPort});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function R(){return(R=Object(N.a)(O.a.mark((function e(){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({"socks-port":j.socks5ProxyPort});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function I(){return(I=Object(N.a)(O.a.mark((function e(){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({"mixed-port":j.mixedProxyPort});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function B(){return(B=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({"allow-lan":t});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}Object(a.useEffect)((function(){var e,t,n;C("socks5ProxyPort",null!==(e=null===p||void 0===p?void 0:p.socksPort)&&void 0!==e?e:0),C("httpProxyPort",null!==(t=null===p||void 0===p?void 0:p.port)&&void 0!==t?t:0),C("mixedProxyPort",null!==(n=null===p||void 0===p?void 0:p.mixedPort)&&void 0!==n?n:0)}),[p,C]);var _=v.hostname,G=v.port,J=p.allowLan,V=p.mode,X=null!==(e=null===s||void 0===s?void 0:s.startAtLogin)&&void 0!==e&&e,Y=null!==(t=null===s||void 0===s?void 0:s.systemProxy)&&void 0!==t&&t,K=null!==(n=null===s||void 0===s?void 0:s.isClashX)&&void 0!==n&&n,q=Object(a.useMemo)((function(){var e=[{label:x("values.global"),value:"Global"},{label:x("values.rules"),value:"Rule"},{label:x("values.direct"),value:"Direct"}];return c&&e.push({label:x("values.script"),value:"Script"}),e}),[x,c]);return r.a.createElement("div",{className:"page"},r.a.createElement(A,{title:x("title")}),r.a.createElement(U,{className:"settings-card"},r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.startAtLogin"))),r.a.createElement(W,{span:8,className:"value-column"},r.a.createElement(M,{disabled:!(null===s||void 0===s?void 0:s.isClashX),checked:X,onChange:function(e){return S.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:8,offset:1},r.a.createElement("span",{className:"label"},x("labels.language"))),r.a.createElement(W,{span:14,className:"value-column"},r.a.createElement(F,{options:At,value:g,onSelect:function(e){y(e)}})))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.setAsSystemProxy"))),r.a.createElement(W,{span:8,className:"value-column"},r.a.createElement(M,{disabled:!K,checked:Y,onChange:function(e){return T.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.allowConnectFromLan"))),r.a.createElement(W,{span:8,className:"value-column"},r.a.createElement(M,{checked:J,onChange:function(e){return B.apply(this,arguments)}}))))),r.a.createElement(U,{className:"settings-card"},r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:8,offset:1},r.a.createElement("span",{className:"label"},x("labels.proxyMode"))),r.a.createElement(W,{span:14,className:"value-column"},r.a.createElement(F,{options:q,value:It()(V),onSelect:function(e){return P.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.socks5ProxyPort"))),r.a.createElement(W,{span:8},r.a.createElement($e,{disabled:K,value:j.socks5ProxyPort,onChange:function(e){return C("socks5ProxyPort",+e)},onBlur:function(){return R.apply(this,arguments)}})))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.httpProxyPort"))),r.a.createElement(W,{span:8},r.a.createElement($e,{disabled:K,value:j.httpProxyPort,onChange:function(e){return C("httpProxyPort",+e)},onBlur:function(){return L.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.mixedProxyPort"))),r.a.createElement(W,{span:8},r.a.createElement($e,{disabled:K,value:j.mixedProxyPort,onChange:function(e){return C("mixedProxyPort",+e)},onBlur:function(){return I.apply(this,arguments)}})))),r.a.createElement(z,null,r.a.createElement(W,{span:12},r.a.createElement(W,{span:12,offset:1},r.a.createElement("span",{className:"label"},x("labels.externalController"))),r.a.createElement(W,{className:"external-controller",span:10},r.a.createElement("span",{className:u()({"modify-btn":!K}),onClick:function(){return!K&&m(!1)}},"".concat(_,":").concat(G)))))),r.a.createElement(U,{className:"clash-version",style:{display:"none"}},r.a.createElement("span",{className:"check-icon"},r.a.createElement(H,{type:"check",size:20})),r.a.createElement("p",{className:"version-info"},x("versionString")),r.a.createElement("span",{className:"check-update-btn"},x("checkUpdate"))))}var Ht=n.p+"static/media/logo.45983944.png";function Mt(e){var t=e.routes,n=Be().translation,r=Me(),c=r.version,s=r.premium,i=r.update,l=Ye().data,p=n("SideBar").t;Object(J.a)("version",i);var d=t.map((function(e){var t=e.path,n=e.name,r=e.exact,c=e.noMobile;return a.createElement("li",{className:u()("item",{"no-mobile":c}),key:n},a.createElement(o.b,{to:t,activeClassName:"active",exact:!!r},p(n)))}));return a.createElement("div",{className:"sidebar"},a.createElement("img",{src:Ht,alt:"logo",className:"sidebar-logo"}),a.createElement("ul",{className:"sidebar-menu"},d),a.createElement("div",{className:"sidebar-version"},a.createElement("span",{className:"sidebar-version-label"},"Clash",(null===l||void 0===l?void 0:l.isClashX)&&"X"," ",p("Version")),a.createElement("span",{className:"sidebar-version-text"},c),s&&a.createElement("span",{className:"sidebar-version-label"},"Premium")))}var Ut=n(25),zt=n(152),Wt=n(71),Ft=n(72);function _t(e){var t=Be().translation,n=Object(a.useMemo)((function(){return t("Connections").t}),[t]),c=e.className,o=e.style,s=u()("connections-devices",c);function i(t){var n;null===(n=e.onChange)||void 0===n||n.call(e,t)}return r.a.createElement("div",{className:s,style:o},r.a.createElement("div",{className:u()("connections-devices-item",{selected:""===e.selected}),onClick:function(){return i("")}},n("filter.all")),e.devices.map((function(t){return r.a.createElement("div",{className:u()("connections-devices-item",{selected:e.selected===t.label}),onClick:function(){return i(t.label)}},t.label," (",t.number,")")})))}var Gt,Jt=function(){function e(){Object(p.a)(this,e),this.connections=new Map,this.saveDisconnection=!1}return Object(d.a)(e,[{key:"appendToSet",value:function(e){var t,n=e.reduce((function(e,t){return e.set(t.id,t)}),new Map),a=Object(j.a)(this.connections.keys());try{for(a.s();!(t=a.n()).done;){var r=t.value;if(!n.has(r))if(this.saveDisconnection){var c=this.connections.get(r);c&&(c.completed=!0,c.uploadSpeed=0,c.downloadSpeed=0)}else this.connections.delete(r)}}catch(d){a.e(d)}finally{a.f()}var o,s=Object(j.a)(n.keys());try{for(s.s();!(o=s.n()).done;){var i,l=o.value;if(this.connections.has(l)){var u=this.connections.get(l),p=n.get(l);null===(i=this.connections)||void 0===i||i.set(l,Object(B.a)(Object(B.a)({},p),{},{uploadSpeed:p.upload-u.upload,downloadSpeed:p.download-u.download}))}else this.connections.set(l,Object(B.a)(Object(B.a)({},n.get(l)),{},{uploadSpeed:0,downloadSpeed:0}))}}catch(d){s.e(d)}finally{s.f()}}},{key:"toggleSave",value:function(){if(this.saveDisconnection){this.saveDisconnection=!1;var e,t=Object(j.a)(this.connections.keys());try{for(t.s();!(e=t.n()).done;){var n,a,r=e.value;(null===(n=this.connections)||void 0===n||null===(a=n.get(r))||void 0===a?void 0:a.completed)&&this.connections.delete(r)}}catch(c){t.e(c)}finally{t.f()}}else this.saveDisconnection=!0;return this.saveDisconnection}},{key:"getConnections",value:function(){return Object(ee.a)(this.connections.values())}}]),e}();!function(e){e.Host="host",e.Network="network",e.Type="type",e.Chains="chains",e.Rule="rule",e.Speed="speed",e.Upload="upload",e.Download="download",e.SourceIP="sourceIP",e.Time="time"}(Gt||(Gt={}));var Vt,Xt=new Set([Gt.Network,Gt.Type,Gt.Rule,Gt.Speed,Gt.Upload,Gt.Download,Gt.SourceIP,Gt.Time]);function Yt(e){for(var t=["B","KB","MB","GB","TB"],n=0;~~(e/1024)&&n1&&r.a.createElement(_t,{devices:w,selected:J,onChange:function(e){V(e),null===z||void 0===z||z(Gt.SourceIP,e)}}),r.a.createElement(U,{className:"connections-card"},r.a.createElement("div",Object.assign({},T(),{className:"connections",ref:k}),r.a.createElement("div",Object.assign({},W.getHeaderGroupProps(),{className:"connections-header"}),W.headers.map((function(e,t){var n=e,a=n.id;return r.a.createElement("div",Object.assign({},n.getHeaderProps(),{className:u()("connections-th",{resizing:n.isResizing,fixed:0!==C&&n.id===Gt.Host}),key:a}),r.a.createElement("div",n.getSortByToggleProps(),e.render("Header"),n.isSorted?n.isSortedDesc?" \u2193":" \u2191":null),t!==W.headers.length-1&&r.a.createElement("div",Object.assign({},n.getResizerProps(),{className:"connections-resizer"})))}))),r.a.createElement("div",Object.assign({},L(),{className:"connections-body"}),B.map((function(e){return M(e),r.a.createElement("div",Object.assign({},e.getRowProps(),{className:"connections-item",key:e.original.id}),e.cells.map((function(t){var n=u()("connections-block",{center:Xt.has(t.column.id),completed:e.original.completed},{fixed:0!==C&&t.column.id===Gt.Host});return r.a.createElement("div",Object.assign({},t.getCellProps(),{className:n,key:t.column.id}),F(t))})))}))))),r.a.createElement(et,{title:c("closeAll.title"),show:d,onClose:f,onOk:function(){(function(){return Oe.apply(this,arguments)})().finally((function(){return f()}))}},c("closeAll.content")))}function qt(){var e=(0,Be().translation)("Settings").t,t=qe(),n=t.data,c=t.update,o=t.fetch,s=Ie(),i=s.identity,l=s.set,u=D({hostname:"",port:"",secret:""}),p=Object(E.a)(u,2),d=p[0],m=p[1];return Object(a.useEffect)((function(){o()}),[o]),Object(a.useEffect)((function(){m({hostname:n.hostname,port:n.port,secret:n.secret})}),[n,m]),r.a.createElement(et,{show:!i,title:e("externalControllerSetting.title"),bodyClassName:"external-controller",onClose:function(){return l(!0)},onOk:function(){var e=d.hostname,t=d.port,n=d.secret;c({hostname:e,port:t,secret:n})}},r.a.createElement(nt,{type:"info",inside:!0},r.a.createElement("p",null,e("externalControllerSetting.note"))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:4,className:"title"},e("externalControllerSetting.host")),r.a.createElement(W,{span:20,className:"form"},r.a.createElement($e,{align:"left",inside:!0,value:d.hostname,onChange:function(e){return m("hostname",e)}}))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:4,className:"title"},e("externalControllerSetting.port")),r.a.createElement(W,{span:20,className:"form"},r.a.createElement($e,{align:"left",inside:!0,value:d.port,onChange:function(e){return m("port",e)}}))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:4,className:"title"},e("externalControllerSetting.secret")),r.a.createElement(W,{span:20,className:"form"},r.a.createElement($e,{align:"left",inside:!0,value:d.secret,onChange:function(e){return m("secret",e)}}))))}function Qt(){Object(a.useEffect)((function(){Le()}),[]);var e=[{path:"/proxies",name:"Proxies",component:Nt},{path:"/logs",name:"Logs",component:Ct},{path:"/rules",name:"Rules",component:Rt,noMobile:!0},{path:"/connections",name:"Connections",component:Kt,noMobile:!0},{path:"/settings",name:"Settings",component:Bt}];return r.a.createElement("div",{className:u()("app",{"not-clashx":!m()})},r.a.createElement(Mt,{routes:e}),r.a.createElement("div",{className:"page-container"},r.a.createElement(i.b,{exact:!0,path:"/",component:function(){return r.a.createElement(i.a,{to:"/proxies"})}}),e.map((function(e){return r.a.createElement(i.b,{exact:!1,path:e.path,key:e.path,component:e.component})}))),r.a.createElement(qt,null))}function Zt(){var e=document.getElementById("root"),t=r.a.createElement(s.a,null,r.a.createElement(o.a,null,r.a.createElement(Qt,null)));Object(c.render)(t,e)}m()?(Vt=function(){return Zt()},f?Vt():f=new v(Vt)):Zt()},59:function(e,t){},60:function(e,t){},61:function(e,t,n){"use strict"},62:function(e,t,n){"use strict";var a;n.d(t,"a",(function(){return a})),function(e){e.Domain="Domain",e.DomainSuffix="DomainSuffix",e.DomainKeyword="DomainKeyword",e.GeoIP="GeoIP",e.IPCIDR="IPCIDR",e.SrcIPCIDR="SrcIPCIDR",e.SrcPort="SrcPort",e.DstPort="DstPort",e.MATCH="MATCH",e.RuleSet="RuleSet"}(a||(a={}))},63:function(e,t,n){"use strict"},72:function(e,t,n){"use strict";var a=n(59);n.o(a,"RuleType")&&n.d(t,"RuleType",(function(){return a.RuleType}));var r=n(60);n.o(r,"RuleType")&&n.d(t,"RuleType",(function(){return r.RuleType}));n(61);var c=n(62);n.d(t,"RuleType",(function(){return c.a}));n(63)}},[[150,1,2]]]); \ No newline at end of file +(this["webpackJsonpclash-dashboard"]=this["webpackJsonpclash-dashboard"]||[]).push([[0],{150:function(e,t,n){"use strict";n.r(t);var a=n(0),r=n.n(a),c=n(17),o=n(26),s=n(8),i=n(9),l=n(3),u=n.n(l),p=n(10),d=n(18);function m(){return"ClashX Runtime"===navigator.userAgent}var f=null,v=function(){function e(t){var n=this;Object(p.a)(this,e),this.instance=null,window.WebViewJavascriptBridge&&(this.instance=window.WebViewJavascriptBridge),this.initBridge((function(e){n.instance=e,t()}))}return Object(d.a)(e,[{key:"initBridge",value:function(e){if(!m())return null===e||void 0===e?void 0:e(null);if(window.WebViewJavascriptBridge)return e(window.WebViewJavascriptBridge);if(window.WVJBCallbacks)return window.WVJBCallbacks.push(e);window.WVJBCallbacks=[e];var t=document.createElement("iframe");t.style.display="none",t.src="https://__bridge_loaded__",document.documentElement.appendChild(t),setTimeout((function(){return document.documentElement.removeChild(t)}),0)}},{key:"callHandler",value:function(e,t){var n=this;return new Promise((function(a){var r;null===(r=n.instance)||void 0===r||r.callHandler(e,t,a)}))}},{key:"ping",value:function(){return this.callHandler("ping")}},{key:"readConfigString",value:function(){return this.callHandler("readConfigString")}},{key:"getPasteboard",value:function(){return this.callHandler("getPasteboard")}},{key:"getAPIInfo",value:function(){return this.callHandler("apiInfo")}},{key:"setPasteboard",value:function(e){return this.callHandler("setPasteboard",e)}},{key:"writeConfigWithString",value:function(e){return this.callHandler("writeConfigWithString",e)}},{key:"setSystemProxy",value:function(e){return this.callHandler("setSystemProxy",e)}},{key:"getStartAtLogin",value:function(){return this.callHandler("getStartAtLogin")}},{key:"getProxyDelay",value:function(e){return this.callHandler("speedTest",e)}},{key:"setStartAtLogin",value:function(e){return this.callHandler("setStartAtLogin",e)}},{key:"isSystemProxySet",value:function(){return this.callHandler("isSystemProxySet")}}]),e}();var h,b=n(21),y=n(36),g=n.n(y);!function(e){e.SPEED_NOTIFY="speed-notify"}(h||(h={}));var x=new(function(){function e(){Object(p.a)(this,e),this.EE=new g.a}return Object(d.a)(e,[{key:"notifySpeedTest",value:function(){this.EE.emit(h.SPEED_NOTIFY)}},{key:"subscribe",value:function(e,t){this.EE.addListener(e,t)}},{key:"unsubscribe",value:function(e,t){this.EE.removeListener(e,t)}}]),e}()),E=n(2),w=n(64),k=n(1),O=n.n(k),j=n(5),N=n(4);function C(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return window.localStorage.getItem(e)||t}function P(e,t){return window.localStorage.setItem(e,t)}function S(){}function T(e){return L.apply(this,arguments)}function L(){return(L=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,t;case 3:return n=e.sent,e.abrupt("return",[n,null]);case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",[null,e.t0]);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function R(e,t){var n,a=[],r=[],c=Object(j.a)(e);try{for(c.s();!(n=c.n()).done;){var o=n.value;t(o)?a.push(o):r.push(o)}}catch(s){c.e(s)}finally{c.f()}return[a,r]}function D(e){var t=Object(w.a)(e),n=Object(E.a)(t,2),r=n[0],c=n[1];return[r,Object(a.useMemo)((function(){return function(e,t){"string"===typeof e?c((function(n){var a=t;n[e]=a})):"function"===typeof e?c(e):"object"===typeof e&&c((function(t){for(var n=e,a=0,r=Object.keys(n);a0&&void 0!==arguments[0]&&arguments[0],t=Object(a.useState)(e),n=Object(E.a)(t,2),r=n[0],c=n[1];function o(){c(!1)}function s(){c(!0)}return{visible:r,hide:o,show:s}}function A(e){var t=e.title,n=e.children,r=e.className,c=e.style;return a.createElement("header",{className:u()("header",r),style:c},a.createElement("h1",null,t),a.createElement("div",{className:"operations"},n))}var B=n(6);function H(e){var t=e.type,n=e.size,r=void 0===n?14:n,c=e.className,o=e.style,s=u()("clash-iconfont","icon-".concat(t),c),i=Object(B.a)({fontSize:r},o),l=Object(B.a)(Object(B.a)({},e),{},{className:s,style:i});return a.createElement("i",l)}function M(e){var t=e.className,n=e.checked,r=void 0!==n&&n,c=e.disabled,o=void 0!==c&&c,s=e.onChange,i=void 0===s?S:s,l=u()("switch",{checked:r,disabled:o},t);return a.createElement("div",{className:l,onClick:function(){o||i(!r)}},a.createElement(H,{className:"switch-icon",type:"check",size:20,style:{fontWeight:"bold"}}))}function U(e){var t=e.className,n=e.style,r=e.children;return a.createElement("div",{className:u()("card",t),style:n},r)}function z(e){var t=e.gutter,n=void 0===t?24:t,r=e.align,c=void 0===r?"top":r,o=e.justify,s=void 0===o?"start":o,i=e.className,l=e.style,p=e.children;return a.createElement("div",{className:u()("row","row-gutter-".concat(n),"row-align-".concat(c),"row-justify-".concat(s),i),style:l},p)}function W(e){var t=e.offset,n=void 0===t?0:t,r=e.order,c=void 0===r?0:r,o=e.span,s=void 0===o?1:o,i=e.className,l=e.style,p=e.children,d=Object.assign({},{order:c},l);return a.createElement("div",{className:u()("column","column-offset-".concat(n),"column-span-".concat(s),i),style:d},p)}function F(e){var t=e.options,n=e.value,r=e.onSelect;return a.createElement("div",{className:"button-select"},t.map((function(e){return a.createElement("button",{value:e.value,key:e.value,className:u()("button-select-options",{actived:n===e.value}),onClick:function(){return null===r||void 0===r?void 0:r(e.value)}},e.label)})))}var _=n(65),G=n.n(_),J=n(19),V={en_US:{SideBar:{Proxies:"Proxies",Overview:"Overview",Logs:"Logs",Rules:"Rules",Settings:"Setting",Connections:"Connections",Version:"Version"},Settings:{title:"Settings",labels:{startAtLogin:"Start at login",language:"language",setAsSystemProxy:"Set as system proxy",allowConnectFromLan:"Allow connect from Lan",proxyMode:"Mode",socks5ProxyPort:"Socks5 proxy port",httpProxyPort:"HTTP proxy port",mixedProxyPort:"Mixed proxy port",externalController:"External controller"},values:{cn:"\u4e2d\u6587",en:"English",global:"Global",rules:"Rules",direct:"Direct",script:"Script"},versionString:"Current ClashX is the latest version\uff1a{{version}}",checkUpdate:"Check Update",externalControllerSetting:{title:"External Controller",note:"Please note that modifying this configuration will only configure Dashboard. Will not modify your Clash configuration file. Please make sure that the external controller address matches the address in the Clash configuration file, otherwise, Dashboard will not be able to connect to Clash.",host:"Host",port:"Port",secret:"Secret"}},Logs:{title:"Logs"},Rules:{title:"Rules",providerTitle:"Providers",providerUpdateTime:"Last updated at",ruleCount:"Rule count"},Connections:{title:"Connections",keepClosed:"Keep closed connections",total:{text:"total",upload:"upload",download:"download"},closeAll:{title:"Warning",content:"This would close all connections"},filter:{all:"All"},columns:{host:"Host",network:"Network",type:"Type",chains:"Chains",rule:"Rule",time:"Time",speed:"Speed",upload:"Upload",download:"Download",sourceIP:"Source IP"}},Proxies:{title:"Proxies",editDialog:{title:"Edit Proxy",color:"Color",name:"Name",type:"Type",server:"Server",port:"Port",password:"Password",cipher:"Cipher",obfs:"Obfs","obfs-host":"Obfs-host",uuid:"UUID",alterId:"AlterId",tls:"TLS"},groupTitle:"Policy Group",providerTitle:"Providers",providerUpdateTime:"Last updated at",expandText:"Expand",collapseText:"Collapse",speedTestText:"Speed Test",breakConnectionsText:"Close connections which include the group"},Modal:{ok:"Ok",cancel:"Cancel"}},zh_CN:{SideBar:{Proxies:"\u4ee3\u7406",Overview:"\u603b\u89c8",Logs:"\u65e5\u5fd7",Rules:"\u89c4\u5219",Settings:"\u8bbe\u7f6e",Connections:"\u8fde\u63a5",Version:"\u7248\u672c"},Settings:{title:"\u8bbe\u7f6e",labels:{startAtLogin:"\u5f00\u673a\u65f6\u542f\u52a8",language:"\u8bed\u8a00",setAsSystemProxy:"\u8bbe\u7f6e\u4e3a\u7cfb\u7edf\u4ee3\u7406",allowConnectFromLan:"\u5141\u8bb8\u6765\u81ea\u5c40\u57df\u7f51\u7684\u8fde\u63a5",proxyMode:"\u4ee3\u7406\u6a21\u5f0f",socks5ProxyPort:"Socks5 \u4ee3\u7406\u7aef\u53e3",httpProxyPort:"HTTP \u4ee3\u7406\u7aef\u53e3",mixedProxyPort:"\u6df7\u5408\u4ee3\u7406\u7aef\u53e3",externalController:"\u5916\u90e8\u63a7\u5236\u8bbe\u7f6e"},values:{cn:"\u4e2d\u6587",en:"English",global:"\u5168\u5c40",rules:"\u89c4\u5219",direct:"\u76f4\u8fde",script:"\u811a\u672c"},versionString:"\u5f53\u524d ClashX \u5df2\u662f\u6700\u65b0\u7248\u672c\uff1a{{version}}",checkUpdate:"\u68c0\u67e5\u66f4\u65b0",externalControllerSetting:{title:"\u7f16\u8f91\u5916\u90e8\u63a7\u5236\u8bbe\u7f6e",note:"\u8bf7\u6ce8\u610f\uff0c\u4fee\u6539\u8be5\u914d\u7f6e\u9879\u5e76\u4e0d\u4f1a\u4fee\u6539\u4f60\u7684 Clash \u914d\u7f6e\u6587\u4ef6\uff0c\u8bf7\u786e\u8ba4\u4fee\u6539\u540e\u7684\u5916\u90e8\u63a7\u5236\u5730\u5740\u548c Clash \u914d\u7f6e\u6587\u4ef6\u5185\u7684\u5730\u5740\u4e00\u81f4\uff0c\u5426\u5219\u4f1a\u5bfc\u81f4 Dashboard \u65e0\u6cd5\u8fde\u63a5\u3002",host:"Host",port:"\u7aef\u53e3",secret:"\u5bc6\u94a5"}},Logs:{title:"\u65e5\u5fd7"},Rules:{title:"\u89c4\u5219",providerTitle:"\u89c4\u5219\u96c6",providerUpdateTime:"\u6700\u540e\u66f4\u65b0\u4e8e",ruleCount:"\u89c4\u5219\u6761\u6570"},Connections:{title:"\u8fde\u63a5",keepClosed:"\u4fdd\u7559\u5173\u95ed\u8fde\u63a5",total:{text:"\u603b\u91cf",upload:"\u4e0a\u4f20",download:"\u4e0b\u8f7d"},closeAll:{title:"\u8b66\u544a",content:"\u5c06\u4f1a\u5173\u95ed\u6240\u6709\u8fde\u63a5"},filter:{all:"\u5168\u90e8"},columns:{host:"\u57df\u540d",network:"\u7f51\u7edc",type:"\u7c7b\u578b",chains:"\u8282\u70b9\u94fe",rule:"\u89c4\u5219",time:"\u8fde\u63a5\u65f6\u95f4",speed:"\u901f\u7387",upload:"\u4e0a\u4f20",download:"\u4e0b\u8f7d",sourceIP:"\u6765\u6e90 IP"}},Proxies:{title:"\u4ee3\u7406",editDialog:{title:"\u7f16\u8f91\u4ee3\u7406",color:"\u989c\u8272",name:"\u540d\u5b57",type:"\u7c7b\u578b",server:"\u670d\u52a1\u5668",port:"\u7aef\u53e3",password:"\u5bc6\u7801",cipher:"\u52a0\u5bc6\u65b9\u5f0f",obfs:"Obfs","obfs-host":"Obfs-host",uuid:"UUID",alterId:"AlterId",tls:"TLS"},groupTitle:"\u7b56\u7565\u7ec4",providerTitle:"\u4ee3\u7406\u96c6",providerUpdateTime:"\u6700\u540e\u66f4\u65b0\u4e8e",expandText:"\u5c55\u5f00",collapseText:"\u6536\u8d77",speedTestText:"\u6d4b\u901f",breakConnectionsText:"\u5207\u6362\u65f6\u6253\u65ad\u5305\u542b\u7b56\u7565\u7ec4\u7684\u8fde\u63a5"},Modal:{ok:"\u786e \u5b9a",cancel:"\u53d6 \u6d88"}}},X="language",Y=Object.keys(V);var K=n(22);function q(e){var t=Object(s.d)(e),n=Object(E.a)(t,2),r=n[0],c=n[1];return[r,Object(a.useMemo)((function(){return function(e,t){if("string"===typeof e)c((function(n){return Object(K.a)(n,(function(n){var a=t;n[e]=a}))}));else if("function"===typeof e){var n=e;c((function(e){return Object(K.a)(e,n)}))}else"object"===typeof e&&c((function(t){return Object(K.a)(t,(function(t){for(var n=e,a=0,r=Object.keys(n);a0&&(t.innerBuffer.push(n),t.innerBuffer.length>t.config.bufferLength&&t.innerBuffer.splice(0,t.innerBuffer.length-t.config.bufferLength))})),a.addEventListener("close",(function(){return setTimeout(t.websocketLoop,t.config.retryInterval)})),a.addEventListener("error",(function(e){t.EE.emit("error",e),setTimeout(t.websocketLoop,t.config.retryInterval)}))}},{key:"loop",value:function(){var e=Object(N.a)(O.a.mark((function e(){var t,n,a,r,c,o,s,i,l,u,p,d,m;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T(fetch(this.config.url,{mode:"cors",headers:this.config.token?{Authorization:"Bearer ".concat(this.config.token)}:{}}));case 2:if(t=e.sent,n=Object(E.a)(t,2),a=n[0],!(r=n[1])&&a.body){e.next=9;break}return this.retry(r),e.abrupt("return");case 9:c=a.body.getReader(),o=new TextDecoder;case 11:if(!this.isClose){e.next=14;break}return e.abrupt("break",29);case 14:return e.next=16,T(null===c||void 0===c?void 0:c.read());case 16:if(s=e.sent,i=Object(E.a)(s,2),l=i[0].value,!(u=i[1])){e.next=23;break}return this.retry(u),e.abrupt("break",29);case 23:p=o.decode(l).trim().split("\n"),d=p.map((function(e){return JSON.parse(e)})),this.EE.emit("data",d),this.config.bufferLength>0&&((m=this.innerBuffer).push.apply(m,Object(ee.a)(d)),this.innerBuffer.length>this.config.bufferLength&&this.innerBuffer.splice(0,this.innerBuffer.length-this.config.bufferLength)),e.next=11;break;case 29:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}()},{key:"retry",value:function(e){this.isClose||(this.EE.emit("error",e),window.setTimeout(this.loop,this.config.retryInterval))}},{key:"subscribe",value:function(e,t){this.EE.addListener(e,t)}},{key:"unsubscribe",value:function(e,t){this.EE.removeListener(e,t)}},{key:"buffer",value:function(){return this.innerBuffer.slice()}},{key:"destory",value:function(){this.EE.removeAllListeners(),this.isClose=!0}}]),e}();function ne(){return ae.apply(this,arguments)}function ae(){return(ae=Object(N.a)(O.a.mark((function e(){var t,n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!m()){e.next=5;break}return e.next=3,f.getAPIInfo();case 3:return t=e.sent,e.abrupt("return",{hostname:t.host,port:t.port,secret:t.secret});case 5:if(n=C("externalControllerAddr","127.0.0.1"),a=C("externalControllerPort","9090"),r=C("secret",""),n&&a){e.next=10;break}throw new Error("can't get hostname or port");case 10:return e.abrupt("return",{hostname:n,port:a,secret:r});case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var re=$(Object(N.a)(O.a.mark((function e(){var t,n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:return t=e.sent,n=t.hostname,a=t.port,r=t.secret,e.abrupt("return",Z.a.create({baseURL:"//".concat(n,":").concat(a),headers:r?{Authorization:"Bearer ".concat(r)}:{}}));case 7:case"end":return e.stop()}}),e)}))));function ce(){return oe.apply(this,arguments)}function oe(){return(oe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("configs"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.patch("configs",t));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(){return ue.apply(this,arguments)}function ue(){return(ue=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("rules"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(){return de.apply(this,arguments)}function de(){return(de=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("providers/proxies",{validateStatus:function(e){return e>=200&&e<300||404===e}}).then((function(e){return 404===e.status&&(e.data={providers:{}}),e})));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(){return fe.apply(this,arguments)}function fe(){return(fe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("providers/rules"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ve(){return(ve=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.put("providers/proxies/".concat(encodeURIComponent(t))));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function he(){return(he=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.put("providers/rules/".concat(encodeURIComponent(t))));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function be(){return(be=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.get("providers/proxies/".concat(encodeURIComponent(t),"/healthcheck")));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ye(){return ge.apply(this,arguments)}function ge(){return(ge=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("proxies"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function xe(){return Ee.apply(this,arguments)}function Ee(){return(Ee=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("version"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function we(e){return ke.apply(this,arguments)}function ke(){return(ke=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.get("proxies/".concat(encodeURIComponent(t),"/delay"),{params:{timeout:5e3,url:"http://www.gstatic.com/generate_204"}}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Oe(){return(Oe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.delete("connections"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function je(e){return Ne.apply(this,arguments)}function Ne(){return(Ne=Object(N.a)(O.a.mark((function e(t){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return n=e.sent,e.abrupt("return",n.delete("connections/".concat(t)));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ce(){return Pe.apply(this,arguments)}function Pe(){return(Pe=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return t=e.sent,e.abrupt("return",t.get("connections"));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Se(e,t){return Te.apply(this,arguments)}function Te(){return(Te=Object(N.a)(O.a.mark((function e(t,n){var a;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re();case 2:return a=e.sent,e.abrupt("return",a.put("proxies/".concat(encodeURIComponent(t)),{name:n}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Le=$(Object(N.a)(O.a.mark((function e(){var t,n,a,r,c,o,s,i,l,u;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:return t=e.sent,e.next=5,ce();case 5:return n=e.sent,a=n.data,e.next=9,T(xe());case 9:return r=e.sent,c=Object(E.a)(r,2),o=c[0],s=c[1],i=s?"unkonwn version":o.data.version,l=!!i||!0,u="".concat(window.location.protocol,"//").concat(t.hostname,":").concat(t.port,"/logs?level=").concat(a["log-level"]),e.abrupt("return",new te({url:u,bufferLength:200,token:t.secret,useWebsocket:l}));case 17:case"end":return e.stop()}}),e)})))),Re=$(Object(N.a)(O.a.mark((function e(){var t,n,a,r,c,o,s,i;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:return t=e.sent,e.next=5,T(xe());case 5:return n=e.sent,a=Object(E.a)(n,2),r=a[0],c=a[1],o=c?"unkonwn version":r.data.version,s=!!o||!0,i="".concat(window.location.protocol,"//").concat(t.hostname,":").concat(t.port,"/connections"),e.abrupt("return",new te({url:i,bufferLength:200,token:t.secret,useWebsocket:s}));case 13:case"end":return e.stop()}}),e)})))),De=Object(s.b)({key:"identity",default:!0});function Ie(){var e=Object(s.d)(De),t=Object(E.a)(e,2),n=t[0],a=t[1];return{identity:n,wrapFetcher:function(e){return Object(N.a)(O.a.mark((function t(){var n,r,c,o,s,i=arguments;return O.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,T(e.apply(void 0,i));case 2:if(n=t.sent,r=Object(E.a)(n,2),c=r[0],o=r[1],!(s=o)||s.response&&401!==s.response.status){t.next=10;break}throw a(!1),o;case 10:return a(!0),t.abrupt("return",c);case 12:case"end":return t.stop()}}),t)})))},set:a}}var Ae=Object(s.b)({key:"i18n",default:function(){var e=C(X);if(e&&Y.includes(e))return e;var t,n=function(){var e=[];if(window.navigator)if(window.navigator.languages){var t,n=Object(j.a)(window.navigator.languages);try{for(n.s();!(t=n.n()).done;){var a=t.value;e.push(a)}}catch(r){n.e(r)}finally{n.f()}}else window.navigator.language&&e.push(navigator.language);return e}(),a=Object(j.a)(n);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.includes("zh"))return"zh_CN";if(r.includes("us"))return"en_US"}}catch(c){a.e(c)}finally{a.f()}return"en_US"}()});function Be(){var e=Object(s.d)(Ae),t=Object(E.a)(e,2),n=t[0],r=t[1];var c=Object(a.useCallback)((function(e){return{t:function(t){return G()(V[n][e],t)}}}),[n]);return{lang:n,locales:Y,setLang:function(e){r(e),function(e){P(X,e)}(e)},translation:c}}var He=Object(s.b)({key:"version",default:{version:"",premium:!1}});function Me(){var e=Object(s.d)(He),t=Object(E.a)(e,2),n=t[0],a=t[1],r=Ie().set;function c(){return(c=Object(N.a)(O.a.mark((function e(){var t,n,c,o;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T(xe());case 2:t=e.sent,n=Object(E.a)(t,2),c=n[0],o=n[1],r(!o),a(o?{version:"",premium:!1}:{version:c.data.version,premium:!!c.data.premium});case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{version:n.version,premium:n.premium,update:function(){return c.apply(this,arguments)}}}var Ue=Object(s.b)({key:"config",default:{breakConnections:!1}});function ze(){var e=q(Ue),t=Object(E.a)(e,2);return{data:t[0],set:t[1]}}var We=Object(s.b)({key:"proxyProvider",default:[]});function Fe(){var e=Object(s.d)(We),t=Object(E.a)(e,2),n=t[0],r=t[1],c=Object(J.a)("/providers/proxy",Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,pe();case 2:return t=e.sent,e.abrupt("return",Object.keys(t.data.providers).map((function(e){return t.data.providers[e]})).filter((function(e){return"default"!==e.name})).filter((function(e){return"Compatible"!==e.vehicleType})));case 4:case"end":return e.stop()}}),e)})))),o=c.data,i=c.mutate;return Object(a.useEffect)((function(){return r(null!==o&&void 0!==o?o:[])}),[o,r]),{providers:n,update:i}}function _e(){var e=Object(s.d)(He),t=Object(E.a)(e,1)[0].premium,n=Object(J.a)("/providers/rule",Object(N.a)(O.a.mark((function e(){var n;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,me();case 4:return n=e.sent,e.abrupt("return",Object.keys(n.data.providers).map((function(e){return n.data.providers[e]})));case 6:case"end":return e.stop()}}),e)})))),a=n.data;return{providers:null!==a&&void 0!==a?a:[],update:n.mutate}}function Ge(){var e=Object(J.a)("/config",Object(N.a)(O.a.mark((function e(){var t,n,a;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ce();case 2:return n=e.sent,a=n.data,e.abrupt("return",{port:a.port,socksPort:a["socks-port"],mixedPort:null!==(t=a["mixed-port"])&&void 0!==t?t:0,redirPort:a["redir-port"],mode:a.mode.toLowerCase(),logLevel:a["log-level"],allowLan:a["allow-lan"]});case 5:case"end":return e.stop()}}),e)})))),t=e.data;return{general:null!==t&&void 0!==t?t:{},update:e.mutate}}var Je=Object(s.b)({key:"proxies",default:{proxies:[],groups:[],global:{name:"GLOBAL",type:"Selector",now:"",history:[],all:[]}}});function Ve(){var e=q(Je),t=Object(E.a)(e,2),n=t[0],r=t[1],c=Object(J.a)("/proxies",Object(N.a)(O.a.mark((function e(){var t,n,a,c,o,s,i,l,u;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ye();case 2:t=e.sent,(n=t.data.proxies.GLOBAL).name="GLOBAL",a=new Set(["Selector","URLTest","Fallback","LoadBalance"]),c=new Set(["DIRECT","REJECT","GLOBAL"]),o=n.all.filter((function(e){return!c.has(e)})).map((function(e){return Object(B.a)(Object(B.a)({},t.data.proxies[e]),{},{name:e})})),s=R(o,(function(e){return!a.has(e.type)})),i=Object(E.a)(s,2),l=i[0],u=i[1],r({proxies:l,groups:u,global:n});case 10:case"end":return e.stop()}}),e)})))).mutate,o=Object(a.useCallback)((function(e,t){r((function(n){var a,r=Object(j.a)(n.groups);try{for(r.s();!(a=r.n()).done;){var c=a.value;c.name===e&&(c.now=t)}}catch(o){r.e(o)}finally{r.f()}}))}),[r]);return{proxies:n.proxies,groups:n.groups,global:n.global,update:c,markProxySelected:o,set:r}}var Xe=Object(s.c)({key:"proxyMapping",get:function(e){var t,n=e.get,a=n(Je),r=n(We),c=new Map,o=Object(j.a)(a.proxies);try{for(o.s();!(t=o.n()).done;){var s=t.value;c.set(s.name,s)}}catch(f){o.e(f)}finally{o.f()}var i,l=Object(j.a)(r);try{for(l.s();!(i=l.n()).done;){var u,p=i.value,d=Object(j.a)(p.proxies);try{for(d.s();!(u=d.n()).done;){var m=u.value;c.set(m.name,m)}}catch(f){d.e(f)}finally{d.f()}}}catch(f){l.e(f)}finally{l.f()}return c}});function Ye(){var e=Object(J.a)("/clashx",Object(N.a)(O.a.mark((function e(){var t,n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(m()){e.next=2;break}return e.abrupt("return",{isClashX:!1,startAtLogin:!1,systemProxy:!1});case 2:return e.next=4,null===f||void 0===f?void 0:f.getStartAtLogin();case 4:if(e.t1=t=e.sent,e.t0=null!==e.t1,!e.t0){e.next=8;break}e.t0=void 0!==t;case 8:if(!e.t0){e.next=12;break}e.t2=t,e.next=13;break;case 12:e.t2=!1;case 13:return a=e.t2,e.next=16,null===f||void 0===f?void 0:f.isSystemProxySet();case 16:if(e.t4=n=e.sent,e.t3=null!==e.t4,!e.t3){e.next=20;break}e.t3=void 0!==n;case 20:if(!e.t3){e.next=24;break}e.t5=n,e.next=25;break;case 24:e.t5=!1;case 25:return r=e.t5,e.abrupt("return",{startAtLogin:a,systemProxy:r,isClashX:!0});case 27:case"end":return e.stop()}}),e)}))));return{data:e.data,update:e.mutate}}var Ke=Object(s.b)({key:"apiData",default:{hostname:"127.0.0.1",port:"9090",secret:""}});function qe(){var e=Object(s.d)(Ke),t=Object(E.a)(e,2),n=t[0],r=t[1];function c(){return(c=Object(N.a)(O.a.mark((function e(t){var n,a,r;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=t.hostname,a=t.port,r=t.secret,P("externalControllerAddr",n),P("externalControllerPort",a),P("secret",r),window.location.reload();case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{data:n,fetch:Object(a.useCallback)(function(){var e=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ne();case 2:t=e.sent,r(Object(B.a)({},t));case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),[r]),update:function(e){return c.apply(this,arguments)}}}var Qe=Object(s.b)({key:"rules",default:[]});function Ze(e){var t=e.className,n=e.data,c=e.onClick,o=e.select,s=e.canClick,i=e.errSet,l=e.rowHeight,p=(0,Be().translation)("Proxies").t,d=Object(a.useState)(!1),m=Object(E.a)(d,2),f=m[0],v=m[1],h=Object(a.useState)(!1),b=Object(E.a)(h,2),y=b[0],g=b[1],x=Object(a.useRef)(null);Object(a.useLayoutEffect)((function(){var e,t;g((null!==(e=null===x||void 0===x||null===(t=x.current)||void 0===t?void 0:t.offsetHeight)&&void 0!==e?e:0)>30)}),[]);var w=f?"auto":l,k=s?c:S;var O=n.map((function(e){var t=u()({"tags-selected":o===e,"can-click":s,error:null===i||void 0===i?void 0:i.has(e)});return r.a.createElement("li",{className:t,key:e,onClick:function(){return k(e)}},e)}));return r.a.createElement("div",{className:u()("tags-container",t),style:{height:w}},r.a.createElement("ul",{ref:x,className:u()("tags",{expand:f})},O),y&&r.a.createElement("span",{className:"tags-expand",onClick:function(){v(!f)}},p(f?"collapseText":"expandText")))}function $e(e){var t=e.className,n=e.style,r=e.value,c=void 0===r?"":r,o=e.align,s=void 0===o?"center":o,i=e.inside,l=void 0!==i&&i,p=e.autoFocus,d=void 0!==p&&p,m=e.type,f=void 0===m?"text":m,v=e.disabled,h=void 0!==v&&v,b=e.onChange,y=void 0===b?S:b,g=e.onBlur,x=void 0===g?S:g,E=u()("input","input-align-".concat(s),{"input-inside":l},t);return a.createElement("input",{disabled:h,className:E,style:n,value:c,autoFocus:d,type:f,onChange:function(e){return y(e.target.value,e)},onBlur:x})}function et(e){var t=e.show,n=void 0===t||t,o=e.title,s=void 0===o?"Modal":o,i=e.size,l=void 0===i?"small":i,p=e.footer,d=void 0===p||p,m=e.onOk,f=void 0===m?S:m,v=e.onClose,h=void 0===v?S:v,b=e.bodyClassName,y=e.bodyStyle,g=e.className,x=e.style,E=e.children,w=(0,Be().translation)("Modal").t,k=Object(a.useRef)(document.createElement("div")),O=Object(a.useRef)(null);Object(a.useLayoutEffect)((function(){var e=k.current;return document.body.appendChild(e),function(){document.body.removeChild(e)}}),[]);var j=r.a.createElement("div",{className:u()("modal-mask",{"modal-show":n}),ref:O,onMouseDown:function(e){e.target===O.current&&h()}},r.a.createElement("div",{className:u()("modal","modal-".concat(l),g),style:x},r.a.createElement("div",{className:"modal-title"},s),r.a.createElement("div",{className:u()("modal-body",b),style:y},E),d&&r.a.createElement("div",{className:"footer"},r.a.createElement(at,{onClick:function(){return h()}},w("cancel")),r.a.createElement(at,{type:"primary",onClick:function(){return f()}},w("ok")))));return Object(c.createPortal)(j,k.current)}var tt={success:"check",info:"info",warning:"info",error:"close"};function nt(e){var t=e.message,n=void 0===t?"":t,a=e.type,c=void 0===a?"info":a,o=e.inside,s=void 0!==o&&o,i=e.children,l=e.className,p=e.style,d=u()("alert","alert-".concat(s?"note":"box","-").concat(c),l);return r.a.createElement("div",{className:d,style:p},r.a.createElement("span",{className:"alert-icon"},r.a.createElement(H,{type:tt[c],size:26})),n?r.a.createElement("p",{className:"alert-message"},n):r.a.createElement("div",{className:"alert-message"},i))}function at(e){var t=e.type,n=void 0===t?"normal":t,r=e.onClick,c=void 0===r?S:r,o=e.children,s=e.className,i=e.style,l=u()("button","button-".concat(n),s);return a.createElement("button",{className:l,style:i,onClick:c},o)}function rt(e){var t=e.className,n=e.checked,r=void 0!==n&&n,c=e.onChange,o=void 0===c?S:c,s=u()("checkbox",{checked:r},t);return a.createElement("div",{className:s,onClick:function(){o(!r)}},a.createElement(H,{className:"checkbox-icon",type:"check",size:18}),a.createElement("div",null,e.children))}function ct(e){var t=e.color,n=e.className,r=e.style,c=u()("tag",n),o=Object(B.a)({color:t},r),s=Object(B.a)(Object(B.a)({},e),{},{className:c,style:o});return a.createElement("span",s,e.children)}function ot(e){var t=u()("spinner",e.className);return a.createElement("div",{className:t},a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})),a.createElement("div",{className:"spinner-circle"},a.createElement("div",{className:"spinner-inner"})))}function st(e){var t=u()("loading","visible",e.className);return e.visible?r.a.createElement("div",{className:t},r.a.createElement(ot,{className:e.spinnerClassName})):null}var it={"#909399":0,"#00c520":260,"#ff9a28":600,"#ff3e5e":1/0};function lt(e){return ut.apply(this,arguments)}function ut(){return(ut=Object(N.a)(O.a.mark((function e(t){var n,a,r,c;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!m()){e.next=14;break}return e.next=3,null===f||void 0===f?void 0:f.getProxyDelay(t);case 3:if(e.t1=n=e.sent,e.t0=null!==e.t1,!e.t0){e.next=7;break}e.t0=void 0!==n;case 7:if(!e.t0){e.next=11;break}e.t2=n,e.next=12;break;case 11:e.t2=0;case 12:return a=e.t2,e.abrupt("return",a);case 14:return e.next=16,we(t);case 16:return r=e.sent,c=r.data.delay,e.abrupt("return",c);case 19:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pt(e){var t=e.config,n=e.className,c=Ve().set,o=Object(a.useCallback)(Object(N.a)(O.a.mark((function e(){var n,a,r,o,s;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T(lt(t.name));case 2:n=e.sent,a=Object(E.a)(n,2),r=a[0],o=a[1],s=o?0:r,c((function(e){var n=e.proxies.find((function(e){return e.name===t.name}));n&&n.history.push({time:Date.now().toString(),delay:s})}));case 8:case"end":return e.stop()}}),e)}))),[t.name,c]),s=Object(a.useMemo)((function(){var e;return(null===(e=t.history)||void 0===e?void 0:e.length)?t.history.slice(-1)[0].delay:0}),[t]);Object(a.useLayoutEffect)((function(){return x.subscribe(h.SPEED_NOTIFY,o),function(){return x.unsubscribe(h.SPEED_NOTIFY,o)}}),[o]);var i=Object(a.useMemo)((function(){return 0===s}),[s]),l=Object(a.useMemo)((function(){return Object.keys(it).find((function(e){return s<=it[e]}))}),[s]),p=i?void 0:l;return r.a.createElement("div",{className:u()("proxy-item",{"proxy-error":i},n)},r.a.createElement("span",{className:"proxy-type",style:{backgroundColor:p}},t.type),r.a.createElement("p",{className:"proxy-name"},t.name),r.a.createElement("p",{className:"proxy-delay"},0===s?"-":"".concat(s,"ms")))}function dt(e){var t=Ve().markProxySelected,n=Object(s.e)(Xe),c=ze().data,o=e.config;function i(){return(i=Object(N.a)(O.a.mark((function n(a){var r,o,s,i,l,u,p;return O.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,Se(e.config.name,a);case 2:if(t(e.config.name,a),!c.breakConnections){n.next=11;break}return r=[],n.next=7,Ce();case 7:o=n.sent,s=Object(j.a)(o.data.connections);try{for(s.s();!(i=s.n()).done;)(l=i.value).chains.includes(e.config.name)&&r.push(l.id)}catch(d){s.e(d)}finally{s.f()}for(u=0,p=r;u1&&void 0!==arguments[1]?arguments[1]:0;if(e.length<2)throw new Error("List requires at least two elements");var n=Object(a.useState)(t),r=Object(E.a)(n,2),c=r[0],o=r[1];function s(){o((c+1)%e.length)}return{current:Object(a.useMemo)((function(){return e[c]}),[e,c]),next:s}}([ft.Asc,ft.Desc,ft.None]),c=n.current,o=n.next,s=Object(a.useMemo)((function(){switch(c){case ft.Desc:return e.slice().sort((function(e,t){return wt(e,t)}));case ft.Asc:return e.slice().sort((function(e,t){return-1*wt(e,t)}));default:return e.slice()}}),[c,e]),i=o;return r.a.createElement(r.a.Fragment,null,0!==s.length&&r.a.createElement("div",{className:"proxies-container"},r.a.createElement(A,{title:t("title")},r.a.createElement(H,{className:"proxies-action-icon",type:Et[c],onClick:i,size:20}),r.a.createElement(H,{className:"proxies-action-icon",type:"speed",size:20}),r.a.createElement("span",{className:"proxies-speed-test",onClick:function(){x.notifySpeedTest()}},t("speedTestText"))),r.a.createElement("ul",{className:"proxies-list"},s.map((function(e){return r.a.createElement("li",{key:e.name},r.a.createElement(pt,{config:e}))})))))}function Nt(){return r.a.createElement("div",{className:"page"},r.a.createElement(kt,null),r.a.createElement(Ot,null),r.a.createElement(jt,null))}function Ct(){var e=Object(a.useRef)(null),t=Object(a.useRef)([]),n=Object(a.useState)([]),c=Object(E.a)(n,2),o=c[0],s=c[1],i=(0,Be().translation)("Logs").t;return Object(a.useLayoutEffect)((function(){var t=e.current;t&&(t.scrollTop=t.scrollHeight)})),Object(a.useEffect)((function(){var e=null;function n(e){t.current=t.current.slice().concat(e.map((function(e){return Object(B.a)(Object(B.a)({},e),{},{time:new Date})}))),s(t.current)}return Object(N.a)(O.a.mark((function a(){return O.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,Le();case 2:e=a.sent,t.current=e.buffer(),s(t.current),e.subscribe("data",n);case 6:case"end":return a.stop()}}),a)})))(),function(){var t;return null===(t=e)||void 0===t?void 0:t.unsubscribe("data",n)}}),[]),r.a.createElement("div",{className:"page"},r.a.createElement(A,{title:i("title")}),r.a.createElement(U,{className:"logs-card"},r.a.createElement("ul",{className:"logs-panel",ref:e},o.map((function(e,t){return r.a.createElement("li",{key:t},r.a.createElement("span",{className:"logs-panel-time"},ht()(e.time).format("YYYY-MM-DD HH:mm:ss")),r.a.createElement("span",null,"[",e.type,"] ",e.payload))})))))}var Pt=n(73),St=n(68);function Tt(e){var t=_e().update,n=Be(),r=n.translation,c=n.lang,o=e.provider,s=r("Rules").t,i=I(),l=i.visible,p=i.hide,d=i.show;var m=u()("rule-provider-icon",{"rule-provider-loading":l});return a.createElement(U,{className:"rule-provider"},a.createElement("div",{className:"rule-provider-header"},a.createElement("div",{className:"rule-provider-header-part"},a.createElement("span",{className:"rule-provider-name"},o.name),a.createElement(ct,null,o.vehicleType),a.createElement(ct,{className:"rule-provider-behavior"},o.behavior),a.createElement("span",{className:"rule-provider-update"},"".concat(s("ruleCount"),": ").concat(o.ruleCount))),a.createElement("div",{className:"rule-provider-header-part"},o.updatedAt&&a.createElement("span",{className:"rule-provider-update"},"".concat(s("providerUpdateTime"),": ").concat(gt(new Date(o.updatedAt),c))),a.createElement(H,{className:m,type:"update",size:18,onClick:function(){d(),function(e){return he.apply(this,arguments)}(o.name).then((function(){return t()})).finally((function(){return p()}))}}))))}function Lt(){var e=_e().providers,t=(0,Be().translation)("Rules").t;return r.a.createElement(r.a.Fragment,null,0!==e.length&&r.a.createElement("div",{className:"proxies-container"},r.a.createElement(A,{title:t("providerTitle")}),r.a.createElement("ul",{className:"proxies-providers-list"},e.map((function(e){return r.a.createElement("li",{className:"proxies-providers-item",key:e.name},r.a.createElement(Tt,{provider:e}))})))))}function Rt(){var e=function(){var e=q(Qe),t=Object(E.a)(e,2),n=t[0],a=t[1];function r(){return(r=Object(N.a)(O.a.mark((function e(){var t;return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,le();case 2:t=e.sent,a(t.data.rules);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{rules:n,update:function(){return r.apply(this,arguments)}}}(),t=e.rules,n=e.update,a=(0,Be().translation)("Rules").t;function c(e){var n=e.index,a=e.style,c=t[n];return r.a.createElement("li",{className:"rule-item",style:a},r.a.createElement(z,{className:"rule-item-row",gutter:24,align:"middle"},r.a.createElement(W,{className:"rule-type",span:6,offset:1},c.type),r.a.createElement(W,{className:"payload",span:11},c.payload),r.a.createElement(W,{className:"rule-proxy",span:6},c.proxy)))}return Object(J.a)("rules",n),r.a.createElement("div",{className:"page"},r.a.createElement(Lt,null),r.a.createElement(A,{title:a("title")}),r.a.createElement(U,{className:"rules-card"},r.a.createElement(St.a,{className:"rules"},(function(e){var n=e.height,a=e.width;return r.a.createElement(Pt.a,{height:n,width:a,itemCount:t.length,itemSize:50},c)}))))}var Dt=n(69),It=n.n(Dt),At=[{label:"\u4e2d\u6587",value:"zh_CN"},{label:"English",value:"en_US"}];function Bt(){var e,t,n,c=Me().premium,o=Ye(),s=o.data,i=o.update,l=Ge(),p=l.general,d=l.update,m=Ie().set,v=qe().data,h=Be(),b=h.translation,y=h.setLang,g=h.lang,x=b("Settings").t,w=D({socks5ProxyPort:7891,httpProxyPort:7890,mixedProxyPort:0}),k=Object(E.a)(w,2),j=k[0],C=k[1];function P(){return(P=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({mode:t});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function S(){return(S=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,null===f||void 0===f?void 0:f.setStartAtLogin(t);case 2:i();case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function T(){return(T=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,null===f||void 0===f?void 0:f.setSystemProxy(t);case 2:i();case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function L(){return(L=Object(N.a)(O.a.mark((function e(){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({port:j.httpProxyPort});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function R(){return(R=Object(N.a)(O.a.mark((function e(){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({"socks-port":j.socks5ProxyPort});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function I(){return(I=Object(N.a)(O.a.mark((function e(){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({"mixed-port":j.mixedProxyPort});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function B(){return(B=Object(N.a)(O.a.mark((function e(t){return O.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,se({"allow-lan":t});case 2:return e.next=4,d();case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}Object(a.useEffect)((function(){var e,t,n;C("socks5ProxyPort",null!==(e=null===p||void 0===p?void 0:p.socksPort)&&void 0!==e?e:0),C("httpProxyPort",null!==(t=null===p||void 0===p?void 0:p.port)&&void 0!==t?t:0),C("mixedProxyPort",null!==(n=null===p||void 0===p?void 0:p.mixedPort)&&void 0!==n?n:0)}),[p,C]);var _=v.hostname,G=v.port,J=p.allowLan,V=p.mode,X=null!==(e=null===s||void 0===s?void 0:s.startAtLogin)&&void 0!==e&&e,Y=null!==(t=null===s||void 0===s?void 0:s.systemProxy)&&void 0!==t&&t,K=null!==(n=null===s||void 0===s?void 0:s.isClashX)&&void 0!==n&&n,q=Object(a.useMemo)((function(){var e=[{label:x("values.global"),value:"Global"},{label:x("values.rules"),value:"Rule"},{label:x("values.direct"),value:"Direct"}];return c&&e.push({label:x("values.script"),value:"Script"}),e}),[x,c]);return r.a.createElement("div",{className:"page"},r.a.createElement(A,{title:x("title")}),r.a.createElement(U,{className:"settings-card"},r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.startAtLogin"))),r.a.createElement(W,{span:8,className:"value-column"},r.a.createElement(M,{disabled:!(null===s||void 0===s?void 0:s.isClashX),checked:X,onChange:function(e){return S.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:8,offset:1},r.a.createElement("span",{className:"label"},x("labels.language"))),r.a.createElement(W,{span:14,className:"value-column"},r.a.createElement(F,{options:At,value:g,onSelect:function(e){y(e)}})))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.setAsSystemProxy"))),r.a.createElement(W,{span:8,className:"value-column"},r.a.createElement(M,{disabled:!K,checked:Y,onChange:function(e){return T.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.allowConnectFromLan"))),r.a.createElement(W,{span:8,className:"value-column"},r.a.createElement(M,{checked:J,onChange:function(e){return B.apply(this,arguments)}}))))),r.a.createElement(U,{className:"settings-card"},r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:8,offset:1},r.a.createElement("span",{className:"label"},x("labels.proxyMode"))),r.a.createElement(W,{span:14,className:"value-column"},r.a.createElement(F,{options:q,value:It()(V),onSelect:function(e){return P.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.socks5ProxyPort"))),r.a.createElement(W,{span:8},r.a.createElement($e,{disabled:K,value:j.socks5ProxyPort,onChange:function(e){return C("socks5ProxyPort",+e)},onBlur:function(){return R.apply(this,arguments)}})))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.httpProxyPort"))),r.a.createElement(W,{span:8},r.a.createElement($e,{disabled:K,value:j.httpProxyPort,onChange:function(e){return C("httpProxyPort",+e)},onBlur:function(){return L.apply(this,arguments)}}))),r.a.createElement(W,{span:12},r.a.createElement(W,{span:14,offset:1},r.a.createElement("span",{className:"label"},x("labels.mixedProxyPort"))),r.a.createElement(W,{span:8},r.a.createElement($e,{disabled:K,value:j.mixedProxyPort,onChange:function(e){return C("mixedProxyPort",+e)},onBlur:function(){return I.apply(this,arguments)}})))),r.a.createElement(z,null,r.a.createElement(W,{span:12},r.a.createElement(W,{span:12,offset:1},r.a.createElement("span",{className:"label"},x("labels.externalController"))),r.a.createElement(W,{className:"external-controller",span:10},r.a.createElement("span",{className:u()({"modify-btn":!K}),onClick:function(){return!K&&m(!1)}},"".concat(_,":").concat(G)))))),r.a.createElement(U,{className:"clash-version",style:{display:"none"}},r.a.createElement("span",{className:"check-icon"},r.a.createElement(H,{type:"check",size:20})),r.a.createElement("p",{className:"version-info"},x("versionString")),r.a.createElement("span",{className:"check-update-btn"},x("checkUpdate"))))}var Ht=n.p+"static/media/logo.45983944.png";function Mt(e){var t=e.routes,n=Be().translation,r=Me(),c=r.version,s=r.premium,i=r.update,l=Ye().data,p=n("SideBar").t;Object(J.a)("version",i);var d=t.map((function(e){var t=e.path,n=e.name,r=e.exact,c=e.noMobile;return a.createElement("li",{className:u()("item",{"no-mobile":c}),key:n},a.createElement(o.b,{to:t,activeClassName:"active",exact:!!r},p(n)))}));return a.createElement("div",{className:"sidebar"},a.createElement("img",{src:Ht,alt:"logo",className:"sidebar-logo"}),a.createElement("ul",{className:"sidebar-menu"},d),a.createElement("div",{className:"sidebar-version"},a.createElement("span",{className:"sidebar-version-label"},"Clash",(null===l||void 0===l?void 0:l.isClashX)&&"X"," ",p("Version")),a.createElement("span",{className:"sidebar-version-text"},c),s&&a.createElement("span",{className:"sidebar-version-label"},"Premium")))}var Ut=n(25),zt=n(152),Wt=n(71),Ft=n(72);function _t(e){var t=Be().translation,n=Object(a.useMemo)((function(){return t("Connections").t}),[t]),c=e.className,o=e.style,s=u()("connections-devices",c);function i(t){var n;null===(n=e.onChange)||void 0===n||n.call(e,t)}return r.a.createElement("div",{className:s,style:o},r.a.createElement("div",{className:u()("connections-devices-item",{selected:""===e.selected}),onClick:function(){return i("")}},n("filter.all")),e.devices.map((function(t){return r.a.createElement("div",{className:u()("connections-devices-item",{selected:e.selected===t.label}),onClick:function(){return i(t.label)}},t.label," (",t.number,")")})))}var Gt,Jt=function(){function e(){Object(p.a)(this,e),this.connections=new Map,this.saveDisconnection=!1}return Object(d.a)(e,[{key:"appendToSet",value:function(e){var t,n=e.reduce((function(e,t){return e.set(t.id,t)}),new Map),a=Object(j.a)(this.connections.keys());try{for(a.s();!(t=a.n()).done;){var r=t.value;if(!n.has(r))if(this.saveDisconnection){var c=this.connections.get(r);c&&(c.completed=!0,c.uploadSpeed=0,c.downloadSpeed=0)}else this.connections.delete(r)}}catch(d){a.e(d)}finally{a.f()}var o,s=Object(j.a)(n.keys());try{for(s.s();!(o=s.n()).done;){var i,l=o.value;if(this.connections.has(l)){var u=this.connections.get(l),p=n.get(l);null===(i=this.connections)||void 0===i||i.set(l,Object(B.a)(Object(B.a)({},p),{},{uploadSpeed:p.upload-u.upload,downloadSpeed:p.download-u.download}))}else this.connections.set(l,Object(B.a)(Object(B.a)({},n.get(l)),{},{uploadSpeed:0,downloadSpeed:0}))}}catch(d){s.e(d)}finally{s.f()}}},{key:"toggleSave",value:function(){if(this.saveDisconnection){this.saveDisconnection=!1;var e,t=Object(j.a)(this.connections.keys());try{for(t.s();!(e=t.n()).done;){var n,a,r=e.value;(null===(n=this.connections)||void 0===n||null===(a=n.get(r))||void 0===a?void 0:a.completed)&&this.connections.delete(r)}}catch(c){t.e(c)}finally{t.f()}}else this.saveDisconnection=!0;return this.saveDisconnection}},{key:"getConnections",value:function(){return Object(ee.a)(this.connections.values())}}]),e}();!function(e){e.Host="host",e.Network="network",e.Type="type",e.Chains="chains",e.Rule="rule",e.Speed="speed",e.Upload="upload",e.Download="download",e.SourceIP="sourceIP",e.Time="time"}(Gt||(Gt={}));var Vt,Xt=new Set([Gt.Network,Gt.Type,Gt.Rule,Gt.Speed,Gt.Upload,Gt.Download,Gt.SourceIP,Gt.Time]);function Yt(e){for(var t=["B","KB","MB","GB","TB"],n=0;~~(e/1024)&&n1&&r.a.createElement(_t,{devices:w,selected:J,onChange:function(e){V(e),null===z||void 0===z||z(Gt.SourceIP,e)}}),r.a.createElement(U,{className:"connections-card"},r.a.createElement("div",Object.assign({},T(),{className:"connections",ref:k}),r.a.createElement("div",Object.assign({},W.getHeaderGroupProps(),{className:"connections-header"}),W.headers.map((function(e,t){var n=e,a=n.id;return r.a.createElement("div",Object.assign({},n.getHeaderProps(),{className:u()("connections-th",{resizing:n.isResizing,fixed:C>0&&n.id===Gt.Host}),key:a}),r.a.createElement("div",n.getSortByToggleProps(),e.render("Header"),n.isSorted?n.isSortedDesc?" \u2193":" \u2191":null),t!==W.headers.length-1&&r.a.createElement("div",Object.assign({},n.getResizerProps(),{className:"connections-resizer"})))}))),r.a.createElement("div",Object.assign({},L(),{className:"connections-body"}),B.map((function(e){return M(e),r.a.createElement("div",Object.assign({},e.getRowProps(),{className:"connections-item",key:e.original.id}),e.cells.map((function(t){var n=u()("connections-block",{center:Xt.has(t.column.id),completed:e.original.completed},{fixed:C>0&&t.column.id===Gt.Host});return r.a.createElement("div",Object.assign({},t.getCellProps(),{className:n,key:t.column.id}),F(t))})))}))))),r.a.createElement(et,{title:c("closeAll.title"),show:d,onClose:f,onOk:function(){(function(){return Oe.apply(this,arguments)})().finally((function(){return f()}))}},c("closeAll.content")))}function qt(){var e=(0,Be().translation)("Settings").t,t=qe(),n=t.data,c=t.update,o=t.fetch,s=Ie(),i=s.identity,l=s.set,u=D({hostname:"",port:"",secret:""}),p=Object(E.a)(u,2),d=p[0],m=p[1];return Object(a.useEffect)((function(){o()}),[o]),Object(a.useEffect)((function(){m({hostname:n.hostname,port:n.port,secret:n.secret})}),[n,m]),r.a.createElement(et,{show:!i,title:e("externalControllerSetting.title"),bodyClassName:"external-controller",onClose:function(){return l(!0)},onOk:function(){var e=d.hostname,t=d.port,n=d.secret;c({hostname:e,port:t,secret:n})}},r.a.createElement(nt,{type:"info",inside:!0},r.a.createElement("p",null,e("externalControllerSetting.note"))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:4,className:"title"},e("externalControllerSetting.host")),r.a.createElement(W,{span:20,className:"form"},r.a.createElement($e,{align:"left",inside:!0,value:d.hostname,onChange:function(e){return m("hostname",e)}}))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:4,className:"title"},e("externalControllerSetting.port")),r.a.createElement(W,{span:20,className:"form"},r.a.createElement($e,{align:"left",inside:!0,value:d.port,onChange:function(e){return m("port",e)}}))),r.a.createElement(z,{gutter:24,align:"middle"},r.a.createElement(W,{span:4,className:"title"},e("externalControllerSetting.secret")),r.a.createElement(W,{span:20,className:"form"},r.a.createElement($e,{align:"left",inside:!0,value:d.secret,onChange:function(e){return m("secret",e)}}))))}function Qt(){Object(a.useEffect)((function(){Le()}),[]);var e=[{path:"/proxies",name:"Proxies",component:Nt},{path:"/logs",name:"Logs",component:Ct},{path:"/rules",name:"Rules",component:Rt,noMobile:!0},{path:"/connections",name:"Connections",component:Kt,noMobile:!0},{path:"/settings",name:"Settings",component:Bt}];return r.a.createElement("div",{className:u()("app",{"not-clashx":!m()})},r.a.createElement(Mt,{routes:e}),r.a.createElement("div",{className:"page-container"},r.a.createElement(i.b,{exact:!0,path:"/",component:function(){return r.a.createElement(i.a,{to:"/proxies"})}}),e.map((function(e){return r.a.createElement(i.b,{exact:!1,path:e.path,key:e.path,component:e.component})}))),r.a.createElement(qt,null))}function Zt(){var e=document.getElementById("root"),t=r.a.createElement(s.a,null,r.a.createElement(o.a,null,r.a.createElement(Qt,null)));Object(c.render)(t,e)}m()?(Vt=function(){return Zt()},f?Vt():f=new v(Vt)):Zt()},59:function(e,t){},60:function(e,t){},61:function(e,t,n){"use strict"},62:function(e,t,n){"use strict";var a;n.d(t,"a",(function(){return a})),function(e){e.Domain="Domain",e.DomainSuffix="DomainSuffix",e.DomainKeyword="DomainKeyword",e.GeoIP="GeoIP",e.IPCIDR="IPCIDR",e.SrcIPCIDR="SrcIPCIDR",e.SrcPort="SrcPort",e.DstPort="DstPort",e.MATCH="MATCH",e.RuleSet="RuleSet"}(a||(a={}))},63:function(e,t,n){"use strict"},72:function(e,t,n){"use strict";var a=n(59);n.o(a,"RuleType")&&n.d(t,"RuleType",(function(){return a.RuleType}));var r=n(60);n.o(r,"RuleType")&&n.d(t,"RuleType",(function(){return r.RuleType}));n(61);var c=n(62);n.d(t,"RuleType",(function(){return c.a}));n(63)}},[[150,1,2]]]); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash.sh index 5bef54a7b4..201fcd4a68 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash.sh @@ -17,6 +17,7 @@ dns_port=$(uci get openclash.config.dns_port 2>/dev/null) enable_redirect_dns=$(uci get openclash.config.enable_redirect_dns 2>/dev/null) disable_masq_cache=$(uci get openclash.config.disable_masq_cache 2>/dev/null) if_restart=0 +only_download=0 urlencode() { local data @@ -29,7 +30,6 @@ urlencode() { } kill_watchdog() { - watchdog_pids=$(unify_ps_pids "openclash_watchdog.sh") for watchdog_pid in $watchdog_pids; do kill -9 "$watchdog_pid" >/dev/null 2>&1 @@ -57,7 +57,7 @@ config_cus_up() fi if [ -z "$subscribe_url_param" ]; then if [ "$servers_update" -eq 1 ] || [ ! -z "$keyword" ] || [ ! -z "$ex_keyword" ]; then - echo "配置文件【$name】替换成功,开始挑选节点..." >$START_LOG + echo "配置文件【$name】替换成功,开始挑选节点..." > $START_LOG uci set openclash.config.config_update_path="/etc/openclash/config/$name.yaml" uci set openclash.config.servers_if_update=1 uci commit openclash @@ -68,30 +68,30 @@ config_cus_up() if [ "$CONFIG_FILE" == "$CONFIG_PATH" ]; then if_restart=1 fi - echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE - echo "配置文件【$name】更新成功!" >$START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE + echo "配置文件【$name】更新成功!" > $START_LOG sleep 3 - echo "" >$START_LOG + echo "" > $START_LOG elif [ "$CONFIG_FILE" == "$CONFIG_PATH" ]; then - echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE - echo "配置文件【$name】更新成功!" >$START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE + echo "配置文件【$name】更新成功!" > $START_LOG sleep 3 if_restart=1 else - echo "配置文件【$name】更新成功!" >$START_LOG - echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE + echo "配置文件【$name】更新成功!" > $START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE sleep 3 - echo "" >$START_LOG + echo "" > $START_LOG fi else if [ "$CONFIG_FILE" == "$CONFIG_PATH" ]; then - echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE - echo "配置文件【$name】更新成功!" >$START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE + echo "配置文件【$name】更新成功!" > $START_LOG sleep 3 if_restart=1 else - echo "配置文件【$name】更新成功!" >$START_LOG - echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE + echo "配置文件【$name】更新成功!" > $START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE sleep 3 echo "" >$START_LOG fi @@ -102,37 +102,51 @@ config_cus_up() config_su_check() { - echo "配置文件下载成功,检查是否有更新..." >$START_LOG + echo "配置文件下载成功,检查是否有更新..." > $START_LOG sed -i 's/! //g' "$CFG_FILE" >/dev/null 2>&1 if [ -f "$CONFIG_FILE" ]; then cmp -s "$BACKPACK_FILE" "$CFG_FILE" if [ "$?" -ne 0 ]; then - echo "配置文件【$name】有更新,开始替换..." >$START_LOG + echo "配置文件【$name】有更新,开始替换..." > $START_LOG mv "$CFG_FILE" "$CONFIG_FILE" 2>/dev/null cp "$CONFIG_FILE" "$BACKPACK_FILE" - config_cus_up + if [ "$only_download" -eq 0 ]; then + config_cus_up + else + echo "配置文件【$name】更新成功!" > $START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE + sleep 3 + echo "" > $START_LOG + fi else - echo "配置文件【$name】没有任何更新,停止继续操作..." >$START_LOG + echo "配置文件【$name】没有任何更新,停止继续操作..." > $START_LOG rm -rf "$CFG_FILE" - echo "${LOGTIME} Updated Config【$name】 No Change, Do Nothing" >>$LOG_FILE + echo "${LOGTIME} Updated Config【$name】 No Change, Do Nothing" >> $LOG_FILE sleep 5 - echo "" >$START_LOG + echo "" > $START_LOG fi else - echo "配置文件下载成功,本地没有配置文件,开始创建 ..." >$START_LOG + echo "配置文件下载成功,本地没有配置文件,开始创建 ..." > $START_LOG mv "$CFG_FILE" "$CONFIG_FILE" 2>/dev/null cp "$CONFIG_FILE" "$BACKPACK_FILE" - config_cus_up + if [ "$only_download" -eq 0 ]; then + config_cus_up + else + echo "配置文件【$name】更新成功!" >$START_LOG + echo "${LOGTIME} Config 【$name】 Update Successful" >> $LOG_FILE + sleep 3 + echo "" > $START_LOG + fi fi } config_error() { - echo "配置文件【$name】下载失败,请检查网络或稍后再试!" >$START_LOG - echo "${LOGTIME} Config 【$name】Update Error" >>$LOG_FILE + echo "配置文件【$name】下载失败,请检查网络或稍后再试!" > $START_LOG + echo "${LOGTIME} Error: Config 【$name】Update Error" >> $LOG_FILE rm -rf "$CFG_FILE" 2>/dev/null sleep 5 - echo "" >$START_LOG + echo "" > $START_LOG } change_dns() @@ -158,12 +172,24 @@ change_dns() config_download_direct() { if pidof clash >/dev/null; then - echo "配置文件【$name】订阅失败,尝试不使用代理下载配置文件..." >$START_LOG kill_watchdog uci del_list dhcp.@dnsmasq[0].server=127.0.0.1#"$dns_port" >/dev/null 2>&1 - uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto >/dev/null 2>&1 + if [ -s "/tmp/resolv.conf.d/resolv.conf.auto" ] && [ -n "$(grep "nameserver" /tmp/resolv.conf.d/resolv.conf.auto)" ]; then + uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.d/resolv.conf.auto >/dev/null 2>&1 + elif [ -s "/tmp/resolv.conf.auto" ] && [ -n "$(grep "nameserver" /tmp/resolv.conf.auto)" ]; then + uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto >/dev/null 2>&1 + else + rm -rf /tmp/resolv.conf.auto 2>/dev/null + touch /tmp/resolv.conf.auto 2>/dev/null + cat >> "/tmp/resolv.conf.auto" <<-EOF +# Interface lan +nameserver 114.114.114.114 +nameserver 119.29.29.29 +EOF + uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto >/dev/null 2>&1 + fi uci set dhcp.@dnsmasq[0].noresolv=0 >/dev/null 2>&1 uci delete dhcp.@dnsmasq[0].cachesize >/dev/null 2>&1 uci commit dhcp @@ -176,8 +202,34 @@ config_download_direct() config_download if [ "$?" -eq 0 ] && [ -s "$CFG_FILE" ]; then - change_dns - config_su_check + ruby -ryaml -E UTF-8 -e " + begin + YAML.load_file('$CFG_FILE'); + rescue Exception => e + puts '${LOGTIME} Error: Unable To Parse Config File ' + e.message + system 'rm -rf ${CFG_FILE} 2>/dev/null' + end + " 2>/dev/null >> $LOG_FILE + if [ $? -ne 0 ]; then + echo "${LOGTIME} Error: Ruby Works Abnormally, Please Check The Ruby Library Depends!" >> $LOG_FILE + echo "Ruby依赖异常,无法校验配置文件,请确认ruby依赖工作正常后重试!" > $START_LOG + sleep 3 + only_download=1 + change_dns + config_su_check + elif [ ! -f "$CFG_FILE" ]; then + echo "配置文件格式校验失败..." > $START_LOG + sleep 3 + config_error + elif ! "$(ruby_read "$CFG_FILE" ".key?('proxies')")" && ! "$(ruby_read "$CFG_FILE" ".key?('proxy-providers')")" ; then + echo "${LOGTIME} Error: Updated Config 【$name】 Has No Proxy Field, Update Exit..." >> $LOG_FILE + echo "配置文件节点部分校验失败..." > $START_LOG + sleep 3 + config_error + else + change_dns + config_su_check + fi else change_dns config_error @@ -286,19 +338,40 @@ sub_info_get() subscribe_url=$address fi - echo "开始更新配置文件【$name】..." >$START_LOG + echo "开始更新配置文件【$name】..." > $START_LOG config_download if [ "$?" -eq 0 ] && [ -s "$CFG_FILE" ]; then - if [ -n "$(ruby_read "$CFG_FILE" "['proxy-groups']")" ]; then - config_su_check - else - echo "${LOGTIME} Config 【$name】 Grammar Check Faild" >>$LOG_FILE + ruby -ryaml -E UTF-8 -e " + begin + YAML.load_file('$CFG_FILE'); + rescue Exception => e + puts '${LOGTIME} Error: Unable To Parse Config File ' + e.message + system 'rm -rf ${CFG_FILE} 2>/dev/null' + end + " 2>/dev/null >> $LOG_FILE + if [ $? -ne 0 ]; then + echo "${LOGTIME} Error: Ruby Works Abnormally, Please Check The Ruby Library Depends!" >> $LOG_FILE + echo "Ruby依赖异常,无法校验配置文件,请确认ruby依赖工作正常后重试!" > $START_LOG + sleep 3 + only_download=1 + config_su_check + elif [ ! -f "$CFG_FILE" ]; then + echo "配置文件格式校验失败,尝试不使用代理下载配置文件..." > $START_LOG + sleep 3 config_download_direct - fi + elif ! "$(ruby_read "$CFG_FILE" ".key?('proxies')")" && ! "$(ruby_read "$CFG_FILE" ".key?('proxy-providers')")" ; then + echo "${LOGTIME} Error: Updated Config 【$name】 Has No Proxy Field" >> $LOG_FILE + echo "配置文件节点部分校验失败,尝试不使用代理下载配置文件..." > $START_LOG + sleep 3 + config_download_direct + else + config_su_check + fi else - echo "${LOGTIME} Config 【$name】 Download Faild" >>$LOG_FILE + echo "配置文件【$name】订阅失败,尝试不使用代理下载配置文件..." > $START_LOG + echo "${LOGTIME} Error: Config 【$name】 Download Faild" >> $LOG_FILE config_download_direct fi } diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_chnroute.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_chnroute.sh index a3b25b9ab6..f2d6f0994c 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_chnroute.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_chnroute.sh @@ -8,37 +8,50 @@ LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") LOG_FILE="/tmp/openclash.log" china_ip_route=$(uci get openclash.config.china_ip_route 2>/dev/null) + CHNR_CUSTOM_URL=$(uci get openclash.config.chnr_custom_url 2>/dev/null) + small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null) + + if [ "$small_flash_memory" != "1" ]; then + chnr_path="/etc/openclash/china_ip_route.ipset" + mkdir -p /etc/openclash + else + chnr_path="/tmp/etc/openclash/china_ip_route.ipset" + mkdir -p /tmp/etc/openclash + fi echo "开始下载大陆IP白名单..." >$START_LOG - if pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Extra/ChinaIP.yaml -o /tmp/ChinaIP.yaml >/dev/null 2>&1 + if [ -z "$CHNR_CUSTOM_URL" ]; then + if pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://ispip.clang.cn/all_cn.txt -o /tmp/china_ip_route.txt >/dev/null 2>&1 + fi + if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://ispip.clang.cn/all_cn_cidr.txt -o /tmp/china_ip_route.txt >/dev/null 2>&1 + fi + else + curl -sL --connect-timeout 10 --retry 2 "$CHNR_CUSTOM_URL" -o /tmp/china_ip_route.txt >/dev/null 2>&1 fi - if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/DivineEngine/Profiles@master/Clash/RuleSet/Extra/ChinaIP.yaml -o /tmp/ChinaIP.yaml >/dev/null 2>&1 - fi - if [ "$?" -eq "0" ] && [ -s "/tmp/ChinaIP.yaml" ]; then + if [ "$?" -eq "0" ] && [ -s "/tmp/china_ip_route.txt" ]; then echo "大陆IP白名单下载成功,检查版本是否更新..." >$START_LOG - cmp -s /tmp/ChinaIP.yaml /etc/openclash/rule_provider/ChinaIP.yaml - if [ "$?" -ne "0" ]; then - echo "大陆IP白名单有更新,开始替换旧版本..." >$START_LOG - mv /tmp/ChinaIP.yaml /etc/openclash/rule_provider/ChinaIP.yaml >/dev/null 2>&1 - echo "删除下载缓存..." >$START_LOG - rm -rf /tmp/ChinaIP.yaml >/dev/null 2>&1 - rm -rf /usr/share/openclash/res/china_ip_route.ipset >/dev/null 2>&1 - [ "$china_ip_route" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 & - echo "大陆IP白名单更新成功!" >$START_LOG - echo "${LOGTIME} Chnroute Lists Update Successful" >>$LOG_FILE - sleep 5 - else - echo "大陆IP白名单没有更新,停止继续操作..." >$START_LOG - echo "${LOGTIME} Updated Chnroute Lists No Change, Do Nothing" >>$LOG_FILE - rm -rf /tmp/ChinaIP.yaml >/dev/null 2>&1 - sleep 5 - fi + #预处理 + echo "create china_ip_route hash:net family inet hashsize 1024 maxelem 65536" >/tmp/china_ip_route.list + awk '!/^$/&&!/^#/{printf("add china_ip_route %s'" "'\n",$0)}' /tmp/china_ip_route.txt >>/tmp/china_ip_route.list + cmp -s /tmp/china_ip_route.list "$chnr_path" + if [ "$?" -ne "0" ]; then + echo "大陆IP白名单有更新,开始替换旧版本..." >$START_LOG + mv /tmp/china_ip_route.list "$chnr_path" >/dev/null 2>&1 + [ "$china_ip_route" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 & + echo "大陆IP白名单更新成功!" >$START_LOG + echo "${LOGTIME} Chnroute Lists Update Successful" >>$LOG_FILE + sleep 5 + else + echo "大陆IP白名单没有更新,停止继续操作..." >$START_LOG + echo "${LOGTIME} Updated Chnroute Lists No Change, Do Nothing" >>$LOG_FILE + sleep 5 + fi else echo "大陆IP白名单下载失败,请检查网络或稍后再试!" >$START_LOG - rm -rf /tmp/ChinaIP.yaml >/dev/null 2>&1 echo "${LOGTIME} Chnroute Lists Update Error" >>$LOG_FILE - sleep 10 + sleep 5 fi + rm -rf /tmp/china_ip_route* >/dev/null 2>&1 echo "" >$START_LOG \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh index 996ec3de6b..d35acb57b4 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh @@ -29,8 +29,10 @@ core_version=$(/etc/openclash/core/clash -v 2>/dev/null |awk -F ' ' '{print $2}' core_tun_version=$(/etc/openclash/core/clash_tun -v 2>/dev/null |awk -F ' ' '{print $2}' 2>/dev/null) core_game_version=$(/etc/openclash/core/clash_game -v 2>/dev/null |awk -F ' ' '{print $2}' 2>/dev/null) servers_update=$(uci get openclash.config.servers_update 2>/dev/null) +mix_proxies=$(uci get openclash.config.mix_proxies 2>/dev/null) op_version=$(sed -n 1p /usr/share/openclash/res/openclash_version 2>/dev/null) china_ip_route=$(uci get openclash.config.china_ip_route 2>/dev/null) +common_ports=$(uci get openclash.config.common_ports 2>/dev/null) if [ -z "$RAW_CONFIG_FILE" ] || [ ! -f "$RAW_CONFIG_FILE" ]; then CONFIG_NAME=$(ls -lt /etc/openclash/config/ | grep -E '.yaml|.yml' | head -n 1 |awk '{print $9}') @@ -211,7 +213,7 @@ cat >> "$DEBUG_LOG" <<-EOF 启动配置文件: $CONFIG_FILE 运行模式: $en_mode 默认代理模式: $proxy_mode -UDP流量转发: $(ts_cf "$enable_udp_proxy") +UDP流量转发(tproxy): $(ts_cf "$enable_udp_proxy") DNS劫持: $(ts_cf "$enable_redirect_dns") 自定义DNS: $(ts_cf "$enable_custom_dns") IPV6-DNS解析: $(ts_cf "$ipv6_enable") @@ -219,43 +221,20 @@ IPV6-DNS解析: $(ts_cf "$ipv6_enable") 自定义规则: $(ts_cf "$enable_custom_clash_rules") 仅允许内网: $(ts_cf "$intranet_allowed") 仅代理命中规则流量: $(ts_cf "$enable_rule_proxy") +仅允许常用端口流量: $(ts_cf "$common_ports") 绕过中国大陆IP: $(ts_cf "$china_ip_route") #启动异常时建议关闭此项后重试 +混合节点: $(ts_cf "$mix_proxies") 保留配置: $(ts_cf "$servers_update") EOF -if [ "$rule_source" != "0" ]; then + cat >> "$DEBUG_LOG" <<-EOF #启动异常时建议关闭此项后重试 -第三方规则: $rule_source +第三方规则: $(ts_cf "$rule_source") EOF -cat >> "$DEBUG_LOG" <<-EOF -第三方规则策略组设置: -GlobalTV: $(uci get openclash.config.GlobalTV 2>/dev/null) -AsianTV: $(uci get openclash.config.AsianTV 2>/dev/null) -Proxy: $(uci get openclash.config.Proxy 2>/dev/null) -Apple: $(uci get openclash.config.Apple 2>/dev/null) -Netflix: $(uci get openclash.config.Netflix 2>/dev/null) -Spotify: $(uci get openclash.config.Spotify 2>/dev/null) -Steam: $(uci get openclash.config.Steam 2>/dev/null) -AdBlock: $(uci get openclash.config.AdBlock 2>/dev/null) -Netease Music: $(uci get openclash.config.Netease_Music 2>/dev/null) -Speedtest: $(uci get openclash.config.Speedtest 2>/dev/null) -Telegram: $(uci get openclash.config.Telegram 2>/dev/null) -Microsoft: $(uci get openclash.config.Microsoft 2>/dev/null) -PayPal: $(uci get openclash.config.PayPal 2>/dev/null) -Domestic: $(uci get openclash.config.Domestic 2>/dev/null) -Others: $(uci get openclash.config.Others 2>/dev/null) -读取的配置文件策略组: -EOF -cat /tmp/Proxy_Group >> "$DEBUG_LOG" -else -cat >> "$DEBUG_LOG" <<-EOF -第三方规则: 停用 -EOF -fi if [ "$enable_custom_clash_rules" -eq 1 ]; then cat >> "$DEBUG_LOG" <<-EOF diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh index 5a670bdf84..785c602151 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh @@ -30,7 +30,7 @@ restore_history() { NOW_NAME=$(echo $line |awk -F '#*#' '{print $3}') GROUP_STATE=$(GROUP_STATE "$GROUP_NAME") GROUP_STATE_NUM=0 - while ( [ "$GROUP_STATE" != "200" ] && [ "$GROUP_STATE_NUM" -le 3 ] ) + while ( [ "$GROUP_STATE" != "200" ] && [ "$GROUP_STATE_NUM" -le 2 ] ) do sleep 1 GROUP_STATE_NUM=$(expr "$GROUP_STATE_NUM" + 1) diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_ipdb.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_ipdb.sh index a05860f8a2..59ca9bc916 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_ipdb.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_ipdb.sh @@ -8,6 +8,7 @@ LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") LOG_FILE="/tmp/openclash.log" small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null) + GEOIP_CUSTOM_URL=$(uci get openclash.config.geo_custom_url 2>/dev/null) if [ "$small_flash_memory" != "1" ]; then geoip_path="/etc/openclash/Country.mmdb" @@ -17,34 +18,35 @@ mkdir -p /tmp/etc/openclash fi echo "开始下载 GEOIP 数据库..." >$START_LOG - if pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/Country.mmdb -o /tmp/Country.mmdb >/dev/null 2>&1 - fi - if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 http://www.ideame.top/mmdb/Country.mmdb -o /tmp/Country.mmdb >/dev/null 2>&1 + if [ -z "$GEOIP_CUSTOM_URL" ]; then + if pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/Country.mmdb -o /tmp/Country.mmdb >/dev/null 2>&1 + fi + if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 http://www.ideame.top/mmdb/Country.mmdb -o /tmp/Country.mmdb >/dev/null 2>&1 + fi + else + curl -sL --connect-timeout 10 --retry 2 "$GEOIP_CUSTOM_URL" -o /tmp/Country.mmdb >/dev/null 2>&1 fi if [ "$?" -eq "0" ] && [ -s "/tmp/Country.mmdb" ]; then echo "GEOIP 数据库下载成功,检查数据库版本是否更新..." >$START_LOG cmp -s /tmp/Country.mmdb "$geoip_path" - if [ "$?" -ne "0" ]; then - echo "数据库版本有更新,开始替换数据库版本..." >$START_LOG - mv /tmp/Country.mmdb "$geoip_path" >/dev/null 2>&1 - echo "删除下载缓存..." >$START_LOG - rm -rf /tmp/Country.mmdb >/dev/null 2>&1 - echo "GEOIP 数据库更新成功!" >$START_LOG - echo "${LOGTIME} GEOIP Database Update Successful" >>$LOG_FILE - sleep 5 - [ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 & - else - echo "数据库版本没有更新,停止继续操作..." >$START_LOG - echo "${LOGTIME} Updated GEOIP Database No Change, Do Nothing" >>$LOG_FILE - rm -rf /tmp/Country.mmdb >/dev/null 2>&1 - sleep 5 - fi + if [ "$?" -ne "0" ]; then + echo "数据库版本有更新,开始替换数据库版本..." >$START_LOG + mv /tmp/Country.mmdb "$geoip_path" >/dev/null 2>&1 + echo "GEOIP 数据库更新成功!" >$START_LOGS + echo "${LOGTIME} GEOIP Database Update Successful" >>$LOG_FILE + sleep 5 + [ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 & + else + echo "数据库版本没有更新,停止继续操作..." >$START_LOG + echo "${LOGTIME} Updated GEOIP Database No Change, Do Nothing" >>$LOG_FILE + sleep 5 + fi else echo "GEOIP 数据库下载失败,请检查网络或稍后再试!" >$START_LOG - rm -rf /tmp/Country.mmdb >/dev/null 2>&1 echo "${LOGTIME} GEOIP Database Update Error" >>$LOG_FILE - sleep 10 + sleep 5 fi + rm -rf /tmp/Country.mmdb >/dev/null 2>&1 echo "" >$START_LOG \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_rule.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_rule.sh index 0152d3d209..bc914a7e7b 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_rule.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_rule.sh @@ -5,43 +5,79 @@ status=$(unify_ps_status "openclash_rule.sh") [ "$status" -gt 3 ] && exit 0 - - START_LOG="/tmp/openclash_start.log" - LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") - LOG_FILE="/tmp/openclash.log" - echo "开始获取使用中的第三方规则名称..." >$START_LOG - RUlE_SOURCE=$(uci get openclash.config.rule_source 2>/dev/null) - OTHER_RULE_FILE="/tmp/other_rule.yaml" + yml_other_rules_dl() + { + local section="$1" + local enabled config + config_get_bool "enabled" "$section" "enabled" "1" + config_get "config" "$section" "config" "" + + if [ "$enabled" = "0" ] || [ "$config" != "$2" ]; then + return + fi + + if [ -n "$rule_name" ]; then + echo "${LOGTIME} Warrning: Multiple Other-Rules-Configurations Enabled, Ignore..." >> $LOG_FILE + return + fi + + config_get "rule_name" "$section" "rule_name" "" + echo "开始下载使用中的第三方规则..." >$START_LOG - if [ "$RUlE_SOURCE" = "lhie1" ]; then - if pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/lhie1/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml >/dev/null 2>&1 - fi - if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Rule.yaml -o /tmp/rules.yaml >/dev/null 2>&1 - fi - sed -i '1i rules:' /tmp/rules.yaml - elif [ "$RUlE_SOURCE" = "ConnersHua" ]; then - if pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Global.yaml -o /tmp/rules.yaml >/dev/null 2>&1 - fi - if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/DivineEngine/Profiles@master/Clash/Global.yaml -o /tmp/rules.yaml >/dev/null 2>&1 - fi - sed -i "s/# - RULE-SET,ChinaIP,DIRECT/- RULE-SET,ChinaIP,DIRECT/g" /tmp/rules.yaml 2>/dev/null - sed -i "s/- GEOIP,/#- GEOIP,/g" /tmp/rules.yaml 2>/dev/null - elif [ "$RUlE_SOURCE" = "ConnersHua_return" ]; then - if pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/China.yaml -o /tmp/rules.yaml >/dev/null 2>&1 - fi - if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then - curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/DivineEngine/Profiles@master/Clash/China.yaml -o /tmp/rules.yaml >/dev/null 2>&1 - fi + if [ "$rule_name" = "lhie1" ]; then + if pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/lhie1/Rules/master/Clash/Rule.yaml -o /tmp/rules.yaml >/dev/null 2>&1 + fi + if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Rule.yaml -o /tmp/rules.yaml >/dev/null 2>&1 fi - if [ "$?" -eq "0" ] && [ "$RUlE_SOURCE" != 0 ] && [ -s "/tmp/rules.yaml" ]; then + sed -i '1i rules:' /tmp/rules.yaml + elif [ "$rule_name" = "ConnersHua" ]; then + if pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Outbound.yaml -o /tmp/rules.yaml >/dev/null 2>&1 + fi + if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/DivineEngine/Profiles@master/Clash/Outbound.yaml -o /tmp/rules.yaml >/dev/null 2>&1 + fi + sed -i "s/# - RULE-SET,ChinaIP,DIRECT/- RULE-SET,ChinaIP,DIRECT/g" /tmp/rules.yaml 2>/dev/null + sed -i "s/- GEOIP,/#- GEOIP,/g" /tmp/rules.yaml 2>/dev/null + elif [ "$rule_name" = "ConnersHua_return" ]; then + if pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Inbound.yaml -o /tmp/rules.yaml >/dev/null 2>&1 + fi + if [ "$?" -ne "0" ] || ! pidof clash >/dev/null; then + curl -sL --connect-timeout 10 --retry 2 https://cdn.jsdelivr.net/gh/DivineEngine/Profiles@master/Clash/Inbound.yaml -o /tmp/rules.yaml >/dev/null 2>&1 + fi + fi + if [ "$?" -eq "0" ] && [ -s "/tmp/rules.yaml" ]; then echo "下载成功,开始预处理规则文件..." >$START_LOG - + ruby -ryaml -E UTF-8 -e " + begin + YAML.load_file('/tmp/rules.yaml'); + rescue Exception => e + puts '${LOGTIME} Error: Unable To Parse Updated ${rule_name} Rules File ' + e.message + system 'rm -rf /tmp/rules.yaml 2>/dev/null' + end + " 2>/dev/null >> $LOG_FILE + if [ $? -ne 0 ]; then + echo "${LOGTIME} Error: Ruby Works Abnormally, Please Check The Ruby Library Depends!" >> $LOG_FILE + echo "Ruby依赖异常,无法校验配置文件,请确认ruby依赖工作正常后重试!" > $START_LOG + rm -rf /tmp/rules.yaml >/dev/null 2>&1 + sleep 3 + exit 0 + elif [ ! -f "/tmp/rules.yaml" ]; then + echo "$rule_name 规则文件格式校验失败,请稍后再试..." > $START_LOG + rm -rf /tmp/rules.yaml >/dev/null 2>&1 + sleep 3 + exit 0 + elif ! "$(ruby_read "/tmp/rules.yaml" ".key?('rules')")" ; then + echo "${LOGTIME} Error: Updated Others Rules 【$rule_name】 Has No Rules Field, Update Exit..." >> $LOG_FILE + echo "$rule_name 规则文件规则部分校验失败,请稍后再试..." > $START_LOG + rm -rf /tmp/rules.yaml >/dev/null 2>&1 + sleep 3 + exit 0 + fi #取出规则部分 ruby_read "/tmp/rules.yaml" ".select {|x| 'rule-providers' == x or 'script' == x or 'rules' == x }.to_yaml" > "$OTHER_RULE_FILE" #合并 @@ -49,28 +85,59 @@ rm -rf /tmp/other_rule* 2>/dev/null echo "检查下载的规则文件是否有更新..." >$START_LOG - cmp -s /usr/share/openclash/res/"$RUlE_SOURCE".yaml /tmp/rules.yaml + cmp -s /usr/share/openclash/res/"$rule_name".yaml /tmp/rules.yaml if [ "$?" -ne "0" ]; then echo "检测到下载的规则文件有更新,开始替换..." >$START_LOG - mv /tmp/rules.yaml /usr/share/openclash/res/"$RUlE_SOURCE".yaml >/dev/null 2>&1 - echo "替换成功,重新加载 OpenClash 应用新规则..." >$START_LOG - echo "${LOGTIME} Other Rules 【$RUlE_SOURCE】 Update Successful" >>$LOG_FILE - [ "$(unify_ps_prevent)" -eq 0 ] && /etc/init.d/openclash restart >/dev/null 2>&1 & + mv /tmp/rules.yaml /usr/share/openclash/res/"$rule_name".yaml >/dev/null 2>&1 + echo "${LOGTIME} Other Rules 【$rule_name】 Update Successful" >>$LOG_FILE + ifrestart=1 else echo "检测到下载的规则文件没有更新,停止继续操作..." >$START_LOG - rm -rf /tmp/rules.yaml >/dev/null 2>&1 - echo "${LOGTIME} Updated Other Rules 【$RUlE_SOURCE】 No Change, Do Nothing" >>$LOG_FILE + echo "${LOGTIME} Updated Other Rules 【$rule_name】 No Change, Do Nothing" >>$LOG_FILE sleep 5 fi - elif [ "$RUlE_SOURCE" = 0 ]; then + else + echo "第三方规则下载失败,请检查网络或稍后再试!" >$START_LOG + echo "${LOGTIME} Other Rules 【$rule_name】 Update Error" >>$LOG_FILE + sleep 5 + fi + } + + START_LOG="/tmp/openclash_start.log" + LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") + LOG_FILE="/tmp/openclash.log" + RUlE_SOURCE=$(uci get openclash.config.rule_source 2>/dev/null) + + if [ "$RUlE_SOURCE" = "0" ]; then echo "未启用第三方规则,更新程序终止!" >$START_LOG - rm -rf /tmp/rules.yaml >/dev/null 2>&1 echo "${LOGTIME} Other Rules Not Enable, Update Stop" >>$LOG_FILE sleep 5 else - echo "第三方规则下载失败,请检查网络或稍后再试!" >$START_LOG - rm -rf /tmp/rules.yaml >/dev/null 2>&1 - echo "${LOGTIME} Other Rules 【$RUlE_SOURCE】 Update Error" >>$LOG_FILE - sleep 5 + OTHER_RULE_FILE="/tmp/other_rule.yaml" + CONFIG_FILE=$(uci get openclash.config.config_path 2>/dev/null) + CONFIG_NAME=$(echo "$CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null) + ifrestart=0 + + if [ -z "$CONFIG_FILE" ]; then + CONFIG_FILE="/etc/openclash/config/$(ls -lt /etc/openclash/config/ | grep -E '.yaml|.yml' | head -n 1 |awk '{print $9}')" + CONFIG_NAME=$(echo "$CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null) + fi + + if [ -z "$CONFIG_NAME" ]; then + CONFIG_FILE="/etc/openclash/config/config.yaml" + CONFIG_NAME="config.yaml" + fi + + config_load "openclash" + config_foreach yml_other_rules_dl "other_rules" "$CONFIG_NAME" + if [ -z "$rule_name" ]; then + echo "未找到第三方规则配置,更新程序终止!" >$START_LOG + echo "${LOGTIME} Get Other Rules Settings Faild, Update Stop" >>$LOG_FILE + sleep 5 + fi + if [ "$ifrestart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then + /etc/init.d/openclash restart >/dev/null 2>&1 & + fi fi - echo "" >$START_LOG + rm -rf /tmp/rules.yaml >/dev/null 2>&1 + echo "" >$START_LOG \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/ConnersHua.yaml b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/ConnersHua.yaml index 8ad79ad148..b1110a63d3 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/ConnersHua.yaml +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/ConnersHua.yaml @@ -1,87 +1,54 @@ rule-providers: -# name: # Provider 名称 -# type: http # http 或 file -# behavior: classical # 或 ipcidr、domain -# path: # 文件路径 -# url: # 只有当类型为 HTTP 时才可用,您不需要在本地空间中创建新文件。 -# interval: # 自动更新间隔,仅在类型为 HTTP 时可用 - Unbreak: type: http behavior: classical - path: ./RuleSet/Unbreak.yaml + path: "./RuleSet/Unbreak.yaml" url: https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Unbreak.yaml interval: 86400 - Streaming: type: http behavior: classical - path: ./RuleSet/StreamingMedia/Streaming.yaml + path: "./RuleSet/StreamingMedia/Streaming.yaml" url: https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/Streaming.yaml interval: 86400 - StreamingSE: type: http behavior: classical - path: ./RuleSet/StreamingMedia/StreamingSE.yaml + path: "./RuleSet/StreamingMedia/StreamingSE.yaml" url: https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/StreamingSE.yaml interval: 86400 - Global: type: http behavior: classical - path: ./RuleSet/Global.yaml + path: "./RuleSet/Global.yaml" url: https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Global.yaml interval: 86400 - China: type: http behavior: classical - path: ./RuleSet/China.yaml + path: "./RuleSet/China.yaml" url: https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/China.yaml interval: 86400 - ChinaIP: type: http behavior: ipcidr - path: ./RuleSet/Extra/ChinaIP.yaml + path: "./RuleSet/Extra/ChinaIP.yaml" url: https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Extra/ChinaIP.yaml interval: 86400 - -# 规则 rules: -##source:ConnersHua - # Unbreak - - RULE-SET,Unbreak,DIRECT - - # Global Area Network - - # (Streaming Media) - - RULE-SET,Streaming,Streaming - - # (StreamingSE) - - RULE-SET,StreamingSE,StreamingSE - - # (DNS Cache Pollution) / (IP Blackhole) / (Region-Restricted Access Denied) / (Network Jitter) - - RULE-SET,Global,PROXY - - # China Area Network - - RULE-SET,China,DIRECT - - # Local Area Network - - IP-CIDR,192.168.0.0/16,DIRECT - - IP-CIDR,10.0.0.0/8,DIRECT - - IP-CIDR,172.16.0.0/12,DIRECT - - IP-CIDR,127.0.0.0/8,DIRECT - - IP-CIDR,100.64.0.0/10,DIRECT - - IP-CIDR,224.0.0.0/4,DIRECT - - # (可选)使用来自 ipipdotnet 的 ChinaIP 以解决数据不准确的问题,使用 ChinaIP.yaml 时可禁用下列直至(包括)「GEOIP,CN」规则 - - RULE-SET,ChinaIP,DIRECT - # Tencent - - IP-CIDR,119.28.28.28/32,DIRECT - - IP-CIDR,182.254.116.0/24,DIRECT - # GeoIP China - #- GEOIP,CN,DIRECT - - - MATCH,MATCH +- RULE-SET,Unbreak,DIRECT +- RULE-SET,Streaming,Streaming +- RULE-SET,StreamingSE,StreamingSE +- RULE-SET,Global,PROXY +- RULE-SET,China,DIRECT +- IP-CIDR,192.168.0.0/16,DIRECT +- IP-CIDR,10.0.0.0/8,DIRECT +- IP-CIDR,172.16.0.0/12,DIRECT +- IP-CIDR,127.0.0.0/8,DIRECT +- IP-CIDR,100.64.0.0/10,DIRECT +- IP-CIDR,224.0.0.0/4,DIRECT +- IP-CIDR,fe80::/10,DIRECT +- RULE-SET,ChinaIP,DIRECT +- IP-CIDR,119.28.28.28/32,DIRECT +- IP-CIDR,182.254.116.0/24,DIRECT +- MATCH,MATCH diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/china_ip_route.ipset b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/china_ip_route.ipset deleted file mode 100644 index 956c029ee5..0000000000 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/china_ip_route.ipset +++ /dev/null @@ -1,5971 +0,0 @@ -create china_ip_route hash:net family inet hashsize 1024 maxelem 65536 -add china_ip_route 1.0.1.0/24 -add china_ip_route 1.0.2.0/23 -add china_ip_route 1.0.8.0/21 -add china_ip_route 1.0.32.0/19 -add china_ip_route 1.1.0.0/24 -add china_ip_route 1.1.2.0/23 -add china_ip_route 1.1.4.0/22 -add china_ip_route 1.1.8.0/21 -add china_ip_route 1.1.16.0/20 -add china_ip_route 1.1.32.0/19 -add china_ip_route 1.2.0.0/23 -add china_ip_route 1.2.2.0/24 -add china_ip_route 1.2.4.0/22 -add china_ip_route 1.2.8.0/21 -add china_ip_route 1.2.16.0/20 -add china_ip_route 1.2.32.0/19 -add china_ip_route 1.2.64.0/18 -add china_ip_route 1.3.0.0/16 -add china_ip_route 1.4.1.0/24 -add china_ip_route 1.4.2.0/23 -add china_ip_route 1.4.4.0/22 -add china_ip_route 1.4.8.0/21 -add china_ip_route 1.4.16.0/20 -add china_ip_route 1.4.32.0/19 -add china_ip_route 1.4.64.0/18 -add china_ip_route 1.8.0.0/16 -add china_ip_route 1.10.0.0/21 -add china_ip_route 1.10.8.0/23 -add china_ip_route 1.10.11.0/24 -add china_ip_route 1.10.12.0/22 -add china_ip_route 1.10.16.0/20 -add china_ip_route 1.10.32.0/19 -add china_ip_route 1.10.64.0/18 -add china_ip_route 1.12.0.0/14 -add china_ip_route 1.18.128.0/24 -add china_ip_route 1.24.0.0/13 -add china_ip_route 1.45.0.0/16 -add china_ip_route 1.48.0.0/14 -add china_ip_route 1.56.0.0/13 -add china_ip_route 1.68.0.0/14 -add china_ip_route 1.80.0.0/12 -add china_ip_route 1.116.0.0/15 -add china_ip_route 1.118.1.0/24 -add china_ip_route 1.118.2.0/23 -add china_ip_route 1.118.4.0/22 -add china_ip_route 1.118.8.0/21 -add china_ip_route 1.118.16.0/20 -add china_ip_route 1.118.32.0/19 -add china_ip_route 1.118.64.0/18 -add china_ip_route 1.118.128.0/17 -add china_ip_route 1.119.0.0/16 -add china_ip_route 1.180.0.0/14 -add china_ip_route 1.184.0.0/15 -add china_ip_route 1.188.0.0/14 -add china_ip_route 1.192.0.0/13 -add china_ip_route 1.202.0.0/15 -add china_ip_route 1.204.0.0/14 -add china_ip_route 3.5.214.0/23 -add china_ip_route 3.5.216.0/24 -add china_ip_route 8.128.0.0/10 -add china_ip_route 8.209.40.0/21 -add china_ip_route 14.0.0.0/21 -add china_ip_route 14.0.12.0/22 -add china_ip_route 14.1.0.0/22 -add china_ip_route 14.1.24.0/22 -add china_ip_route 14.1.108.0/22 -add china_ip_route 14.16.0.0/12 -add china_ip_route 14.102.128.0/22 -add china_ip_route 14.102.180.0/22 -add china_ip_route 14.103.0.0/16 -add china_ip_route 14.104.0.0/13 -add china_ip_route 14.112.0.0/12 -add china_ip_route 14.130.0.0/15 -add china_ip_route 14.134.0.0/15 -add china_ip_route 14.144.0.0/12 -add china_ip_route 14.192.60.0/22 -add china_ip_route 14.192.76.0/22 -add china_ip_route 14.196.0.0/15 -add china_ip_route 14.204.0.0/15 -add china_ip_route 14.208.0.0/12 -add china_ip_route 15.230.41.0/24 -add china_ip_route 15.230.49.0/24 -add china_ip_route 20.81.0.0/24 -add china_ip_route 20.139.160.0/20 -add china_ip_route 20.249.255.0/24 -add china_ip_route 20.251.0.0/22 -add china_ip_route 27.0.128.0/22 -add china_ip_route 27.0.132.0/24 -add china_ip_route 27.0.134.0/23 -add china_ip_route 27.0.160.0/21 -add china_ip_route 27.0.188.0/22 -add china_ip_route 27.0.204.0/22 -add china_ip_route 27.0.208.0/21 -add china_ip_route 27.8.0.0/13 -add china_ip_route 27.16.0.0/12 -add china_ip_route 27.34.232.0/21 -add china_ip_route 27.36.0.0/14 -add china_ip_route 27.40.0.0/13 -add china_ip_route 27.50.40.0/21 -add china_ip_route 27.50.128.0/17 -add china_ip_route 27.54.72.0/21 -add china_ip_route 27.54.152.0/21 -add china_ip_route 27.54.192.0/18 -add china_ip_route 27.98.208.0/20 -add china_ip_route 27.98.224.0/19 -add china_ip_route 27.99.128.0/17 -add china_ip_route 27.103.0.0/16 -add china_ip_route 27.106.128.0/18 -add china_ip_route 27.106.204.0/22 -add china_ip_route 27.109.32.0/19 -add china_ip_route 27.109.124.0/22 -add china_ip_route 27.112.0.0/18 -add china_ip_route 27.112.80.0/20 -add china_ip_route 27.112.112.0/21 -add china_ip_route 27.113.128.0/18 -add china_ip_route 27.115.0.0/17 -add china_ip_route 27.116.44.0/22 -add china_ip_route 27.121.72.0/21 -add china_ip_route 27.121.120.0/21 -add china_ip_route 27.128.0.0/15 -add china_ip_route 27.131.220.0/22 -add china_ip_route 27.144.0.0/16 -add china_ip_route 27.148.0.0/14 -add china_ip_route 27.152.0.0/13 -add china_ip_route 27.184.0.0/13 -add china_ip_route 27.192.0.0/11 -add china_ip_route 27.224.0.0/14 -add china_ip_route 36.0.0.0/22 -add china_ip_route 36.0.16.0/20 -add china_ip_route 36.0.32.0/19 -add china_ip_route 36.0.64.0/18 -add china_ip_route 36.0.128.0/17 -add china_ip_route 36.1.0.0/16 -add china_ip_route 36.4.0.0/14 -add china_ip_route 36.16.0.0/12 -add china_ip_route 36.32.0.0/14 -add china_ip_route 36.36.0.0/16 -add china_ip_route 36.37.0.0/19 -add china_ip_route 36.37.36.0/23 -add china_ip_route 36.37.39.0/24 -add china_ip_route 36.37.40.0/21 -add china_ip_route 36.37.48.0/20 -add china_ip_route 36.40.0.0/13 -add china_ip_route 36.48.0.0/15 -add china_ip_route 36.51.0.0/17 -add china_ip_route 36.51.128.0/18 -add china_ip_route 36.51.192.0/19 -add china_ip_route 36.51.224.0/20 -add china_ip_route 36.51.240.0/21 -add china_ip_route 36.51.248.0/22 -add china_ip_route 36.51.252.0/23 -add china_ip_route 36.56.0.0/13 -add china_ip_route 36.96.0.0/11 -add china_ip_route 36.128.0.0/10 -add china_ip_route 36.192.0.0/11 -add china_ip_route 36.248.0.0/14 -add china_ip_route 36.254.0.0/16 -add china_ip_route 36.255.116.0/22 -add china_ip_route 36.255.128.0/22 -add china_ip_route 36.255.164.0/22 -add china_ip_route 36.255.172.0/22 -add china_ip_route 36.255.176.0/22 -add china_ip_route 38.142.239.114/32 -add china_ip_route 39.0.0.0/24 -add china_ip_route 39.0.2.0/23 -add china_ip_route 39.0.4.0/22 -add china_ip_route 39.0.8.0/21 -add china_ip_route 39.0.16.0/20 -add china_ip_route 39.0.32.0/19 -add china_ip_route 39.0.64.0/18 -add china_ip_route 39.0.128.0/17 -add china_ip_route 39.64.0.0/11 -add china_ip_route 39.96.0.0/16 -add china_ip_route 39.97.0.0/17 -add china_ip_route 39.97.128.0/18 -add china_ip_route 39.97.192.0/21 -add china_ip_route 39.97.200.0/22 -add china_ip_route 39.97.208.0/20 -add china_ip_route 39.97.224.0/19 -add china_ip_route 39.98.0.0/15 -add china_ip_route 39.100.0.0/14 -add china_ip_route 39.104.0.0/14 -add china_ip_route 39.108.0.0/16 -add china_ip_route 39.109.120.0/23 -add china_ip_route 39.128.0.0/10 -add china_ip_route 40.0.176.0/20 -add china_ip_route 40.0.247.0/24 -add china_ip_route 40.0.248.0/22 -add china_ip_route 40.0.252.0/23 -add china_ip_route 40.0.255.0/24 -add china_ip_route 40.72.0.0/15 -add china_ip_route 40.77.136.112/28 -add china_ip_route 40.77.236.224/27 -add china_ip_route 40.77.254.64/27 -add china_ip_route 40.125.128.0/17 -add china_ip_route 40.126.64.0/18 -add china_ip_route 40.198.10.0/24 -add china_ip_route 40.198.16.0/21 -add china_ip_route 40.198.24.0/23 -add china_ip_route 40.251.225.0/24 -add china_ip_route 40.251.227.0/24 -add china_ip_route 42.0.0.0/22 -add china_ip_route 42.0.8.0/21 -add china_ip_route 42.0.16.0/21 -add china_ip_route 42.0.24.0/22 -add china_ip_route 42.0.32.0/19 -add china_ip_route 42.0.128.0/17 -add china_ip_route 42.1.0.0/19 -add china_ip_route 42.1.32.0/20 -add china_ip_route 42.1.48.0/21 -add china_ip_route 42.1.56.0/22 -add china_ip_route 42.4.0.0/14 -add china_ip_route 42.48.0.0/13 -add china_ip_route 42.56.0.0/14 -add china_ip_route 42.62.0.0/17 -add china_ip_route 42.62.128.0/19 -add china_ip_route 42.62.160.0/20 -add china_ip_route 42.62.180.0/22 -add china_ip_route 42.62.184.0/21 -add china_ip_route 42.63.0.0/16 -add china_ip_route 42.80.0.0/15 -add china_ip_route 42.83.64.0/20 -add china_ip_route 42.83.80.0/22 -add china_ip_route 42.83.88.0/21 -add china_ip_route 42.83.96.0/19 -add china_ip_route 42.83.128.0/23 -add china_ip_route 42.83.134.0/24 -add china_ip_route 42.83.139.0/24 -add china_ip_route 42.83.140.0/22 -add china_ip_route 42.83.144.0/20 -add china_ip_route 42.83.160.0/19 -add china_ip_route 42.83.192.0/18 -add china_ip_route 42.84.0.0/14 -add china_ip_route 42.88.0.0/13 -add china_ip_route 42.96.64.0/19 -add china_ip_route 42.96.96.0/21 -add china_ip_route 42.96.108.0/22 -add china_ip_route 42.96.112.0/20 -add china_ip_route 42.96.128.0/17 -add china_ip_route 42.97.0.0/16 -add china_ip_route 42.99.0.0/18 -add china_ip_route 42.99.64.0/19 -add china_ip_route 42.99.96.0/20 -add china_ip_route 42.99.112.0/22 -add china_ip_route 42.99.120.0/21 -add china_ip_route 42.100.0.0/14 -add china_ip_route 42.120.0.0/15 -add china_ip_route 42.122.0.0/16 -add china_ip_route 42.123.0.0/19 -add china_ip_route 42.123.36.0/22 -add china_ip_route 42.123.40.0/21 -add china_ip_route 42.123.48.0/20 -add china_ip_route 42.123.64.0/18 -add china_ip_route 42.123.128.0/17 -add china_ip_route 42.128.0.0/12 -add china_ip_route 42.156.0.0/19 -add china_ip_route 42.156.36.0/22 -add china_ip_route 42.156.40.0/21 -add china_ip_route 42.156.48.0/20 -add china_ip_route 42.156.64.0/18 -add china_ip_route 42.156.128.0/17 -add china_ip_route 42.157.0.0/21 -add china_ip_route 42.157.8.0/22 -add china_ip_route 42.157.14.0/23 -add china_ip_route 42.157.16.0/20 -add china_ip_route 42.157.32.0/19 -add china_ip_route 42.157.64.0/18 -add china_ip_route 42.157.128.0/17 -add china_ip_route 42.158.0.0/15 -add china_ip_route 42.160.0.0/12 -add china_ip_route 42.176.0.0/13 -add china_ip_route 42.184.0.0/15 -add china_ip_route 42.186.0.0/16 -add china_ip_route 42.187.0.0/18 -add china_ip_route 42.187.64.0/19 -add china_ip_route 42.187.96.0/20 -add china_ip_route 42.187.112.0/21 -add china_ip_route 42.187.120.0/22 -add china_ip_route 42.187.128.0/17 -add china_ip_route 42.192.0.0/13 -add china_ip_route 42.201.0.0/17 -add china_ip_route 42.202.0.0/15 -add china_ip_route 42.204.0.0/14 -add china_ip_route 42.208.0.0/12 -add china_ip_route 42.224.0.0/12 -add china_ip_route 42.240.0.0/16 -add china_ip_route 42.242.0.0/15 -add china_ip_route 42.244.0.0/15 -add china_ip_route 42.246.0.0/16 -add china_ip_route 42.247.0.0/22 -add china_ip_route 42.247.4.0/24 -add china_ip_route 42.247.5.0/25 -add china_ip_route 42.247.5.128/26 -add china_ip_route 42.247.5.204/30 -add china_ip_route 42.247.5.208/28 -add china_ip_route 42.247.5.224/27 -add china_ip_route 42.247.6.0/23 -add china_ip_route 42.247.8.0/21 -add china_ip_route 42.247.16.0/20 -add china_ip_route 42.247.32.0/19 -add china_ip_route 42.247.64.0/18 -add china_ip_route 42.247.128.0/17 -add china_ip_route 42.248.0.0/13 -add china_ip_route 43.0.0.0/9 -add china_ip_route 43.224.12.0/22 -add china_ip_route 43.224.24.0/22 -add china_ip_route 43.224.44.0/22 -add china_ip_route 43.224.52.0/22 -add china_ip_route 43.224.56.0/22 -add china_ip_route 43.224.68.0/22 -add china_ip_route 43.224.72.0/22 -add china_ip_route 43.224.80.0/22 -add china_ip_route 43.224.100.0/22 -add china_ip_route 43.224.144.0/22 -add china_ip_route 43.224.161.0/24 -add china_ip_route 43.224.176.0/22 -add china_ip_route 43.224.184.0/22 -add china_ip_route 43.224.200.0/21 -add china_ip_route 43.224.208.0/21 -add china_ip_route 43.224.216.0/22 -add china_ip_route 43.224.240.0/22 -add china_ip_route 43.225.76.0/22 -add china_ip_route 43.225.86.0/24 -add china_ip_route 43.225.120.0/22 -add china_ip_route 43.225.180.0/22 -add china_ip_route 43.225.208.0/22 -add china_ip_route 43.225.216.0/21 -add china_ip_route 43.225.224.0/20 -add china_ip_route 43.225.240.0/21 -add china_ip_route 43.225.252.0/22 -add china_ip_route 43.226.32.0/19 -add china_ip_route 43.226.64.0/19 -add china_ip_route 43.226.96.0/20 -add china_ip_route 43.226.112.0/21 -add china_ip_route 43.226.120.0/22 -add china_ip_route 43.226.128.0/19 -add china_ip_route 43.226.160.0/21 -add china_ip_route 43.226.236.0/22 -add china_ip_route 43.226.240.0/20 -add china_ip_route 43.227.0.0/21 -add china_ip_route 43.227.8.0/22 -add china_ip_route 43.227.32.0/19 -add china_ip_route 43.227.64.0/19 -add china_ip_route 43.227.104.0/22 -add china_ip_route 43.227.136.0/21 -add china_ip_route 43.227.144.0/22 -add china_ip_route 43.227.152.0/21 -add china_ip_route 43.227.160.0/20 -add china_ip_route 43.227.176.0/21 -add china_ip_route 43.227.188.0/22 -add china_ip_route 43.227.192.0/19 -add china_ip_route 43.227.232.0/22 -add china_ip_route 43.227.248.0/21 -add china_ip_route 43.228.0.0/18 -add china_ip_route 43.228.64.0/21 -add china_ip_route 43.228.76.0/22 -add china_ip_route 43.228.100.0/22 -add china_ip_route 43.228.116.0/24 -add china_ip_route 43.228.118.0/23 -add china_ip_route 43.228.132.0/22 -add china_ip_route 43.228.136.0/22 -add china_ip_route 43.228.148.0/22 -add china_ip_route 43.228.152.0/22 -add china_ip_route 43.228.188.0/22 -add china_ip_route 43.229.40.0/22 -add china_ip_route 43.229.48.0/22 -add china_ip_route 43.229.56.0/22 -add china_ip_route 43.229.96.0/22 -add china_ip_route 43.229.136.0/21 -add china_ip_route 43.229.168.0/21 -add china_ip_route 43.229.176.0/20 -add china_ip_route 43.229.192.0/21 -add china_ip_route 43.229.216.0/21 -add china_ip_route 43.229.232.0/21 -add china_ip_route 43.230.20.0/22 -add china_ip_route 43.230.32.0/22 -add china_ip_route 43.230.68.0/22 -add china_ip_route 43.230.72.0/22 -add china_ip_route 43.230.84.0/22 -add china_ip_route 43.230.124.0/22 -add china_ip_route 43.230.220.0/22 -add china_ip_route 43.230.224.0/19 -add china_ip_route 43.231.32.0/20 -add china_ip_route 43.231.80.0/20 -add china_ip_route 43.231.96.0/20 -add china_ip_route 43.231.136.0/21 -add china_ip_route 43.231.144.0/20 -add china_ip_route 43.231.160.0/20 -add china_ip_route 43.231.176.0/21 -add china_ip_route 43.236.0.0/15 -add china_ip_route 43.238.0.0/16 -add china_ip_route 43.239.0.0/19 -add china_ip_route 43.239.32.0/20 -add china_ip_route 43.239.48.0/22 -add china_ip_route 43.239.116.0/22 -add china_ip_route 43.239.120.0/22 -add china_ip_route 43.239.172.0/22 -add china_ip_route 43.240.0.0/22 -add china_ip_route 43.240.56.0/21 -add china_ip_route 43.240.68.0/22 -add china_ip_route 43.240.72.0/21 -add china_ip_route 43.240.84.0/22 -add china_ip_route 43.240.124.0/22 -add china_ip_route 43.240.128.0/21 -add china_ip_route 43.240.136.0/22 -add china_ip_route 43.240.156.0/22 -add china_ip_route 43.240.160.0/19 -add china_ip_route 43.240.192.0/19 -add china_ip_route 43.240.240.0/20 -add china_ip_route 43.241.0.0/20 -add china_ip_route 43.241.16.0/21 -add china_ip_route 43.241.48.0/22 -add china_ip_route 43.241.76.0/22 -add china_ip_route 43.241.80.0/20 -add china_ip_route 43.241.112.0/22 -add china_ip_route 43.241.168.0/21 -add china_ip_route 43.241.176.0/21 -add china_ip_route 43.241.184.0/22 -add china_ip_route 43.241.208.0/20 -add china_ip_route 43.241.224.0/20 -add china_ip_route 43.241.240.0/22 -add china_ip_route 43.241.248.0/22 -add china_ip_route 43.242.8.0/21 -add china_ip_route 43.242.16.0/20 -add china_ip_route 43.242.48.0/22 -add china_ip_route 43.242.53.0/24 -add china_ip_route 43.242.54.0/24 -add china_ip_route 43.242.56.0/21 -add china_ip_route 43.242.64.0/22 -add china_ip_route 43.242.72.0/21 -add china_ip_route 43.242.80.0/20 -add china_ip_route 43.242.96.0/22 -add china_ip_route 43.242.144.0/20 -add china_ip_route 43.242.160.0/21 -add china_ip_route 43.242.180.0/22 -add china_ip_route 43.242.188.0/22 -add china_ip_route 43.242.192.0/21 -add china_ip_route 43.242.204.0/22 -add china_ip_route 43.242.216.0/21 -add china_ip_route 43.242.252.0/22 -add china_ip_route 43.243.4.0/22 -add china_ip_route 43.243.8.0/21 -add china_ip_route 43.243.16.0/22 -add china_ip_route 43.243.88.0/22 -add china_ip_route 43.243.128.0/22 -add china_ip_route 43.243.136.0/22 -add china_ip_route 43.243.144.0/21 -add china_ip_route 43.243.156.0/22 -add china_ip_route 43.243.180.0/22 -add china_ip_route 43.243.228.0/22 -add china_ip_route 43.243.232.0/22 -add china_ip_route 43.243.244.0/22 -add china_ip_route 43.246.0.0/18 -add china_ip_route 43.246.64.0/19 -add china_ip_route 43.246.96.0/22 -add china_ip_route 43.246.147.0/24 -add china_ip_route 43.246.148.0/24 -add china_ip_route 43.246.150.0/24 -add china_ip_route 43.246.151.0/30 -add china_ip_route 43.246.151.4/32 -add china_ip_route 43.246.151.6/31 -add china_ip_route 43.246.151.8/29 -add china_ip_route 43.246.151.16/28 -add china_ip_route 43.246.151.32/27 -add china_ip_route 43.246.151.64/26 -add china_ip_route 43.246.151.128/25 -add china_ip_route 43.246.228.0/22 -add china_ip_route 43.247.4.0/22 -add china_ip_route 43.247.8.0/22 -add china_ip_route 43.247.44.0/22 -add china_ip_route 43.247.48.0/22 -add china_ip_route 43.247.68.0/22 -add china_ip_route 43.247.76.0/22 -add china_ip_route 43.247.84.0/22 -add china_ip_route 43.247.88.0/21 -add china_ip_route 43.247.96.0/21 -add china_ip_route 43.247.108.0/22 -add china_ip_route 43.247.112.0/22 -add china_ip_route 43.247.148.0/22 -add china_ip_route 43.247.152.0/22 -add china_ip_route 43.247.176.0/20 -add china_ip_route 43.247.196.0/22 -add china_ip_route 43.247.200.0/21 -add china_ip_route 43.247.208.0/20 -add china_ip_route 43.247.224.0/19 -add china_ip_route 43.248.0.0/21 -add china_ip_route 43.248.20.0/22 -add china_ip_route 43.248.28.0/22 -add china_ip_route 43.248.48.0/22 -add china_ip_route 43.248.76.0/22 -add china_ip_route 43.248.80.0/20 -add china_ip_route 43.248.96.0/19 -add china_ip_route 43.248.128.0/20 -add china_ip_route 43.248.144.0/21 -add china_ip_route 43.248.176.0/20 -add china_ip_route 43.248.192.0/20 -add china_ip_route 43.248.208.0/22 -add china_ip_route 43.248.228.0/22 -add china_ip_route 43.248.232.0/22 -add china_ip_route 43.248.244.0/22 -add china_ip_route 43.249.4.0/22 -add china_ip_route 43.249.120.0/22 -add china_ip_route 43.249.132.0/22 -add china_ip_route 43.249.136.0/22 -add china_ip_route 43.249.144.0/20 -add china_ip_route 43.249.160.0/21 -add china_ip_route 43.249.168.0/22 -add china_ip_route 43.249.192.0/22 -add china_ip_route 43.249.236.0/22 -add china_ip_route 43.250.4.0/22 -add china_ip_route 43.250.12.0/22 -add china_ip_route 43.250.16.0/21 -add china_ip_route 43.250.28.0/22 -add china_ip_route 43.250.32.0/22 -add china_ip_route 43.250.96.0/21 -add china_ip_route 43.250.108.0/22 -add china_ip_route 43.250.112.0/21 -add china_ip_route 43.250.128.0/22 -add china_ip_route 43.250.144.0/21 -add china_ip_route 43.250.160.0/22 -add china_ip_route 43.250.168.0/22 -add china_ip_route 43.250.176.0/22 -add china_ip_route 43.250.200.0/22 -add china_ip_route 43.250.212.0/22 -add china_ip_route 43.250.216.0/21 -add china_ip_route 43.250.236.0/22 -add china_ip_route 43.250.244.0/22 -add china_ip_route 43.251.4.0/22 -add china_ip_route 43.251.36.0/22 -add china_ip_route 43.251.192.0/22 -add china_ip_route 43.251.232.0/22 -add china_ip_route 43.251.244.0/22 -add china_ip_route 43.252.48.0/22 -add china_ip_route 43.252.56.0/22 -add china_ip_route 43.252.224.0/22 -add china_ip_route 43.254.0.0/21 -add china_ip_route 43.254.8.0/22 -add china_ip_route 43.254.24.0/22 -add china_ip_route 43.254.36.0/22 -add china_ip_route 43.254.44.0/22 -add china_ip_route 43.254.52.0/22 -add china_ip_route 43.254.64.0/22 -add china_ip_route 43.254.72.0/22 -add china_ip_route 43.254.84.0/22 -add china_ip_route 43.254.88.0/21 -add china_ip_route 43.254.100.0/22 -add china_ip_route 43.254.104.0/22 -add china_ip_route 43.254.112.0/21 -add china_ip_route 43.254.128.0/22 -add china_ip_route 43.254.136.0/21 -add china_ip_route 43.254.144.0/20 -add china_ip_route 43.254.168.0/21 -add china_ip_route 43.254.180.0/22 -add china_ip_route 43.254.184.0/21 -add china_ip_route 43.254.192.0/22 -add china_ip_route 43.254.200.0/22 -add china_ip_route 43.254.208.0/22 -add china_ip_route 43.254.220.0/22 -add china_ip_route 43.254.224.0/20 -add china_ip_route 43.254.240.0/22 -add china_ip_route 43.254.248.0/21 -add china_ip_route 43.255.0.0/21 -add china_ip_route 43.255.8.0/22 -add china_ip_route 43.255.16.0/22 -add china_ip_route 43.255.48.0/22 -add china_ip_route 43.255.64.0/20 -add china_ip_route 43.255.84.0/22 -add china_ip_route 43.255.96.0/22 -add china_ip_route 43.255.144.0/22 -add china_ip_route 43.255.176.0/22 -add china_ip_route 43.255.184.0/22 -add china_ip_route 43.255.192.0/22 -add china_ip_route 43.255.200.0/21 -add china_ip_route 43.255.208.0/21 -add china_ip_route 43.255.224.0/21 -add china_ip_route 43.255.232.0/22 -add china_ip_route 43.255.244.0/22 -add china_ip_route 45.40.192.0/20 -add china_ip_route 45.40.208.0/21 -add china_ip_route 45.40.224.0/19 -add china_ip_route 45.65.16.0/20 -add china_ip_route 45.87.53.0/24 -add china_ip_route 45.87.54.0/23 -add china_ip_route 45.112.132.0/22 -add china_ip_route 45.112.188.0/22 -add china_ip_route 45.112.208.0/20 -add china_ip_route 45.112.228.0/22 -add china_ip_route 45.112.232.0/21 -add china_ip_route 45.113.12.0/22 -add china_ip_route 45.113.16.0/20 -add china_ip_route 45.113.40.0/22 -add china_ip_route 45.113.52.0/22 -add china_ip_route 45.113.72.0/22 -add china_ip_route 45.113.144.0/21 -add china_ip_route 45.113.168.0/22 -add china_ip_route 45.113.184.0/22 -add china_ip_route 45.113.200.0/21 -add china_ip_route 45.113.208.0/20 -add china_ip_route 45.113.240.0/22 -add china_ip_route 45.113.252.0/22 -add china_ip_route 45.114.0.0/22 -add china_ip_route 45.114.32.0/22 -add china_ip_route 45.114.52.0/22 -add china_ip_route 45.114.96.0/22 -add china_ip_route 45.114.136.0/22 -add china_ip_route 45.114.196.0/22 -add china_ip_route 45.114.200.0/22 -add china_ip_route 45.114.228.0/22 -add china_ip_route 45.114.237.0/24 -add china_ip_route 45.114.238.0/23 -add china_ip_route 45.114.252.0/22 -add china_ip_route 45.115.44.0/22 -add china_ip_route 45.115.100.0/22 -add china_ip_route 45.115.120.0/22 -add china_ip_route 45.115.132.0/22 -add china_ip_route 45.115.144.0/22 -add china_ip_route 45.115.156.0/22 -add china_ip_route 45.115.164.0/22 -add china_ip_route 45.115.200.0/22 -add china_ip_route 45.115.212.0/22 -add china_ip_route 45.115.244.0/22 -add china_ip_route 45.115.248.0/22 -add china_ip_route 45.116.16.0/22 -add china_ip_route 45.116.24.0/22 -add china_ip_route 45.116.32.0/21 -add china_ip_route 45.116.52.0/22 -add china_ip_route 45.116.96.0/21 -add china_ip_route 45.116.140.0/22 -add china_ip_route 45.116.152.0/22 -add china_ip_route 45.116.208.0/22 -add china_ip_route 45.117.8.0/22 -add china_ip_route 45.117.20.0/22 -add china_ip_route 45.117.68.0/22 -add china_ip_route 45.117.124.0/22 -add china_ip_route 45.117.252.0/22 -add china_ip_route 45.119.60.0/22 -add china_ip_route 45.119.64.0/21 -add china_ip_route 45.119.72.0/22 -add china_ip_route 45.119.104.0/22 -add china_ip_route 45.119.232.0/22 -add china_ip_route 45.120.100.0/22 -add china_ip_route 45.120.140.0/22 -add china_ip_route 45.120.164.0/22 -add china_ip_route 45.120.180.128/27 -add china_ip_route 45.120.240.0/22 -add china_ip_route 45.121.52.0/22 -add china_ip_route 45.121.64.0/21 -add china_ip_route 45.121.72.0/22 -add china_ip_route 45.121.92.0/22 -add china_ip_route 45.121.96.0/22 -add china_ip_route 45.121.172.0/22 -add china_ip_route 45.121.176.0/22 -add china_ip_route 45.121.240.0/20 -add china_ip_route 45.122.0.0/19 -add china_ip_route 45.122.32.0/21 -add china_ip_route 45.122.40.0/22 -add china_ip_route 45.122.60.0/22 -add china_ip_route 45.122.64.0/19 -add china_ip_route 45.122.96.0/20 -add china_ip_route 45.122.112.0/21 -add china_ip_route 45.122.160.0/19 -add china_ip_route 45.122.192.0/20 -add china_ip_route 45.122.208.0/21 -add china_ip_route 45.122.216.0/22 -add china_ip_route 45.123.28.0/22 -add china_ip_route 45.123.32.0/21 -add china_ip_route 45.123.44.0/22 -add china_ip_route 45.123.48.0/20 -add china_ip_route 45.123.64.0/20 -add china_ip_route 45.123.80.0/21 -add china_ip_route 45.123.120.0/22 -add china_ip_route 45.123.128.0/21 -add china_ip_route 45.123.136.0/22 -add china_ip_route 45.123.148.0/22 -add china_ip_route 45.123.152.0/21 -add china_ip_route 45.123.164.0/22 -add china_ip_route 45.123.168.0/21 -add china_ip_route 45.123.176.0/21 -add china_ip_route 45.123.184.0/22 -add china_ip_route 45.123.204.0/22 -add china_ip_route 45.123.212.0/22 -add china_ip_route 45.123.224.0/19 -add china_ip_route 45.124.0.0/22 -add china_ip_route 45.124.20.0/22 -add china_ip_route 45.124.28.0/22 -add china_ip_route 45.124.32.0/21 -add china_ip_route 45.124.44.0/22 -add china_ip_route 45.124.68.0/22 -add china_ip_route 45.124.76.0/22 -add china_ip_route 45.124.80.0/22 -add china_ip_route 45.124.100.0/22 -add china_ip_route 45.124.124.0/22 -add china_ip_route 45.124.172.0/22 -add china_ip_route 45.124.176.0/22 -add china_ip_route 45.124.208.0/22 -add china_ip_route 45.124.248.0/22 -add china_ip_route 45.125.24.0/22 -add china_ip_route 45.125.44.0/22 -add china_ip_route 45.125.52.0/22 -add china_ip_route 45.125.56.0/22 -add china_ip_route 45.125.76.0/22 -add china_ip_route 45.125.80.0/20 -add china_ip_route 45.125.96.0/21 -add china_ip_route 45.125.136.0/22 -add china_ip_route 45.126.48.0/21 -add china_ip_route 45.126.108.0/22 -add china_ip_route 45.126.112.0/21 -add china_ip_route 45.126.120.0/22 -add china_ip_route 45.126.220.0/22 -add china_ip_route 45.127.8.0/21 -add china_ip_route 45.127.128.0/22 -add china_ip_route 45.127.144.0/21 -add china_ip_route 45.127.156.0/22 -add china_ip_route 45.248.8.0/22 -add china_ip_route 45.248.80.0/22 -add china_ip_route 45.248.88.0/22 -add china_ip_route 45.248.96.0/20 -add china_ip_route 45.248.128.0/21 -add china_ip_route 45.248.204.0/22 -add china_ip_route 45.248.208.0/20 -add china_ip_route 45.248.224.0/19 -add china_ip_route 45.249.0.0/21 -add china_ip_route 45.249.12.0/22 -add china_ip_route 45.249.16.0/20 -add china_ip_route 45.249.32.0/21 -add china_ip_route 45.249.112.0/22 -add china_ip_route 45.249.188.0/22 -add china_ip_route 45.249.192.0/20 -add china_ip_route 45.249.208.0/21 -add china_ip_route 45.250.12.0/22 -add china_ip_route 45.250.16.0/22 -add china_ip_route 45.250.28.0/22 -add china_ip_route 45.250.32.0/21 -add china_ip_route 45.250.40.0/22 -add china_ip_route 45.250.76.0/22 -add china_ip_route 45.250.80.0/20 -add china_ip_route 45.250.96.0/22 -add china_ip_route 45.250.104.0/21 -add china_ip_route 45.250.112.0/20 -add china_ip_route 45.250.128.0/20 -add china_ip_route 45.250.144.0/21 -add china_ip_route 45.250.152.0/22 -add china_ip_route 45.250.164.0/22 -add china_ip_route 45.250.180.0/22 -add china_ip_route 45.250.184.0/21 -add china_ip_route 45.250.192.0/22 -add china_ip_route 45.251.0.0/22 -add china_ip_route 45.251.8.0/22 -add china_ip_route 45.251.16.0/21 -add china_ip_route 45.251.52.0/22 -add china_ip_route 45.251.84.0/22 -add china_ip_route 45.251.88.0/21 -add china_ip_route 45.251.96.0/21 -add china_ip_route 45.251.120.0/21 -add china_ip_route 45.251.137.0/24 -add china_ip_route 45.251.138.0/23 -add china_ip_route 45.251.140.0/22 -add china_ip_route 45.251.144.0/20 -add china_ip_route 45.251.160.0/19 -add china_ip_route 45.251.192.0/19 -add china_ip_route 45.251.224.0/22 -add china_ip_route 45.252.0.0/19 -add china_ip_route 45.252.32.0/20 -add china_ip_route 45.252.48.0/22 -add china_ip_route 45.252.84.0/22 -add china_ip_route 45.252.88.0/21 -add china_ip_route 45.252.96.0/19 -add china_ip_route 45.252.128.0/19 -add china_ip_route 45.252.160.0/20 -add china_ip_route 45.252.176.0/22 -add china_ip_route 45.252.192.0/19 -add china_ip_route 45.252.224.0/21 -add china_ip_route 45.252.232.0/22 -add china_ip_route 45.253.0.0/18 -add china_ip_route 45.253.64.0/20 -add china_ip_route 45.253.80.0/21 -add china_ip_route 45.253.92.0/22 -add china_ip_route 45.253.96.0/20 -add china_ip_route 45.253.112.0/21 -add china_ip_route 45.253.120.0/22 -add china_ip_route 45.253.132.0/22 -add china_ip_route 45.253.136.0/21 -add china_ip_route 45.253.144.0/20 -add china_ip_route 45.253.160.0/19 -add china_ip_route 45.253.192.0/19 -add china_ip_route 45.253.224.0/20 -add china_ip_route 45.253.240.0/22 -add china_ip_route 45.254.0.0/20 -add china_ip_route 45.254.16.0/21 -add china_ip_route 45.254.28.0/22 -add china_ip_route 45.254.40.0/22 -add china_ip_route 45.254.48.0/20 -add china_ip_route 45.254.64.0/18 -add china_ip_route 45.254.128.0/18 -add china_ip_route 45.254.192.0/19 -add china_ip_route 45.254.224.0/21 -add china_ip_route 45.254.236.0/22 -add china_ip_route 45.254.248.0/22 -add china_ip_route 45.255.0.0/18 -add china_ip_route 45.255.64.0/19 -add china_ip_route 45.255.96.0/20 -add china_ip_route 45.255.112.0/21 -add china_ip_route 45.255.120.0/22 -add china_ip_route 45.255.136.0/21 -add china_ip_route 45.255.144.0/20 -add china_ip_route 45.255.160.0/19 -add china_ip_route 45.255.192.0/19 -add china_ip_route 45.255.224.0/20 -add china_ip_route 45.255.240.0/21 -add china_ip_route 45.255.248.0/22 -add china_ip_route 46.248.24.0/23 -add china_ip_route 47.92.0.0/14 -add china_ip_route 47.96.0.0/11 -add china_ip_route 49.4.0.0/14 -add china_ip_route 49.51.56.0/22 -add china_ip_route 49.51.60.0/23 -add china_ip_route 49.51.110.0/23 -add china_ip_route 49.51.112.0/20 -add china_ip_route 49.52.0.0/14 -add china_ip_route 49.64.0.0/11 -add china_ip_route 49.112.0.0/13 -add china_ip_route 49.120.0.0/14 -add china_ip_route 49.128.0.0/24 -add china_ip_route 49.128.2.0/23 -add china_ip_route 49.128.4.0/22 -add china_ip_route 49.140.0.0/15 -add china_ip_route 49.152.0.0/14 -add china_ip_route 49.208.0.0/14 -add china_ip_route 49.220.0.0/14 -add china_ip_route 49.232.0.0/14 -add china_ip_route 49.239.0.0/18 -add china_ip_route 49.239.192.0/18 -add china_ip_route 52.80.0.0/14 -add china_ip_route 52.94.249.0/27 -add china_ip_route 52.130.0.0/15 -add china_ip_route 54.222.0.0/15 -add china_ip_route 54.231.208.0/20 -add china_ip_route 54.240.224.0/24 -add china_ip_route 57.92.96.0/20 -add china_ip_route 58.14.0.0/15 -add china_ip_route 58.16.0.0/13 -add china_ip_route 58.24.0.0/15 -add china_ip_route 58.30.0.0/15 -add china_ip_route 58.32.0.0/11 -add china_ip_route 58.65.232.0/21 -add china_ip_route 58.66.0.0/15 -add china_ip_route 58.68.128.0/19 -add china_ip_route 58.68.160.0/23 -add china_ip_route 58.68.163.0/24 -add china_ip_route 58.68.164.0/22 -add china_ip_route 58.68.179.0/24 -add china_ip_route 58.68.180.0/24 -add china_ip_route 58.68.200.0/21 -add china_ip_route 58.68.208.0/20 -add china_ip_route 58.68.224.0/19 -add china_ip_route 58.82.0.0/17 -add china_ip_route 58.83.0.0/16 -add china_ip_route 58.87.64.0/18 -add china_ip_route 58.99.128.0/17 -add china_ip_route 58.100.0.0/15 -add china_ip_route 58.116.0.0/14 -add china_ip_route 58.128.0.0/13 -add china_ip_route 58.144.0.0/16 -add china_ip_route 58.154.0.0/15 -add china_ip_route 58.192.0.0/11 -add china_ip_route 58.240.0.0/12 -add china_ip_route 59.32.0.0/11 -add china_ip_route 59.64.0.0/12 -add china_ip_route 59.80.0.0/15 -add china_ip_route 59.82.0.0/16 -add china_ip_route 59.83.0.0/18 -add china_ip_route 59.83.132.0/22 -add china_ip_route 59.83.136.0/21 -add china_ip_route 59.83.144.0/20 -add china_ip_route 59.83.160.0/19 -add china_ip_route 59.83.192.0/19 -add china_ip_route 59.83.224.0/20 -add china_ip_route 59.83.240.0/21 -add china_ip_route 59.83.248.0/22 -add china_ip_route 59.83.252.0/23 -add china_ip_route 59.83.254.0/24 -add china_ip_route 59.107.0.0/16 -add china_ip_route 59.108.0.0/14 -add china_ip_route 59.151.0.0/17 -add china_ip_route 59.152.16.0/20 -add china_ip_route 59.152.36.0/22 -add china_ip_route 59.152.64.0/20 -add china_ip_route 59.152.112.0/21 -add china_ip_route 59.153.4.0/22 -add china_ip_route 59.153.32.0/22 -add china_ip_route 59.153.64.0/21 -add china_ip_route 59.153.72.0/22 -add china_ip_route 59.153.92.0/22 -add china_ip_route 59.153.136.0/22 -add china_ip_route 59.153.152.0/21 -add china_ip_route 59.153.164.0/22 -add china_ip_route 59.153.168.0/21 -add china_ip_route 59.153.176.0/20 -add china_ip_route 59.153.192.0/22 -add china_ip_route 59.155.0.0/16 -add china_ip_route 59.172.0.0/14 -add china_ip_route 59.191.0.0/17 -add china_ip_route 59.192.0.0/10 -add china_ip_route 60.0.0.0/11 -add china_ip_route 60.55.0.0/16 -add china_ip_route 60.63.0.0/16 -add china_ip_route 60.160.0.0/11 -add china_ip_route 60.194.0.0/15 -add china_ip_route 60.200.0.0/13 -add china_ip_route 60.208.0.0/12 -add china_ip_route 60.232.0.0/15 -add china_ip_route 60.235.0.0/16 -add china_ip_route 60.245.128.0/17 -add china_ip_route 60.247.0.0/16 -add china_ip_route 60.252.0.0/16 -add china_ip_route 60.253.128.0/17 -add china_ip_route 60.255.0.0/16 -add china_ip_route 61.4.81.0/24 -add china_ip_route 61.4.82.0/23 -add china_ip_route 61.4.84.0/22 -add china_ip_route 61.4.88.0/21 -add china_ip_route 61.4.176.0/20 -add china_ip_route 61.8.160.0/20 -add china_ip_route 61.14.212.0/22 -add china_ip_route 61.14.216.0/21 -add china_ip_route 61.14.240.0/21 -add china_ip_route 61.28.0.0/17 -add china_ip_route 61.29.128.0/18 -add china_ip_route 61.29.192.0/19 -add china_ip_route 61.29.224.0/20 -add china_ip_route 61.45.128.0/18 -add china_ip_route 61.45.224.0/20 -add china_ip_route 61.47.128.0/18 -add china_ip_route 61.48.0.0/13 -add china_ip_route 61.87.192.0/18 -add china_ip_route 61.128.0.0/10 -add china_ip_route 61.232.0.0/14 -add china_ip_route 61.236.0.0/15 -add china_ip_route 61.240.0.0/14 -add china_ip_route 62.234.0.0/16 -add china_ip_route 64.188.38.0/23 -add china_ip_route 64.188.40.0/22 -add china_ip_route 64.188.44.0/23 -add china_ip_route 68.79.0.0/18 -add china_ip_route 69.230.192.0/18 -add china_ip_route 69.231.128.0/18 -add china_ip_route 69.234.192.0/18 -add china_ip_route 69.235.128.0/18 -add china_ip_route 71.131.192.0/18 -add china_ip_route 71.132.0.0/18 -add china_ip_route 71.136.64.0/18 -add china_ip_route 71.137.0.0/18 -add china_ip_route 72.163.240.0/23 -add china_ip_route 72.163.248.0/22 -add china_ip_route 81.68.0.0/14 -add china_ip_route 82.156.0.0/15 -add china_ip_route 87.254.207.0/24 -add china_ip_route 89.19.34.0/23 -add china_ip_route 93.183.14.0/24 -add china_ip_route 93.183.18.0/24 -add china_ip_route 94.191.0.0/17 -add china_ip_route 101.0.0.0/22 -add china_ip_route 101.1.0.0/22 -add china_ip_route 101.2.172.0/22 -add china_ip_route 101.4.0.0/14 -add china_ip_route 101.16.0.0/12 -add china_ip_route 101.32.176.0/20 -add china_ip_route 101.32.192.0/18 -add china_ip_route 101.33.0.0/16 -add china_ip_route 101.34.0.0/15 -add china_ip_route 101.36.0.0/18 -add china_ip_route 101.36.64.0/20 -add china_ip_route 101.36.88.0/21 -add china_ip_route 101.36.128.0/17 -add china_ip_route 101.37.0.0/16 -add china_ip_route 101.38.0.0/15 -add china_ip_route 101.40.0.0/13 -add china_ip_route 101.48.0.0/15 -add china_ip_route 101.50.8.0/21 -add china_ip_route 101.50.56.0/22 -add china_ip_route 101.52.0.0/16 -add china_ip_route 101.53.100.0/22 -add china_ip_route 101.54.0.0/16 -add china_ip_route 101.55.224.0/21 -add china_ip_route 101.64.0.0/13 -add china_ip_route 101.72.0.0/14 -add china_ip_route 101.76.0.0/15 -add china_ip_route 101.78.0.0/22 -add china_ip_route 101.78.32.0/19 -add china_ip_route 101.80.0.0/12 -add china_ip_route 101.96.0.0/21 -add china_ip_route 101.96.8.0/22 -add china_ip_route 101.96.16.0/20 -add china_ip_route 101.96.128.0/17 -add china_ip_route 101.99.96.0/19 -add china_ip_route 101.101.64.0/19 -add china_ip_route 101.101.100.0/24 -add china_ip_route 101.101.102.0/23 -add china_ip_route 101.101.104.0/21 -add china_ip_route 101.101.112.0/20 -add china_ip_route 101.102.64.0/19 -add china_ip_route 101.102.100.0/23 -add china_ip_route 101.102.102.0/24 -add china_ip_route 101.102.104.0/21 -add china_ip_route 101.102.112.0/20 -add china_ip_route 101.104.0.0/14 -add china_ip_route 101.110.64.0/19 -add china_ip_route 101.110.96.0/20 -add china_ip_route 101.110.116.0/22 -add china_ip_route 101.110.120.0/21 -add china_ip_route 101.120.0.0/14 -add china_ip_route 101.124.0.0/15 -add china_ip_route 101.126.0.0/16 -add china_ip_route 101.128.0.0/22 -add china_ip_route 101.128.8.0/21 -add china_ip_route 101.128.16.0/20 -add china_ip_route 101.128.32.0/19 -add china_ip_route 101.129.0.0/16 -add china_ip_route 101.130.0.0/15 -add china_ip_route 101.132.0.0/15 -add china_ip_route 101.134.0.0/17 -add china_ip_route 101.134.128.0/19 -add china_ip_route 101.134.160.0/20 -add china_ip_route 101.134.176.0/21 -add china_ip_route 101.134.184.0/22 -add china_ip_route 101.134.189.0/24 -add china_ip_route 101.134.190.0/23 -add china_ip_route 101.134.192.0/18 -add china_ip_route 101.135.0.0/16 -add china_ip_route 101.144.0.0/12 -add china_ip_route 101.192.0.0/14 -add china_ip_route 101.196.0.0/16 -add china_ip_route 101.198.128.0/18 -add china_ip_route 101.198.194.0/24 -add china_ip_route 101.198.196.0/23 -add china_ip_route 101.198.200.0/22 -add china_ip_route 101.198.224.0/19 -add china_ip_route 101.199.0.0/19 -add china_ip_route 101.199.48.0/20 -add china_ip_route 101.199.64.0/18 -add china_ip_route 101.199.128.0/17 -add china_ip_route 101.200.0.0/15 -add china_ip_route 101.203.128.0/19 -add china_ip_route 101.203.160.0/21 -add china_ip_route 101.203.172.0/22 -add china_ip_route 101.203.176.0/20 -add china_ip_route 101.204.0.0/14 -add china_ip_route 101.224.0.0/13 -add china_ip_route 101.232.0.0/15 -add china_ip_route 101.234.64.0/21 -add china_ip_route 101.234.76.0/22 -add china_ip_route 101.234.80.0/20 -add china_ip_route 101.234.96.0/19 -add china_ip_route 101.236.0.0/14 -add china_ip_route 101.240.0.0/13 -add china_ip_route 101.248.0.0/15 -add china_ip_route 101.251.0.0/22 -add china_ip_route 101.251.8.0/21 -add china_ip_route 101.251.16.0/20 -add china_ip_route 101.251.32.0/19 -add china_ip_route 101.251.64.0/18 -add china_ip_route 101.251.128.0/17 -add china_ip_route 101.252.0.0/15 -add china_ip_route 101.254.0.0/16 -add china_ip_route 102.176.130.0/24 -add china_ip_route 103.1.8.0/22 -add china_ip_route 103.1.20.0/22 -add china_ip_route 103.1.24.0/22 -add china_ip_route 103.1.88.0/22 -add china_ip_route 103.1.168.0/22 -add china_ip_route 103.2.108.0/22 -add china_ip_route 103.2.156.0/22 -add china_ip_route 103.2.164.0/22 -add china_ip_route 103.2.200.0/21 -add china_ip_route 103.2.208.0/21 -add china_ip_route 103.3.84.0/22 -add china_ip_route 103.3.88.0/21 -add china_ip_route 103.3.96.0/19 -add china_ip_route 103.3.128.0/20 -add china_ip_route 103.3.148.0/22 -add china_ip_route 103.3.152.0/21 -add china_ip_route 103.4.56.0/22 -add china_ip_route 103.4.168.0/22 -add china_ip_route 103.4.184.0/22 -add china_ip_route 103.5.36.0/22 -add china_ip_route 103.5.52.0/24 -add china_ip_route 103.5.56.0/22 -add china_ip_route 103.5.152.0/22 -add china_ip_route 103.5.168.0/22 -add china_ip_route 103.5.192.0/22 -add china_ip_route 103.5.252.0/22 -add china_ip_route 103.6.76.0/22 -add china_ip_route 103.6.120.0/22 -add china_ip_route 103.6.220.0/22 -add china_ip_route 103.7.140.0/22 -add china_ip_route 103.7.212.0/22 -add china_ip_route 103.7.216.0/21 -add china_ip_route 103.8.0.0/21 -add china_ip_route 103.8.8.0/22 -add china_ip_route 103.8.32.0/22 -add china_ip_route 103.8.52.0/22 -add china_ip_route 103.8.68.0/22 -add china_ip_route 103.8.108.0/22 -add china_ip_route 103.8.156.0/22 -add china_ip_route 103.8.200.0/21 -add china_ip_route 103.8.220.0/22 -add china_ip_route 103.9.8.0/22 -add china_ip_route 103.9.24.0/22 -add china_ip_route 103.9.108.0/22 -add china_ip_route 103.9.152.0/22 -add china_ip_route 103.9.248.0/21 -add china_ip_route 103.10.0.0/22 -add china_ip_route 103.10.16.0/22 -add china_ip_route 103.10.84.0/22 -add china_ip_route 103.10.111.0/24 -add china_ip_route 103.10.140.0/22 -add china_ip_route 103.11.16.0/22 -add china_ip_route 103.11.168.0/22 -add china_ip_route 103.11.180.0/22 -add china_ip_route 103.12.32.0/22 -add china_ip_route 103.12.136.0/22 -add china_ip_route 103.12.184.0/22 -add china_ip_route 103.12.232.0/22 -add china_ip_route 103.13.12.0/22 -add china_ip_route 103.13.124.0/22 -add china_ip_route 103.13.144.0/22 -add china_ip_route 103.13.196.0/22 -add china_ip_route 103.13.244.0/22 -add china_ip_route 103.14.84.0/22 -add china_ip_route 103.14.132.0/22 -add china_ip_route 103.14.136.0/22 -add china_ip_route 103.14.156.0/22 -add china_ip_route 103.14.240.0/22 -add china_ip_route 103.15.4.0/22 -add china_ip_route 103.15.8.0/22 -add china_ip_route 103.15.16.0/22 -add china_ip_route 103.15.96.0/22 -add china_ip_route 103.15.200.0/22 -add china_ip_route 103.16.52.0/22 -add china_ip_route 103.16.80.0/21 -add china_ip_route 103.16.88.0/22 -add china_ip_route 103.16.108.0/22 -add china_ip_route 103.16.124.0/22 -add china_ip_route 103.17.40.0/22 -add china_ip_route 103.17.64.0/22 -add china_ip_route 103.17.120.0/23 -add china_ip_route 103.17.136.0/22 -add china_ip_route 103.17.160.0/22 -add china_ip_route 103.17.204.0/22 -add china_ip_route 103.17.228.0/22 -add china_ip_route 103.18.192.0/22 -add china_ip_route 103.18.208.0/21 -add china_ip_route 103.18.224.0/22 -add china_ip_route 103.19.12.0/22 -add china_ip_route 103.19.40.0/21 -add china_ip_route 103.19.64.0/21 -add china_ip_route 103.19.72.0/22 -add china_ip_route 103.19.232.0/22 -add china_ip_route 103.20.12.0/22 -add china_ip_route 103.20.32.0/23 -add china_ip_route 103.20.34.0/24 -add china_ip_route 103.20.68.0/22 -add china_ip_route 103.20.112.0/22 -add china_ip_route 103.20.128.0/22 -add china_ip_route 103.20.160.0/22 -add china_ip_route 103.20.248.0/22 -add china_ip_route 103.21.112.0/21 -add china_ip_route 103.21.140.0/22 -add china_ip_route 103.21.176.0/22 -add china_ip_route 103.21.240.0/22 -add china_ip_route 103.22.0.0/18 -add china_ip_route 103.22.64.0/19 -add china_ip_route 103.22.100.0/22 -add china_ip_route 103.22.104.0/21 -add china_ip_route 103.22.112.0/20 -add china_ip_route 103.22.188.0/22 -add china_ip_route 103.22.228.0/22 -add china_ip_route 103.22.252.0/22 -add china_ip_route 103.23.8.0/22 -add china_ip_route 103.23.56.0/22 -add china_ip_route 103.23.160.0/21 -add china_ip_route 103.23.176.0/22 -add china_ip_route 103.23.228.0/22 -add china_ip_route 103.24.24.0/22 -add china_ip_route 103.24.116.0/22 -add china_ip_route 103.24.128.0/22 -add china_ip_route 103.24.144.0/22 -add china_ip_route 103.24.176.0/22 -add china_ip_route 103.24.184.0/22 -add china_ip_route 103.24.228.0/22 -add china_ip_route 103.24.252.0/22 -add china_ip_route 103.25.20.0/22 -add china_ip_route 103.25.24.0/21 -add china_ip_route 103.25.32.0/21 -add china_ip_route 103.25.40.0/22 -add china_ip_route 103.25.48.0/22 -add china_ip_route 103.25.64.0/21 -add china_ip_route 103.25.148.0/22 -add china_ip_route 103.25.156.0/22 -add china_ip_route 103.25.216.0/22 -add china_ip_route 103.26.0.0/22 -add china_ip_route 103.26.64.0/22 -add china_ip_route 103.26.76.0/22 -add china_ip_route 103.26.116.0/22 -add china_ip_route 103.26.156.0/22 -add china_ip_route 103.26.160.0/22 -add china_ip_route 103.26.228.0/22 -add china_ip_route 103.26.240.0/22 -add china_ip_route 103.27.4.0/22 -add china_ip_route 103.27.12.0/22 -add china_ip_route 103.27.24.0/22 -add china_ip_route 103.27.56.0/22 -add china_ip_route 103.27.96.0/22 -add china_ip_route 103.27.240.0/22 -add china_ip_route 103.28.4.0/22 -add china_ip_route 103.28.8.0/22 -add china_ip_route 103.28.184.0/22 -add china_ip_route 103.28.204.0/22 -add china_ip_route 103.28.212.0/22 -add china_ip_route 103.29.16.0/22 -add china_ip_route 103.29.128.0/21 -add china_ip_route 103.29.136.0/22 -add china_ip_route 103.30.20.0/22 -add china_ip_route 103.30.96.0/22 -add china_ip_route 103.30.148.0/22 -add china_ip_route 103.30.202.0/23 -add china_ip_route 103.30.228.0/22 -add china_ip_route 103.30.236.0/22 -add china_ip_route 103.31.0.0/22 -add china_ip_route 103.31.48.0/21 -add china_ip_route 103.31.60.0/22 -add china_ip_route 103.31.64.0/21 -add china_ip_route 103.31.72.0/24 -add china_ip_route 103.31.148.0/22 -add china_ip_route 103.31.160.0/22 -add china_ip_route 103.31.168.0/22 -add china_ip_route 103.31.200.0/22 -add china_ip_route 103.31.236.0/22 -add china_ip_route 103.32.0.0/15 -add china_ip_route 103.34.0.0/16 -add china_ip_route 103.35.0.0/19 -add china_ip_route 103.35.32.0/20 -add china_ip_route 103.35.48.0/22 -add china_ip_route 103.35.104.0/22 -add china_ip_route 103.35.220.0/22 -add china_ip_route 103.36.28.0/22 -add china_ip_route 103.36.36.0/22 -add china_ip_route 103.36.56.0/21 -add china_ip_route 103.36.64.0/22 -add china_ip_route 103.36.72.0/22 -add china_ip_route 103.36.96.0/22 -add china_ip_route 103.36.132.0/22 -add china_ip_route 103.36.136.0/22 -add china_ip_route 103.36.160.0/19 -add china_ip_route 103.36.192.0/19 -add china_ip_route 103.36.224.0/20 -add china_ip_route 103.36.240.0/21 -add china_ip_route 103.37.12.0/22 -add china_ip_route 103.37.16.0/22 -add china_ip_route 103.37.24.0/22 -add china_ip_route 103.37.44.0/22 -add china_ip_route 103.37.52.0/22 -add china_ip_route 103.37.56.0/22 -add china_ip_route 103.37.72.0/22 -add china_ip_route 103.37.100.0/22 -add china_ip_route 103.37.104.0/22 -add china_ip_route 103.37.136.0/21 -add china_ip_route 103.37.144.0/20 -add china_ip_route 103.37.160.0/21 -add china_ip_route 103.37.172.0/22 -add china_ip_route 103.37.176.0/22 -add china_ip_route 103.37.188.0/22 -add china_ip_route 103.37.208.0/20 -add china_ip_route 103.37.252.0/22 -add china_ip_route 103.38.0.0/22 -add china_ip_route 103.38.32.0/22 -add china_ip_route 103.38.40.0/21 -add china_ip_route 103.38.76.0/22 -add china_ip_route 103.38.84.0/22 -add china_ip_route 103.38.92.0/22 -add china_ip_route 103.38.96.0/22 -add china_ip_route 103.38.116.0/22 -add china_ip_route 103.38.132.0/22 -add china_ip_route 103.38.140.0/22 -add china_ip_route 103.38.220.0/22 -add china_ip_route 103.38.224.0/21 -add china_ip_route 103.38.232.0/22 -add china_ip_route 103.38.252.0/23 -add china_ip_route 103.39.64.0/22 -add china_ip_route 103.39.88.0/22 -add china_ip_route 103.39.100.0/22 -add china_ip_route 103.39.104.0/22 -add china_ip_route 103.39.160.0/19 -add china_ip_route 103.39.200.0/21 -add china_ip_route 103.39.208.0/20 -add china_ip_route 103.39.224.0/21 -add china_ip_route 103.39.232.0/22 -add china_ip_route 103.40.12.0/22 -add china_ip_route 103.40.16.0/20 -add china_ip_route 103.40.32.0/20 -add china_ip_route 103.40.88.0/22 -add china_ip_route 103.40.192.0/22 -add china_ip_route 103.40.212.0/22 -add china_ip_route 103.40.220.0/22 -add china_ip_route 103.40.228.0/22 -add china_ip_route 103.40.232.0/21 -add china_ip_route 103.40.240.0/20 -add china_ip_route 103.41.0.0/22 -add china_ip_route 103.41.52.0/22 -add china_ip_route 103.41.140.0/22 -add china_ip_route 103.41.148.0/22 -add china_ip_route 103.41.152.0/22 -add china_ip_route 103.41.160.0/21 -add china_ip_route 103.41.220.0/22 -add china_ip_route 103.41.224.0/21 -add china_ip_route 103.41.232.0/22 -add china_ip_route 103.42.8.0/22 -add china_ip_route 103.42.24.0/22 -add china_ip_route 103.42.32.0/22 -add china_ip_route 103.42.64.0/21 -add china_ip_route 103.42.76.0/22 -add china_ip_route 103.42.232.0/22 -add china_ip_route 103.43.26.0/23 -add china_ip_route 103.43.96.0/21 -add china_ip_route 103.43.104.0/22 -add china_ip_route 103.43.124.0/22 -add china_ip_route 103.43.184.0/22 -add china_ip_route 103.43.196.0/22 -add china_ip_route 103.43.208.0/22 -add china_ip_route 103.43.220.0/22 -add china_ip_route 103.43.224.0/22 -add china_ip_route 103.43.240.0/22 -add china_ip_route 103.44.58.0/23 -add china_ip_route 103.44.80.0/22 -add china_ip_route 103.44.120.0/21 -add china_ip_route 103.44.144.0/22 -add china_ip_route 103.44.152.0/22 -add china_ip_route 103.44.168.0/22 -add china_ip_route 103.44.176.0/20 -add china_ip_route 103.44.192.0/20 -add china_ip_route 103.44.224.0/22 -add china_ip_route 103.44.236.0/22 -add china_ip_route 103.44.240.0/20 -add china_ip_route 103.45.0.0/18 -add china_ip_route 103.45.72.0/21 -add china_ip_route 103.45.80.0/20 -add china_ip_route 103.45.96.0/19 -add china_ip_route 103.45.128.0/18 -add china_ip_route 103.45.192.0/19 -add china_ip_route 103.45.224.0/22 -add china_ip_route 103.45.248.0/22 -add china_ip_route 103.46.0.0/22 -add china_ip_route 103.46.12.0/22 -add china_ip_route 103.46.16.0/20 -add china_ip_route 103.46.32.0/19 -add china_ip_route 103.46.64.0/18 -add china_ip_route 103.46.128.0/21 -add china_ip_route 103.46.136.0/22 -add china_ip_route 103.46.152.0/21 -add china_ip_route 103.46.160.0/20 -add china_ip_route 103.46.176.0/21 -add china_ip_route 103.46.244.0/22 -add china_ip_route 103.46.248.0/22 -add china_ip_route 103.47.4.0/22 -add china_ip_route 103.47.20.0/22 -add china_ip_route 103.47.36.0/22 -add china_ip_route 103.47.40.0/22 -add china_ip_route 103.47.48.0/22 -add china_ip_route 103.47.80.0/22 -add china_ip_route 103.47.96.0/22 -add china_ip_route 103.47.116.0/22 -add china_ip_route 103.47.120.0/22 -add china_ip_route 103.47.136.0/21 -add china_ip_route 103.47.212.0/22 -add china_ip_route 103.48.52.0/22 -add china_ip_route 103.48.92.0/22 -add china_ip_route 103.48.148.0/22 -add china_ip_route 103.48.152.0/22 -add china_ip_route 103.48.202.0/23 -add china_ip_route 103.48.216.0/21 -add china_ip_route 103.48.224.0/20 -add china_ip_route 103.48.240.0/21 -add china_ip_route 103.49.12.0/22 -add china_ip_route 103.49.20.0/22 -add china_ip_route 103.49.72.0/21 -add china_ip_route 103.49.96.0/22 -add china_ip_route 103.49.108.0/22 -add china_ip_route 103.49.128.0/22 -add china_ip_route 103.49.176.0/21 -add china_ip_route 103.50.36.0/22 -add china_ip_route 103.50.44.0/22 -add china_ip_route 103.50.48.0/20 -add china_ip_route 103.50.64.0/21 -add china_ip_route 103.50.72.0/22 -add china_ip_route 103.50.108.0/22 -add china_ip_route 103.50.112.0/20 -add china_ip_route 103.50.132.0/22 -add china_ip_route 103.50.136.0/21 -add china_ip_route 103.50.172.0/22 -add china_ip_route 103.50.176.0/20 -add china_ip_route 103.50.192.0/21 -add china_ip_route 103.50.200.0/22 -add china_ip_route 103.50.220.0/22 -add china_ip_route 103.50.224.0/20 -add china_ip_route 103.50.240.0/21 -add china_ip_route 103.50.248.0/22 -add china_ip_route 103.52.40.0/22 -add china_ip_route 103.52.72.0/21 -add china_ip_route 103.52.80.0/21 -add china_ip_route 103.52.96.0/21 -add china_ip_route 103.52.104.0/22 -add china_ip_route 103.52.160.0/21 -add china_ip_route 103.52.172.0/22 -add china_ip_route 103.52.176.0/22 -add china_ip_route 103.52.184.0/22 -add china_ip_route 103.52.196.0/22 -add china_ip_route 103.53.64.0/21 -add china_ip_route 103.53.92.0/22 -add china_ip_route 103.53.124.0/22 -add china_ip_route 103.53.128.0/20 -add china_ip_route 103.53.144.0/22 -add china_ip_route 103.53.160.0/22 -add china_ip_route 103.53.180.0/22 -add china_ip_route 103.53.204.0/22 -add china_ip_route 103.53.208.0/21 -add china_ip_route 103.53.236.0/22 -add china_ip_route 103.53.248.0/22 -add china_ip_route 103.54.8.0/22 -add china_ip_route 103.54.48.0/22 -add china_ip_route 103.54.160.0/21 -add china_ip_route 103.54.212.0/22 -add china_ip_route 103.54.228.0/22 -add china_ip_route 103.54.240.0/22 -add china_ip_route 103.55.80.0/22 -add china_ip_route 103.55.120.0/22 -add china_ip_route 103.55.152.0/22 -add china_ip_route 103.55.172.0/22 -add china_ip_route 103.55.204.0/22 -add china_ip_route 103.55.208.0/22 -add china_ip_route 103.55.228.0/22 -add china_ip_route 103.55.236.0/22 -add china_ip_route 103.55.240.0/22 -add china_ip_route 103.56.20.0/22 -add china_ip_route 103.56.32.0/22 -add china_ip_route 103.56.56.0/21 -add china_ip_route 103.56.72.0/21 -add china_ip_route 103.56.140.0/22 -add china_ip_route 103.56.152.0/22 -add china_ip_route 103.56.184.0/22 -add china_ip_route 103.56.200.0/22 -add china_ip_route 103.57.12.0/22 -add china_ip_route 103.57.52.0/22 -add china_ip_route 103.57.56.0/22 -add china_ip_route 103.57.76.0/22 -add china_ip_route 103.57.136.0/22 -add china_ip_route 103.57.196.0/22 -add china_ip_route 103.58.24.0/22 -add china_ip_route 103.59.76.0/22 -add china_ip_route 103.59.112.0/21 -add china_ip_route 103.59.120.0/24 -add china_ip_route 103.59.123.0/24 -add china_ip_route 103.59.124.0/22 -add china_ip_route 103.59.128.0/22 -add china_ip_route 103.59.148.0/22 -add china_ip_route 103.60.32.0/22 -add china_ip_route 103.60.44.0/22 -add china_ip_route 103.60.164.0/22 -add china_ip_route 103.60.228.0/22 -add china_ip_route 103.60.236.0/22 -add china_ip_route 103.61.60.0/24 -add china_ip_route 103.61.104.0/22 -add china_ip_route 103.61.140.0/22 -add china_ip_route 103.61.152.0/21 -add china_ip_route 103.61.160.0/22 -add china_ip_route 103.61.172.0/22 -add china_ip_route 103.61.176.0/22 -add china_ip_route 103.62.24.0/22 -add china_ip_route 103.62.72.0/21 -add china_ip_route 103.62.80.0/21 -add china_ip_route 103.62.88.0/22 -add china_ip_route 103.62.96.0/19 -add china_ip_route 103.62.128.0/21 -add china_ip_route 103.62.156.0/22 -add china_ip_route 103.62.160.0/19 -add china_ip_route 103.62.192.0/22 -add china_ip_route 103.62.204.0/22 -add china_ip_route 103.62.208.0/20 -add china_ip_route 103.62.224.0/22 -add china_ip_route 103.63.32.0/19 -add china_ip_route 103.63.64.0/20 -add china_ip_route 103.63.80.0/21 -add china_ip_route 103.63.88.0/22 -add china_ip_route 103.63.140.0/22 -add china_ip_route 103.63.144.0/22 -add china_ip_route 103.63.152.0/22 -add china_ip_route 103.63.160.0/20 -add china_ip_route 103.63.176.0/21 -add china_ip_route 103.63.184.0/22 -add china_ip_route 103.63.192.0/20 -add china_ip_route 103.63.208.0/22 -add china_ip_route 103.63.240.0/20 -add china_ip_route 103.64.0.0/21 -add china_ip_route 103.64.24.0/21 -add china_ip_route 103.64.32.0/19 -add china_ip_route 103.64.64.0/18 -add china_ip_route 103.64.140.0/22 -add china_ip_route 103.64.144.0/22 -add china_ip_route 103.64.152.0/21 -add china_ip_route 103.64.160.0/19 -add china_ip_route 103.64.192.0/18 -add china_ip_route 103.65.0.0/21 -add china_ip_route 103.65.12.0/22 -add china_ip_route 103.65.16.0/22 -add china_ip_route 103.65.48.0/20 -add china_ip_route 103.65.64.0/19 -add china_ip_route 103.65.100.0/22 -add china_ip_route 103.65.104.0/21 -add china_ip_route 103.65.112.0/20 -add china_ip_route 103.65.128.0/21 -add china_ip_route 103.65.136.0/22 -add china_ip_route 103.65.144.0/20 -add china_ip_route 103.65.160.0/20 -add china_ip_route 103.66.32.0/22 -add china_ip_route 103.66.40.0/22 -add china_ip_route 103.66.108.0/22 -add china_ip_route 103.66.200.0/22 -add china_ip_route 103.66.240.0/20 -add china_ip_route 103.67.0.0/21 -add china_ip_route 103.67.8.0/22 -add china_ip_route 103.67.40.0/21 -add china_ip_route 103.67.48.0/20 -add china_ip_route 103.67.64.0/18 -add china_ip_route 103.67.128.0/20 -add china_ip_route 103.67.144.0/21 -add china_ip_route 103.67.172.0/24 -add china_ip_route 103.67.175.0/24 -add china_ip_route 103.67.192.0/22 -add china_ip_route 103.67.212.0/22 -add china_ip_route 103.68.88.0/22 -add china_ip_route 103.68.100.0/22 -add china_ip_route 103.68.128.0/22 -add china_ip_route 103.69.16.0/22 -add china_ip_route 103.70.8.0/22 -add china_ip_route 103.70.148.0/22 -add china_ip_route 103.70.236.0/22 -add china_ip_route 103.70.252.0/22 -add china_ip_route 103.71.0.0/22 -add china_ip_route 103.71.68.0/22 -add china_ip_route 103.71.72.0/22 -add china_ip_route 103.71.80.0/21 -add china_ip_route 103.71.88.0/22 -add china_ip_route 103.71.120.0/21 -add china_ip_route 103.71.128.0/22 -add china_ip_route 103.71.196.0/22 -add china_ip_route 103.71.200.0/22 -add china_ip_route 103.71.232.0/22 -add china_ip_route 103.72.12.0/22 -add china_ip_route 103.72.16.0/20 -add china_ip_route 103.72.32.0/20 -add china_ip_route 103.72.48.0/21 -add china_ip_route 103.72.112.0/21 -add china_ip_route 103.72.124.0/22 -add china_ip_route 103.72.128.0/21 -add china_ip_route 103.72.149.0/24 -add china_ip_route 103.72.150.0/23 -add china_ip_route 103.72.172.0/22 -add china_ip_route 103.72.180.0/22 -add china_ip_route 103.72.224.0/19 -add china_ip_route 103.73.0.0/19 -add china_ip_route 103.73.48.0/22 -add china_ip_route 103.73.116.0/22 -add china_ip_route 103.73.120.0/22 -add china_ip_route 103.73.128.0/20 -add china_ip_route 103.73.168.0/22 -add china_ip_route 103.73.176.0/22 -add china_ip_route 103.73.204.0/22 -add china_ip_route 103.73.208.0/22 -add china_ip_route 103.73.240.0/23 -add china_ip_route 103.73.244.0/22 -add china_ip_route 103.73.248.0/22 -add china_ip_route 103.74.24.0/21 -add china_ip_route 103.74.32.0/20 -add china_ip_route 103.74.48.0/22 -add china_ip_route 103.74.56.0/21 -add china_ip_route 103.74.80.0/22 -add china_ip_route 103.74.124.0/22 -add china_ip_route 103.74.148.0/22 -add china_ip_route 103.74.152.0/21 -add china_ip_route 103.74.204.0/22 -add china_ip_route 103.74.232.0/22 -add china_ip_route 103.75.87.0/24 -add china_ip_route 103.75.88.0/21 -add china_ip_route 103.75.104.0/21 -add china_ip_route 103.75.112.0/22 -add china_ip_route 103.75.120.0/22 -add china_ip_route 103.75.128.0/22 -add china_ip_route 103.75.144.0/22 -add china_ip_route 103.75.152.0/22 -add china_ip_route 103.76.60.0/22 -add china_ip_route 103.76.64.0/21 -add china_ip_route 103.76.72.0/22 -add china_ip_route 103.76.92.0/22 -add china_ip_route 103.76.216.0/21 -add china_ip_route 103.76.224.0/22 -add china_ip_route 103.77.28.0/22 -add china_ip_route 103.77.52.0/22 -add china_ip_route 103.77.56.0/22 -add china_ip_route 103.77.88.0/22 -add china_ip_route 103.77.132.0/22 -add china_ip_route 103.77.148.0/22 -add china_ip_route 103.77.220.0/22 -add china_ip_route 103.78.56.0/21 -add china_ip_route 103.78.64.0/22 -add china_ip_route 103.78.124.0/22 -add china_ip_route 103.78.172.0/22 -add china_ip_route 103.78.176.0/22 -add china_ip_route 103.78.196.0/22 -add china_ip_route 103.78.228.0/22 -add china_ip_route 103.79.24.0/21 -add china_ip_route 103.79.36.0/22 -add china_ip_route 103.79.40.0/21 -add china_ip_route 103.79.56.0/21 -add china_ip_route 103.79.64.0/21 -add china_ip_route 103.79.80.0/21 -add china_ip_route 103.79.136.0/22 -add china_ip_route 103.79.188.0/22 -add china_ip_route 103.79.192.0/20 -add china_ip_route 103.79.208.0/21 -add china_ip_route 103.80.44.0/22 -add china_ip_route 103.80.72.0/22 -add china_ip_route 103.80.176.0/21 -add china_ip_route 103.80.184.0/22 -add china_ip_route 103.80.192.0/22 -add china_ip_route 103.80.200.0/22 -add china_ip_route 103.80.232.0/22 -add china_ip_route 103.81.4.0/22 -add china_ip_route 103.81.44.0/22 -add china_ip_route 103.81.48.0/22 -add china_ip_route 103.81.96.0/22 -add china_ip_route 103.81.120.0/22 -add china_ip_route 103.81.148.0/22 -add china_ip_route 103.81.164.0/22 -add china_ip_route 103.81.200.0/22 -add china_ip_route 103.81.232.0/22 -add china_ip_route 103.82.60.0/22 -add china_ip_route 103.82.68.0/22 -add china_ip_route 103.82.84.0/22 -add china_ip_route 103.82.104.0/22 -add china_ip_route 103.82.224.0/22 -add china_ip_route 103.82.236.0/22 -add china_ip_route 103.83.44.0/22 -add china_ip_route 103.83.52.0/22 -add china_ip_route 103.83.60.0/22 -add china_ip_route 103.83.72.0/22 -add china_ip_route 103.83.112.0/22 -add china_ip_route 103.83.132.0/22 -add china_ip_route 103.83.180.0/22 -add china_ip_route 103.84.0.0/22 -add china_ip_route 103.84.12.0/22 -add china_ip_route 103.84.20.0/22 -add china_ip_route 103.84.24.0/21 -add china_ip_route 103.84.48.0/22 -add china_ip_route 103.84.56.0/22 -add china_ip_route 103.84.64.0/22 -add china_ip_route 103.84.72.0/22 -add china_ip_route 103.85.44.0/22 -add china_ip_route 103.85.48.0/21 -add china_ip_route 103.85.56.0/22 -add china_ip_route 103.85.84.0/22 -add china_ip_route 103.85.136.0/22 -add china_ip_route 103.85.144.0/22 -add china_ip_route 103.85.164.0/22 -add china_ip_route 103.85.168.0/21 -add china_ip_route 103.85.176.0/22 -add china_ip_route 103.86.28.0/22 -add china_ip_route 103.86.32.0/22 -add china_ip_route 103.86.60.0/22 -add china_ip_route 103.86.129.0/24 -add china_ip_route 103.86.204.0/22 -add china_ip_route 103.86.208.0/20 -add china_ip_route 103.86.224.0/19 -add china_ip_route 103.87.0.0/21 -add china_ip_route 103.87.20.0/22 -add china_ip_route 103.87.32.0/22 -add china_ip_route 103.87.96.0/22 -add china_ip_route 103.87.132.0/22 -add china_ip_route 103.87.180.0/22 -add china_ip_route 103.87.224.0/22 -add china_ip_route 103.88.4.0/22 -add china_ip_route 103.88.8.0/21 -add china_ip_route 103.88.16.0/21 -add china_ip_route 103.88.32.0/21 -add china_ip_route 103.88.60.0/22 -add china_ip_route 103.88.64.0/22 -add china_ip_route 103.88.72.0/22 -add china_ip_route 103.88.96.0/21 -add china_ip_route 103.88.152.0/23 -add china_ip_route 103.88.164.0/22 -add china_ip_route 103.88.212.0/22 -add china_ip_route 103.89.28.0/22 -add china_ip_route 103.89.96.0/20 -add china_ip_route 103.89.112.0/22 -add china_ip_route 103.89.148.0/22 -add china_ip_route 103.89.172.0/22 -add china_ip_route 103.89.184.0/21 -add china_ip_route 103.89.192.0/19 -add china_ip_route 103.89.224.0/21 -add china_ip_route 103.90.52.0/22 -add china_ip_route 103.90.92.0/22 -add china_ip_route 103.90.100.0/22 -add china_ip_route 103.90.104.0/21 -add china_ip_route 103.90.112.0/20 -add china_ip_route 103.90.128.0/21 -add china_ip_route 103.90.152.0/22 -add china_ip_route 103.90.168.0/22 -add china_ip_route 103.90.173.0/24 -add china_ip_route 103.90.176.0/22 -add china_ip_route 103.90.188.0/22 -add china_ip_route 103.90.192.0/22 -add china_ip_route 103.91.36.0/22 -add china_ip_route 103.91.40.0/22 -add china_ip_route 103.91.108.0/22 -add china_ip_route 103.91.152.0/22 -add china_ip_route 103.91.176.0/22 -add china_ip_route 103.91.200.0/22 -add china_ip_route 103.91.208.0/21 -add china_ip_route 103.91.236.0/22 -add china_ip_route 103.92.48.0/20 -add china_ip_route 103.92.64.0/20 -add china_ip_route 103.92.80.0/22 -add china_ip_route 103.92.88.0/22 -add china_ip_route 103.92.108.0/22 -add china_ip_route 103.92.124.0/22 -add china_ip_route 103.92.132.0/22 -add china_ip_route 103.92.156.0/22 -add china_ip_route 103.92.164.0/22 -add china_ip_route 103.92.168.0/21 -add china_ip_route 103.92.176.0/20 -add china_ip_route 103.92.192.0/22 -add china_ip_route 103.92.236.0/22 -add china_ip_route 103.92.240.0/20 -add china_ip_route 103.93.0.0/21 -add china_ip_route 103.93.28.0/22 -add china_ip_route 103.93.84.0/22 -add china_ip_route 103.93.152.0/22 -add china_ip_route 103.93.180.0/22 -add china_ip_route 103.93.204.0/22 -add china_ip_route 103.94.12.0/22 -add china_ip_route 103.94.20.0/22 -add china_ip_route 103.94.29.0/24 -add china_ip_route 103.94.30.0/23 -add china_ip_route 103.94.32.0/20 -add china_ip_route 103.94.72.0/22 -add china_ip_route 103.94.88.0/22 -add china_ip_route 103.94.116.0/22 -add china_ip_route 103.94.160.0/22 -add china_ip_route 103.94.200.0/22 -add china_ip_route 103.95.28.0/24 -add china_ip_route 103.95.30.0/23 -add china_ip_route 103.95.52.0/22 -add china_ip_route 103.95.69.0/24 -add china_ip_route 103.95.70.0/23 -add china_ip_route 103.95.88.0/21 -add china_ip_route 103.95.136.0/21 -add china_ip_route 103.95.144.0/22 -add china_ip_route 103.95.152.0/22 -add china_ip_route 103.95.216.0/21 -add china_ip_route 103.95.224.0/22 -add china_ip_route 103.95.236.0/22 -add china_ip_route 103.95.240.0/20 -add china_ip_route 103.96.8.0/22 -add china_ip_route 103.96.124.0/22 -add china_ip_route 103.96.136.0/22 -add china_ip_route 103.96.152.0/21 -add china_ip_route 103.96.160.0/19 -add china_ip_route 103.96.192.0/20 -add china_ip_route 103.96.208.0/21 -add china_ip_route 103.96.216.0/22 -add china_ip_route 103.97.40.0/22 -add china_ip_route 103.97.60.0/23 -add china_ip_route 103.97.112.0/21 -add china_ip_route 103.97.148.0/22 -add china_ip_route 103.97.188.0/22 -add china_ip_route 103.97.192.0/22 -add china_ip_route 103.98.40.0/21 -add china_ip_route 103.98.48.0/22 -add china_ip_route 103.98.56.0/22 -add china_ip_route 103.98.80.0/22 -add china_ip_route 103.98.88.0/22 -add china_ip_route 103.98.100.0/22 -add china_ip_route 103.98.124.0/24 -add china_ip_route 103.98.126.0/23 -add china_ip_route 103.98.136.0/21 -add china_ip_route 103.98.144.0/22 -add china_ip_route 103.98.164.0/22 -add china_ip_route 103.98.168.0/22 -add china_ip_route 103.98.180.0/22 -add china_ip_route 103.98.196.0/22 -add china_ip_route 103.98.216.0/21 -add china_ip_route 103.98.224.0/21 -add china_ip_route 103.98.232.0/22 -add china_ip_route 103.98.240.0/21 -add china_ip_route 103.98.248.0/23 -add china_ip_route 103.98.250.0/24 -add china_ip_route 103.98.252.0/22 -add china_ip_route 103.99.56.0/22 -add china_ip_route 103.99.104.0/22 -add china_ip_route 103.99.116.0/22 -add china_ip_route 103.99.120.0/22 -add china_ip_route 103.99.132.0/22 -add china_ip_route 103.99.136.0/21 -add china_ip_route 103.99.144.0/22 -add china_ip_route 103.99.152.0/22 -add china_ip_route 103.99.220.0/22 -add china_ip_route 103.99.232.0/21 -add china_ip_route 103.100.0.0/22 -add china_ip_route 103.100.32.0/22 -add china_ip_route 103.100.40.0/22 -add china_ip_route 103.100.48.0/22 -add china_ip_route 103.100.56.0/22 -add china_ip_route 103.100.64.0/22 -add china_ip_route 103.100.88.0/22 -add china_ip_route 103.100.116.0/22 -add china_ip_route 103.100.144.0/22 -add china_ip_route 103.100.240.0/22 -add china_ip_route 103.100.248.0/21 -add china_ip_route 103.101.4.0/22 -add china_ip_route 103.101.8.0/21 -add china_ip_route 103.101.60.0/22 -add china_ip_route 103.101.121.0/24 -add china_ip_route 103.101.122.0/23 -add china_ip_route 103.101.124.0/24 -add china_ip_route 103.101.126.0/23 -add china_ip_route 103.101.144.0/21 -add china_ip_route 103.101.180.0/22 -add china_ip_route 103.101.184.0/22 -add china_ip_route 103.102.76.0/22 -add china_ip_route 103.102.80.0/22 -add china_ip_route 103.102.168.0/21 -add china_ip_route 103.102.180.0/22 -add china_ip_route 103.102.184.0/21 -add china_ip_route 103.102.192.0/22 -add china_ip_route 103.102.196.0/24 -add china_ip_route 103.102.200.0/22 -add china_ip_route 103.102.208.0/21 -add china_ip_route 103.103.12.0/22 -add china_ip_route 103.103.16.0/22 -add china_ip_route 103.103.36.0/22 -add china_ip_route 103.103.72.0/22 -add china_ip_route 103.103.188.0/22 -add china_ip_route 103.103.204.0/22 -add china_ip_route 103.103.225.0/24 -add china_ip_route 103.104.36.0/22 -add china_ip_route 103.104.40.0/22 -add china_ip_route 103.104.64.0/22 -add china_ip_route 103.104.152.0/22 -add china_ip_route 103.104.252.0/22 -add china_ip_route 103.105.0.0/21 -add china_ip_route 103.105.12.0/22 -add china_ip_route 103.105.16.0/22 -add china_ip_route 103.105.60.0/22 -add china_ip_route 103.105.116.0/22 -add china_ip_route 103.105.180.0/22 -add china_ip_route 103.105.184.0/22 -add china_ip_route 103.105.200.0/21 -add china_ip_route 103.105.220.0/22 -add china_ip_route 103.106.36.0/22 -add china_ip_route 103.106.40.0/21 -add china_ip_route 103.106.60.0/22 -add china_ip_route 103.106.68.0/22 -add china_ip_route 103.106.96.0/22 -add china_ip_route 103.106.120.0/22 -add china_ip_route 103.106.128.0/21 -add china_ip_route 103.106.190.0/23 -add china_ip_route 103.106.196.0/22 -add china_ip_route 103.106.212.0/22 -add china_ip_route 103.106.252.0/22 -add china_ip_route 103.107.0.0/22 -add china_ip_route 103.107.28.0/22 -add china_ip_route 103.107.32.0/22 -add china_ip_route 103.107.44.0/22 -add china_ip_route 103.107.72.0/22 -add china_ip_route 103.107.164.0/22 -add china_ip_route 103.107.168.0/22 -add china_ip_route 103.107.188.0/22 -add china_ip_route 103.107.192.0/22 -add china_ip_route 103.107.208.0/20 -add china_ip_route 103.108.52.0/22 -add china_ip_route 103.108.160.0/21 -add china_ip_route 103.108.196.0/22 -add china_ip_route 103.108.208.0/21 -add china_ip_route 103.108.224.0/22 -add china_ip_route 103.108.244.0/22 -add china_ip_route 103.108.251.0/24 -add china_ip_route 103.109.20.0/22 -add china_ip_route 103.109.48.0/22 -add china_ip_route 103.109.88.0/22 -add china_ip_route 103.109.107.0/24 -add china_ip_route 103.109.248.0/22 -add china_ip_route 103.110.32.0/22 -add china_ip_route 103.110.92.0/22 -add china_ip_route 103.110.119.0/24 -add china_ip_route 103.110.127.0/24 -add china_ip_route 103.110.128.0/23 -add china_ip_route 103.110.131.0/24 -add china_ip_route 103.110.132.0/22 -add china_ip_route 103.110.136.0/22 -add china_ip_route 103.110.156.0/22 -add china_ip_route 103.110.188.0/22 -add china_ip_route 103.110.204.0/22 -add china_ip_route 103.111.64.0/22 -add china_ip_route 103.111.172.0/22 -add china_ip_route 103.111.252.0/22 -add china_ip_route 103.112.72.0/22 -add china_ip_route 103.112.88.0/21 -add china_ip_route 103.112.108.0/22 -add china_ip_route 103.112.112.0/22 -add china_ip_route 103.112.140.0/22 -add china_ip_route 103.113.4.0/22 -add china_ip_route 103.113.144.0/22 -add china_ip_route 103.113.220.0/22 -add china_ip_route 103.113.232.0/21 -add china_ip_route 103.114.4.0/22 -add china_ip_route 103.114.68.0/22 -add china_ip_route 103.114.100.0/22 -add china_ip_route 103.114.148.0/22 -add china_ip_route 103.114.156.0/23 -add china_ip_route 103.114.212.0/22 -add china_ip_route 103.114.236.0/22 -add china_ip_route 103.114.240.0/22 -add china_ip_route 103.115.52.0/22 -add china_ip_route 103.115.68.0/22 -add china_ip_route 103.115.92.0/22 -add china_ip_route 103.115.120.0/22 -add china_ip_route 103.115.148.0/22 -add china_ip_route 103.115.248.0/22 -add china_ip_route 103.116.76.0/22 -add china_ip_route 103.116.92.0/22 -add china_ip_route 103.116.120.0/22 -add china_ip_route 103.116.128.0/22 -add china_ip_route 103.116.184.0/22 -add china_ip_route 103.116.220.0/22 -add china_ip_route 103.116.224.0/21 -add china_ip_route 103.117.16.0/22 -add china_ip_route 103.117.88.0/22 -add china_ip_route 103.117.188.0/22 -add china_ip_route 103.117.220.0/22 -add china_ip_route 103.118.19.0/24 -add china_ip_route 103.118.52.0/22 -add china_ip_route 103.118.56.0/21 -add china_ip_route 103.118.64.0/21 -add china_ip_route 103.118.72.0/22 -add china_ip_route 103.118.88.0/22 -add china_ip_route 103.118.173.0/24 -add china_ip_route 103.119.115.0/24 -add china_ip_route 103.119.156.0/22 -add china_ip_route 103.119.180.0/22 -add china_ip_route 103.119.200.0/22 -add china_ip_route 103.119.224.0/22 -add china_ip_route 103.120.52.0/22 -add china_ip_route 103.120.72.0/22 -add china_ip_route 103.120.76.0/24 -add china_ip_route 103.120.88.0/22 -add china_ip_route 103.120.96.0/22 -add china_ip_route 103.120.140.0/22 -add china_ip_route 103.120.196.0/22 -add china_ip_route 103.120.224.0/22 -add china_ip_route 103.121.52.0/22 -add china_ip_route 103.121.160.0/21 -add china_ip_route 103.121.250.0/24 -add china_ip_route 103.121.252.0/22 -add china_ip_route 103.122.48.0/22 -add china_ip_route 103.122.178.0/23 -add china_ip_route 103.122.192.0/22 -add china_ip_route 103.122.240.0/23 -add china_ip_route 103.122.242.0/24 -add china_ip_route 103.123.4.0/22 -add china_ip_route 103.123.56.0/22 -add china_ip_route 103.123.88.0/21 -add china_ip_route 103.123.116.0/22 -add china_ip_route 103.123.176.0/22 -add china_ip_route 103.123.200.0/21 -add china_ip_route 103.123.208.0/21 -add china_ip_route 103.124.24.0/22 -add china_ip_route 103.124.48.0/22 -add china_ip_route 103.124.64.0/22 -add china_ip_route 103.124.212.0/22 -add china_ip_route 103.124.216.0/22 -add china_ip_route 103.125.20.0/22 -add china_ip_route 103.125.44.0/22 -add china_ip_route 103.125.132.0/22 -add china_ip_route 103.125.164.0/22 -add china_ip_route 103.125.196.0/22 -add china_ip_route 103.125.236.0/22 -add china_ip_route 103.126.0.0/22 -add china_ip_route 103.126.16.0/23 -add china_ip_route 103.126.44.0/22 -add china_ip_route 103.126.124.0/22 -add china_ip_route 103.126.128.0/22 -add china_ip_route 103.129.53.0/24 -add china_ip_route 103.129.54.0/23 -add china_ip_route 103.129.148.0/22 -add china_ip_route 103.130.132.0/22 -add china_ip_route 103.130.160.0/22 -add china_ip_route 103.130.228.0/22 -add china_ip_route 103.131.20.0/22 -add china_ip_route 103.131.36.0/22 -add china_ip_route 103.131.152.0/22 -add china_ip_route 103.131.168.0/22 -add china_ip_route 103.131.224.0/21 -add china_ip_route 103.131.240.0/22 -add china_ip_route 103.132.60.0/22 -add china_ip_route 103.132.64.0/20 -add china_ip_route 103.132.80.0/22 -add china_ip_route 103.132.104.0/21 -add china_ip_route 103.132.112.0/21 -add china_ip_route 103.132.120.0/22 -add china_ip_route 103.132.188.0/22 -add china_ip_route 103.132.208.0/21 -add china_ip_route 103.133.12.0/22 -add china_ip_route 103.133.40.0/22 -add china_ip_route 103.133.128.0/22 -add china_ip_route 103.133.232.0/22 -add china_ip_route 103.134.196.0/22 -add china_ip_route 103.135.80.0/22 -add china_ip_route 103.135.124.0/22 -add china_ip_route 103.135.148.0/22 -add china_ip_route 103.135.156.0/22 -add china_ip_route 103.135.160.0/21 -add china_ip_route 103.135.176.0/22 -add china_ip_route 103.135.184.0/22 -add china_ip_route 103.135.192.0/21 -add china_ip_route 103.135.236.0/22 -add china_ip_route 103.136.128.0/22 -add china_ip_route 103.136.232.0/22 -add china_ip_route 103.137.58.0/23 -add china_ip_route 103.137.60.0/24 -add china_ip_route 103.137.136.0/23 -add china_ip_route 103.137.149.0/24 -add china_ip_route 103.137.180.0/22 -add china_ip_route 103.137.236.0/22 -add china_ip_route 103.138.2.0/23 -add china_ip_route 103.138.135.0/24 -add china_ip_route 103.138.208.0/23 -add china_ip_route 103.138.220.0/23 -add china_ip_route 103.138.248.0/23 -add china_ip_route 103.139.22.0/23 -add china_ip_route 103.139.134.0/23 -add china_ip_route 103.139.172.0/23 -add china_ip_route 103.139.204.0/23 -add china_ip_route 103.139.212.0/23 -add china_ip_route 103.140.14.0/23 -add china_ip_route 103.140.46.0/23 -add china_ip_route 103.140.140.0/23 -add china_ip_route 103.140.144.0/23 -add china_ip_route 103.140.192.0/23 -add china_ip_route 103.141.10.0/23 -add china_ip_route 103.141.58.0/23 -add china_ip_route 103.141.128.0/23 -add china_ip_route 103.141.186.0/23 -add china_ip_route 103.141.242.0/23 -add china_ip_route 103.142.0.0/23 -add china_ip_route 103.142.28.0/23 -add china_ip_route 103.142.58.0/23 -add china_ip_route 103.142.82.0/23 -add china_ip_route 103.142.96.0/23 -add china_ip_route 103.142.122.0/23 -add china_ip_route 103.142.128.0/23 -add china_ip_route 103.142.154.0/23 -add china_ip_route 103.142.156.0/23 -add china_ip_route 103.142.180.0/23 -add china_ip_route 103.142.186.0/23 -add china_ip_route 103.142.230.0/24 -add china_ip_route 103.142.234.0/23 -add china_ip_route 103.142.238.0/23 -add china_ip_route 103.143.16.0/22 -add china_ip_route 103.143.31.0/24 -add china_ip_route 103.143.74.0/23 -add china_ip_route 103.143.120.0/24 -add china_ip_route 103.143.124.0/23 -add china_ip_route 103.143.132.0/22 -add china_ip_route 103.143.174.0/23 -add china_ip_route 103.143.228.0/23 -add china_ip_route 103.144.66.0/23 -add china_ip_route 103.144.70.0/23 -add china_ip_route 103.144.72.0/23 -add china_ip_route 103.144.136.0/23 -add china_ip_route 103.144.158.0/23 -add china_ip_route 103.145.42.0/23 -add china_ip_route 103.145.94.0/23 -add china_ip_route 103.145.98.0/23 -add china_ip_route 103.145.188.0/23 -add china_ip_route 103.146.6.0/23 -add china_ip_route 103.146.72.0/23 -add china_ip_route 103.146.126.0/23 -add china_ip_route 103.146.138.0/23 -add china_ip_route 103.146.236.0/23 -add china_ip_route 103.146.252.0/23 -add china_ip_route 103.147.124.0/23 -add china_ip_route 103.147.198.0/23 -add china_ip_route 103.147.206.0/23 -add china_ip_route 103.147.211.0/24 -add china_ip_route 103.148.174.0/23 -add china_ip_route 103.149.6.0/23 -add china_ip_route 103.149.17.0/24 -add china_ip_route 103.149.44.0/23 -add china_ip_route 103.149.190.0/23 -add china_ip_route 103.149.210.0/23 -add china_ip_route 103.149.214.0/23 -add china_ip_route 103.149.220.0/23 -add china_ip_route 103.149.242.0/23 -add china_ip_route 103.149.244.0/22 -add china_ip_route 103.150.24.0/23 -add china_ip_route 103.150.66.0/23 -add china_ip_route 103.150.72.0/23 -add china_ip_route 103.150.122.0/23 -add china_ip_route 103.150.126.0/23 -add china_ip_route 103.150.128.0/23 -add china_ip_route 103.150.131.0/24 -add china_ip_route 103.150.146.0/23 -add china_ip_route 103.150.164.0/23 -add china_ip_route 103.150.200.0/23 -add china_ip_route 103.150.216.0/23 -add china_ip_route 103.150.244.0/23 -add china_ip_route 103.151.142.0/23 -add china_ip_route 103.151.148.0/22 -add china_ip_route 103.151.158.0/23 -add china_ip_route 103.152.28.0/22 -add china_ip_route 103.152.76.0/23 -add china_ip_route 103.152.80.0/23 -add china_ip_route 103.152.113.0/24 -add china_ip_route 103.152.120.0/22 -add china_ip_route 103.152.152.0/23 -add china_ip_route 103.152.168.0/23 -add china_ip_route 103.152.186.0/23 -add china_ip_route 103.152.190.0/23 -add china_ip_route 103.152.192.0/23 -add china_ip_route 103.152.200.0/23 -add china_ip_route 103.152.208.0/23 -add china_ip_route 103.152.224.0/23 -add china_ip_route 103.152.247.0/24 -add china_ip_route 103.152.250.0/23 -add china_ip_route 103.153.4.0/23 -add china_ip_route 103.153.36.0/23 -add china_ip_route 103.153.99.0/24 -add china_ip_route 103.153.100.0/23 -add china_ip_route 103.153.114.0/23 -add china_ip_route 103.153.122.0/23 -add china_ip_route 103.153.128.0/23 -add china_ip_route 103.153.132.0/23 -add china_ip_route 103.153.138.0/23 -add china_ip_route 103.153.146.0/23 -add china_ip_route 103.153.160.0/23 -add china_ip_route 103.154.18.0/23 -add china_ip_route 103.154.30.0/23 -add china_ip_route 103.154.32.0/23 -add china_ip_route 103.154.40.0/23 -add china_ip_route 103.154.66.0/23 -add china_ip_route 103.154.162.0/23 -add china_ip_route 103.154.164.0/23 -add china_ip_route 103.154.168.0/23 -add china_ip_route 103.154.243.0/24 -add china_ip_route 103.155.14.0/23 -add china_ip_route 103.155.16.0/23 -add china_ip_route 103.155.34.0/23 -add china_ip_route 103.192.0.0/19 -add china_ip_route 103.192.48.0/21 -add china_ip_route 103.192.56.0/22 -add china_ip_route 103.192.84.0/22 -add china_ip_route 103.192.88.0/21 -add china_ip_route 103.192.96.0/20 -add china_ip_route 103.192.112.0/22 -add china_ip_route 103.192.128.0/20 -add china_ip_route 103.192.144.0/22 -add china_ip_route 103.192.164.0/22 -add china_ip_route 103.192.188.0/22 -add china_ip_route 103.192.208.0/21 -add china_ip_route 103.192.216.0/22 -add china_ip_route 103.192.252.0/22 -add china_ip_route 103.193.40.0/21 -add china_ip_route 103.193.120.0/22 -add china_ip_route 103.193.140.0/22 -add china_ip_route 103.193.160.0/22 -add china_ip_route 103.193.188.0/22 -add china_ip_route 103.193.192.0/22 -add china_ip_route 103.193.212.0/22 -add china_ip_route 103.193.216.0/21 -add china_ip_route 103.193.224.0/20 -add china_ip_route 103.194.16.0/22 -add china_ip_route 103.195.112.0/22 -add china_ip_route 103.195.152.0/22 -add china_ip_route 103.195.160.0/22 -add china_ip_route 103.196.64.0/22 -add china_ip_route 103.196.72.0/22 -add china_ip_route 103.196.88.0/21 -add china_ip_route 103.196.96.0/22 -add china_ip_route 103.196.168.0/22 -add china_ip_route 103.196.185.0/24 -add china_ip_route 103.196.186.0/23 -add china_ip_route 103.197.181.0/24 -add china_ip_route 103.197.183.0/24 -add china_ip_route 103.197.228.0/22 -add china_ip_route 103.197.253.0/24 -add china_ip_route 103.197.254.0/23 -add china_ip_route 103.198.20.0/22 -add china_ip_route 103.198.60.0/22 -add china_ip_route 103.198.64.0/22 -add china_ip_route 103.198.72.0/22 -add china_ip_route 103.198.124.0/22 -add china_ip_route 103.198.156.0/22 -add china_ip_route 103.198.180.0/22 -add china_ip_route 103.198.196.0/22 -add china_ip_route 103.198.200.0/22 -add china_ip_route 103.199.164.0/22 -add china_ip_route 103.199.196.0/22 -add china_ip_route 103.199.228.0/22 -add china_ip_route 103.199.252.0/22 -add china_ip_route 103.200.52.0/22 -add china_ip_route 103.200.64.0/21 -add china_ip_route 103.200.136.0/21 -add china_ip_route 103.200.144.0/20 -add china_ip_route 103.200.160.0/19 -add china_ip_route 103.200.192.0/22 -add china_ip_route 103.200.220.0/22 -add china_ip_route 103.200.224.0/19 -add china_ip_route 103.201.0.0/20 -add china_ip_route 103.201.16.0/21 -add china_ip_route 103.201.28.0/22 -add china_ip_route 103.201.32.0/19 -add china_ip_route 103.201.64.0/22 -add china_ip_route 103.201.76.0/22 -add china_ip_route 103.201.80.0/20 -add china_ip_route 103.201.96.0/20 -add china_ip_route 103.201.112.0/21 -add china_ip_route 103.201.120.0/22 -add china_ip_route 103.201.152.0/21 -add china_ip_route 103.201.160.0/19 -add china_ip_route 103.201.192.0/18 -add china_ip_route 103.202.0.0/19 -add china_ip_route 103.202.32.0/20 -add china_ip_route 103.202.56.0/21 -add china_ip_route 103.202.64.0/18 -add china_ip_route 103.202.128.0/20 -add china_ip_route 103.202.144.0/22 -add china_ip_route 103.202.152.0/21 -add china_ip_route 103.202.160.0/19 -add china_ip_route 103.202.192.0/20 -add china_ip_route 103.202.212.0/22 -add china_ip_route 103.202.228.0/22 -add china_ip_route 103.202.236.0/22 -add china_ip_route 103.202.240.0/20 -add china_ip_route 103.203.0.0/19 -add china_ip_route 103.203.32.0/22 -add china_ip_route 103.203.96.0/19 -add china_ip_route 103.203.128.0/22 -add china_ip_route 103.203.140.0/22 -add china_ip_route 103.203.164.0/22 -add china_ip_route 103.203.168.0/22 -add china_ip_route 103.203.192.0/22 -add china_ip_route 103.203.200.0/22 -add china_ip_route 103.203.212.0/22 -add china_ip_route 103.203.216.0/22 -add china_ip_route 103.204.24.0/22 -add china_ip_route 103.204.88.0/22 -add china_ip_route 103.204.112.0/22 -add china_ip_route 103.204.136.0/21 -add china_ip_route 103.204.144.0/21 -add china_ip_route 103.204.152.0/22 -add china_ip_route 103.204.196.0/22 -add china_ip_route 103.204.232.0/21 -add china_ip_route 103.205.4.0/22 -add china_ip_route 103.205.40.0/21 -add china_ip_route 103.205.52.0/22 -add china_ip_route 103.205.108.0/22 -add china_ip_route 103.205.116.0/22 -add china_ip_route 103.205.120.0/24 -add china_ip_route 103.205.136.0/22 -add china_ip_route 103.205.162.0/24 -add china_ip_route 103.205.188.0/22 -add china_ip_route 103.205.192.0/21 -add china_ip_route 103.205.200.0/22 -add china_ip_route 103.205.236.0/22 -add china_ip_route 103.205.248.0/21 -add china_ip_route 103.206.0.0/22 -add china_ip_route 103.206.44.0/22 -add china_ip_route 103.206.148.0/22 -add china_ip_route 103.207.104.0/22 -add china_ip_route 103.207.184.0/21 -add china_ip_route 103.207.192.0/20 -add china_ip_route 103.207.208.0/21 -add china_ip_route 103.207.220.0/22 -add china_ip_route 103.207.228.0/22 -add china_ip_route 103.207.232.0/22 -add china_ip_route 103.208.12.0/22 -add china_ip_route 103.208.16.0/22 -add china_ip_route 103.208.28.0/22 -add china_ip_route 103.208.48.0/22 -add china_ip_route 103.208.148.0/22 -add china_ip_route 103.209.112.0/22 -add china_ip_route 103.209.136.0/22 -add china_ip_route 103.209.200.0/22 -add china_ip_route 103.209.208.0/22 -add china_ip_route 103.209.216.0/22 -add china_ip_route 103.210.0.0/22 -add china_ip_route 103.210.96.0/22 -add china_ip_route 103.210.156.0/22 -add china_ip_route 103.210.160.0/19 -add china_ip_route 103.210.217.0/24 -add china_ip_route 103.210.218.0/23 -add china_ip_route 103.211.44.0/22 -add china_ip_route 103.211.96.0/23 -add china_ip_route 103.211.98.0/24 -add china_ip_route 103.211.100.0/22 -add china_ip_route 103.211.156.0/22 -add china_ip_route 103.211.165.0/24 -add china_ip_route 103.211.168.0/22 -add china_ip_route 103.211.220.0/22 -add china_ip_route 103.211.248.0/22 -add china_ip_route 103.212.0.0/20 -add china_ip_route 103.212.44.0/22 -add china_ip_route 103.212.48.0/22 -add china_ip_route 103.212.84.0/22 -add china_ip_route 103.212.100.0/22 -add china_ip_route 103.212.148.0/22 -add china_ip_route 103.212.164.0/22 -add china_ip_route 103.212.196.0/22 -add china_ip_route 103.212.200.0/22 -add china_ip_route 103.212.252.0/22 -add china_ip_route 103.213.40.0/21 -add china_ip_route 103.213.48.0/20 -add china_ip_route 103.213.64.0/19 -add china_ip_route 103.213.96.0/22 -add china_ip_route 103.213.132.0/22 -add china_ip_route 103.213.136.0/21 -add china_ip_route 103.213.144.0/20 -add china_ip_route 103.213.160.0/19 -add china_ip_route 103.213.252.0/22 -add china_ip_route 103.214.48.0/22 -add china_ip_route 103.214.84.0/22 -add china_ip_route 103.214.212.0/22 -add china_ip_route 103.214.240.0/21 -add china_ip_route 103.215.28.0/22 -add china_ip_route 103.215.32.0/21 -add china_ip_route 103.215.44.0/22 -add china_ip_route 103.215.100.0/23 -add china_ip_route 103.215.108.0/22 -add china_ip_route 103.215.116.0/22 -add china_ip_route 103.215.120.0/22 -add china_ip_route 103.215.140.0/22 -add china_ip_route 103.216.4.0/22 -add china_ip_route 103.216.8.0/21 -add china_ip_route 103.216.16.0/20 -add china_ip_route 103.216.32.0/20 -add china_ip_route 103.216.64.0/22 -add china_ip_route 103.216.108.0/22 -add china_ip_route 103.216.136.0/22 -add china_ip_route 103.216.152.0/22 -add china_ip_route 103.216.224.0/21 -add china_ip_route 103.216.240.0/20 -add china_ip_route 103.217.0.0/18 -add china_ip_route 103.217.168.0/22 -add china_ip_route 103.217.180.0/22 -add china_ip_route 103.217.184.0/21 -add china_ip_route 103.217.192.0/20 -add china_ip_route 103.218.8.0/21 -add china_ip_route 103.218.16.0/21 -add china_ip_route 103.218.28.0/22 -add china_ip_route 103.218.32.0/19 -add china_ip_route 103.218.64.0/19 -add china_ip_route 103.218.192.0/20 -add china_ip_route 103.218.208.0/21 -add china_ip_route 103.218.216.0/22 -add china_ip_route 103.219.24.0/21 -add china_ip_route 103.219.32.0/21 -add china_ip_route 103.219.64.0/22 -add china_ip_route 103.219.84.0/22 -add china_ip_route 103.219.88.0/21 -add china_ip_route 103.219.96.0/21 -add china_ip_route 103.219.176.0/22 -add china_ip_route 103.219.184.0/22 -add china_ip_route 103.220.48.0/20 -add china_ip_route 103.220.64.0/22 -add china_ip_route 103.220.92.0/22 -add china_ip_route 103.220.96.0/22 -add china_ip_route 103.220.104.0/21 -add china_ip_route 103.220.116.0/22 -add china_ip_route 103.220.120.0/21 -add china_ip_route 103.220.128.0/20 -add china_ip_route 103.220.144.0/21 -add china_ip_route 103.220.152.0/22 -add china_ip_route 103.220.160.0/19 -add china_ip_route 103.220.192.0/21 -add china_ip_route 103.220.200.0/22 -add china_ip_route 103.220.240.0/21 -add china_ip_route 103.220.252.0/22 -add china_ip_route 103.221.0.0/19 -add china_ip_route 103.221.32.0/22 -add china_ip_route 103.221.40.0/24 -add china_ip_route 103.221.44.0/22 -add china_ip_route 103.221.88.0/22 -add china_ip_route 103.221.92.0/23 -add china_ip_route 103.221.95.0/24 -add china_ip_route 103.221.96.0/19 -add china_ip_route 103.221.128.0/18 -add china_ip_route 103.221.192.0/20 -add china_ip_route 103.222.0.0/20 -add china_ip_route 103.222.16.0/22 -add china_ip_route 103.222.24.0/21 -add china_ip_route 103.222.33.0/24 -add china_ip_route 103.222.34.0/23 -add china_ip_route 103.222.36.0/22 -add china_ip_route 103.222.40.0/21 -add china_ip_route 103.222.48.0/20 -add china_ip_route 103.222.64.0/18 -add china_ip_route 103.222.128.0/18 -add china_ip_route 103.222.192.0/19 -add china_ip_route 103.222.224.0/21 -add china_ip_route 103.222.232.0/22 -add china_ip_route 103.222.240.0/21 -add china_ip_route 103.223.16.0/20 -add china_ip_route 103.223.32.0/19 -add china_ip_route 103.223.64.0/19 -add china_ip_route 103.223.96.0/20 -add china_ip_route 103.223.112.0/21 -add china_ip_route 103.223.124.0/22 -add china_ip_route 103.223.128.0/21 -add china_ip_route 103.223.140.0/22 -add china_ip_route 103.223.144.0/20 -add china_ip_route 103.223.160.0/20 -add china_ip_route 103.223.176.0/21 -add china_ip_route 103.223.188.0/22 -add china_ip_route 103.223.192.0/18 -add china_ip_route 103.224.0.0/22 -add china_ip_route 103.224.40.0/21 -add china_ip_route 103.224.60.0/22 -add china_ip_route 103.224.220.0/22 -add china_ip_route 103.224.224.0/21 -add china_ip_route 103.224.232.0/22 -add china_ip_route 103.225.32.0/22 -add china_ip_route 103.226.40.0/22 -add china_ip_route 103.226.56.0/21 -add china_ip_route 103.226.80.0/22 -add china_ip_route 103.226.116.0/22 -add china_ip_route 103.226.132.0/22 -add china_ip_route 103.226.156.0/22 -add china_ip_route 103.226.180.0/22 -add china_ip_route 103.226.196.0/22 -add china_ip_route 103.227.48.0/22 -add china_ip_route 103.227.72.0/21 -add china_ip_route 103.227.80.0/22 -add china_ip_route 103.227.100.0/22 -add china_ip_route 103.227.120.0/22 -add china_ip_route 103.227.132.0/22 -add china_ip_route 103.227.136.0/22 -add china_ip_route 103.227.196.0/22 -add china_ip_route 103.227.204.0/23 -add china_ip_route 103.227.206.0/24 -add china_ip_route 103.227.212.0/22 -add china_ip_route 103.227.228.0/22 -add china_ip_route 103.228.12.0/22 -add china_ip_route 103.228.88.0/22 -add china_ip_route 103.228.136.0/22 -add china_ip_route 103.228.160.0/22 -add china_ip_route 103.228.176.0/22 -add china_ip_route 103.228.204.0/22 -add china_ip_route 103.228.208.0/22 -add china_ip_route 103.228.228.0/22 -add china_ip_route 103.228.232.0/22 -add china_ip_route 103.229.20.0/22 -add china_ip_route 103.229.136.0/22 -add china_ip_route 103.229.148.0/22 -add china_ip_route 103.229.172.0/22 -add china_ip_route 103.229.212.0/22 -add china_ip_route 103.229.216.0/21 -add china_ip_route 103.229.228.0/22 -add china_ip_route 103.229.236.0/22 -add china_ip_route 103.229.240.0/22 -add china_ip_route 103.230.0.0/22 -add china_ip_route 103.230.28.0/22 -add china_ip_route 103.230.40.0/21 -add china_ip_route 103.230.96.0/22 -add china_ip_route 103.230.196.0/22 -add china_ip_route 103.230.200.0/21 -add china_ip_route 103.230.212.0/22 -add china_ip_route 103.230.236.0/22 -add china_ip_route 103.231.16.0/21 -add china_ip_route 103.231.64.0/21 -add china_ip_route 103.231.144.0/22 -add china_ip_route 103.231.180.0/22 -add china_ip_route 103.231.244.0/22 -add china_ip_route 103.232.4.0/22 -add china_ip_route 103.232.17.168/29 -add china_ip_route 103.232.144.0/22 -add china_ip_route 103.233.4.0/22 -add china_ip_route 103.233.44.0/22 -add china_ip_route 103.233.52.0/22 -add china_ip_route 103.233.104.0/22 -add china_ip_route 103.233.128.0/22 -add china_ip_route 103.233.136.0/22 -add china_ip_route 103.233.228.0/22 -add china_ip_route 103.234.0.0/22 -add china_ip_route 103.234.20.0/22 -add china_ip_route 103.234.56.0/22 -add china_ip_route 103.234.124.0/22 -add china_ip_route 103.234.128.0/22 -add china_ip_route 103.234.172.0/22 -add china_ip_route 103.234.180.0/22 -add china_ip_route 103.235.56.0/21 -add china_ip_route 103.235.80.0/22 -add china_ip_route 103.235.85.0/24 -add china_ip_route 103.235.87.0/24 -add china_ip_route 103.235.128.0/20 -add china_ip_route 103.235.144.0/21 -add china_ip_route 103.235.184.0/22 -add china_ip_route 103.235.192.0/22 -add china_ip_route 103.235.200.0/22 -add china_ip_route 103.235.220.0/22 -add china_ip_route 103.235.224.0/19 -add china_ip_route 103.236.0.0/18 -add china_ip_route 103.236.64.0/19 -add china_ip_route 103.236.96.0/22 -add china_ip_route 103.236.120.0/22 -add china_ip_route 103.236.184.0/22 -add china_ip_route 103.236.240.0/20 -add china_ip_route 103.237.0.0/20 -add china_ip_route 103.237.24.0/21 -add china_ip_route 103.237.68.0/22 -add china_ip_route 103.237.88.0/22 -add china_ip_route 103.237.152.0/22 -add china_ip_route 103.237.176.0/20 -add china_ip_route 103.237.192.0/18 -add china_ip_route 103.238.0.0/21 -add china_ip_route 103.238.18.0/23 -add china_ip_route 103.238.20.0/22 -add china_ip_route 103.238.24.0/21 -add china_ip_route 103.238.32.0/20 -add china_ip_route 103.238.48.0/21 -add china_ip_route 103.238.56.0/22 -add china_ip_route 103.238.88.0/21 -add china_ip_route 103.238.96.0/22 -add china_ip_route 103.238.132.0/22 -add china_ip_route 103.238.140.0/22 -add china_ip_route 103.238.144.0/22 -add china_ip_route 103.238.160.0/22 -add china_ip_route 103.238.165.0/24 -add china_ip_route 103.238.166.0/23 -add china_ip_route 103.238.168.0/21 -add china_ip_route 103.238.176.0/20 -add china_ip_route 103.238.196.0/22 -add china_ip_route 103.238.204.0/22 -add china_ip_route 103.238.252.0/22 -add china_ip_route 103.239.0.0/22 -add china_ip_route 103.239.44.0/22 -add china_ip_route 103.239.68.0/22 -add china_ip_route 103.239.152.0/21 -add china_ip_route 103.239.180.0/22 -add china_ip_route 103.239.184.0/22 -add china_ip_route 103.239.192.0/21 -add china_ip_route 103.239.204.0/22 -add china_ip_route 103.239.208.0/22 -add china_ip_route 103.239.224.0/22 -add china_ip_route 103.239.244.0/22 -add china_ip_route 103.240.16.0/22 -add china_ip_route 103.240.36.0/22 -add china_ip_route 103.240.72.0/22 -add china_ip_route 103.240.84.0/22 -add china_ip_route 103.240.124.0/22 -add china_ip_route 103.240.172.0/22 -add china_ip_route 103.240.188.0/22 -add china_ip_route 103.240.244.0/22 -add china_ip_route 103.241.12.0/22 -add china_ip_route 103.241.92.0/22 -add china_ip_route 103.241.96.0/22 -add china_ip_route 103.241.160.0/22 -add china_ip_route 103.241.184.0/21 -add china_ip_route 103.241.220.0/22 -add china_ip_route 103.242.64.0/23 -add china_ip_route 103.242.128.0/23 -add china_ip_route 103.242.160.0/22 -add china_ip_route 103.242.168.0/21 -add china_ip_route 103.242.176.0/22 -add china_ip_route 103.242.200.0/22 -add china_ip_route 103.242.212.0/22 -add china_ip_route 103.242.220.0/22 -add china_ip_route 103.242.240.0/22 -add china_ip_route 103.243.136.0/22 -add china_ip_route 103.243.252.0/22 -add china_ip_route 103.244.16.0/22 -add china_ip_route 103.244.58.0/23 -add china_ip_route 103.244.60.0/22 -add china_ip_route 103.244.64.0/20 -add china_ip_route 103.244.80.0/21 -add china_ip_route 103.244.116.0/22 -add china_ip_route 103.244.164.0/22 -add china_ip_route 103.244.232.0/22 -add china_ip_route 103.244.252.0/22 -add china_ip_route 103.245.23.0/24 -add china_ip_route 103.245.52.0/22 -add china_ip_route 103.245.60.0/22 -add china_ip_route 103.245.80.0/22 -add china_ip_route 103.245.124.0/22 -add china_ip_route 103.245.128.0/22 -add china_ip_route 103.246.8.0/21 -add china_ip_route 103.246.120.0/21 -add china_ip_route 103.246.132.0/22 -add china_ip_route 103.246.152.0/22 -add china_ip_route 103.247.168.0/21 -add china_ip_route 103.247.176.0/22 -add china_ip_route 103.247.200.0/22 -add china_ip_route 103.247.212.0/22 -add china_ip_route 103.248.64.0/23 -add china_ip_route 103.248.100.0/22 -add china_ip_route 103.248.124.0/22 -add china_ip_route 103.248.152.0/22 -add china_ip_route 103.248.168.0/22 -add china_ip_route 103.248.192.0/22 -add china_ip_route 103.248.212.0/22 -add china_ip_route 103.248.224.0/21 -add china_ip_route 103.249.8.0/21 -add china_ip_route 103.249.52.0/22 -add china_ip_route 103.249.128.0/22 -add china_ip_route 103.249.136.0/22 -add china_ip_route 103.249.144.0/22 -add china_ip_route 103.249.164.0/22 -add china_ip_route 103.249.168.0/21 -add china_ip_route 103.249.176.0/22 -add china_ip_route 103.249.188.0/22 -add china_ip_route 103.249.192.0/22 -add china_ip_route 103.249.244.0/22 -add china_ip_route 103.249.252.0/22 -add china_ip_route 103.250.32.0/22 -add china_ip_route 103.250.104.0/22 -add china_ip_route 103.250.124.0/22 -add china_ip_route 103.250.180.0/22 -add china_ip_route 103.250.192.0/22 -add china_ip_route 103.250.216.0/22 -add china_ip_route 103.250.224.0/22 -add china_ip_route 103.250.236.0/22 -add china_ip_route 103.250.248.0/21 -add china_ip_route 103.251.32.0/22 -add china_ip_route 103.251.84.0/22 -add china_ip_route 103.251.96.0/22 -add china_ip_route 103.251.124.0/22 -add china_ip_route 103.251.160.0/22 -add china_ip_route 103.251.192.0/22 -add china_ip_route 103.251.204.0/22 -add china_ip_route 103.251.240.0/22 -add china_ip_route 103.252.28.0/22 -add china_ip_route 103.252.36.0/22 -add china_ip_route 103.252.64.0/22 -add china_ip_route 103.252.96.0/22 -add china_ip_route 103.252.104.0/22 -add china_ip_route 103.252.172.0/22 -add china_ip_route 103.252.204.0/22 -add china_ip_route 103.252.208.0/22 -add china_ip_route 103.252.232.0/22 -add china_ip_route 103.252.248.0/22 -add china_ip_route 103.253.4.0/22 -add china_ip_route 103.253.60.0/22 -add china_ip_route 103.253.204.0/22 -add china_ip_route 103.253.220.0/22 -add china_ip_route 103.253.224.0/22 -add china_ip_route 103.253.232.0/22 -add china_ip_route 103.254.8.0/22 -add china_ip_route 103.254.20.0/22 -add china_ip_route 103.254.64.0/21 -add china_ip_route 103.254.76.0/22 -add china_ip_route 103.254.112.0/22 -add china_ip_route 103.254.176.0/22 -add china_ip_route 103.254.188.0/22 -add china_ip_route 103.255.68.0/22 -add china_ip_route 103.255.88.0/21 -add china_ip_route 103.255.136.0/21 -add china_ip_route 103.255.184.0/22 -add china_ip_route 103.255.200.0/22 -add china_ip_route 103.255.208.0/22 -add china_ip_route 103.255.228.0/22 -add china_ip_route 106.0.0.0/24 -add china_ip_route 106.0.2.0/23 -add china_ip_route 106.0.4.0/22 -add china_ip_route 106.0.8.0/21 -add china_ip_route 106.0.16.0/20 -add china_ip_route 106.0.44.0/22 -add china_ip_route 106.0.64.0/18 -add china_ip_route 106.2.0.0/23 -add china_ip_route 106.2.3.0/24 -add china_ip_route 106.2.4.0/22 -add china_ip_route 106.2.8.0/21 -add china_ip_route 106.2.16.0/20 -add china_ip_route 106.2.32.0/19 -add china_ip_route 106.2.64.0/18 -add china_ip_route 106.2.128.0/20 -add china_ip_route 106.2.144.0/21 -add china_ip_route 106.2.152.0/22 -add china_ip_route 106.2.156.0/23 -add china_ip_route 106.2.160.0/19 -add china_ip_route 106.2.192.0/18 -add china_ip_route 106.3.16.0/20 -add china_ip_route 106.3.32.0/19 -add china_ip_route 106.3.64.0/20 -add china_ip_route 106.3.80.0/22 -add china_ip_route 106.3.88.0/21 -add china_ip_route 106.3.96.0/19 -add china_ip_route 106.3.128.0/19 -add china_ip_route 106.3.164.0/22 -add china_ip_route 106.3.168.0/21 -add china_ip_route 106.3.176.0/20 -add china_ip_route 106.3.192.0/18 -add china_ip_route 106.4.0.0/14 -add china_ip_route 106.8.0.0/15 -add china_ip_route 106.11.0.0/16 -add china_ip_route 106.12.0.0/14 -add china_ip_route 106.16.0.0/12 -add china_ip_route 106.32.0.0/12 -add china_ip_route 106.48.0.0/21 -add china_ip_route 106.48.8.0/22 -add china_ip_route 106.48.16.0/20 -add china_ip_route 106.48.32.0/20 -add china_ip_route 106.48.57.0/24 -add china_ip_route 106.48.60.0/24 -add china_ip_route 106.48.63.0/24 -add china_ip_route 106.48.64.0/18 -add china_ip_route 106.48.128.0/17 -add china_ip_route 106.49.1.0/24 -add china_ip_route 106.49.2.0/23 -add china_ip_route 106.49.4.0/22 -add china_ip_route 106.49.8.0/21 -add china_ip_route 106.49.16.0/20 -add china_ip_route 106.49.32.0/19 -add china_ip_route 106.49.64.0/19 -add china_ip_route 106.49.96.0/24 -add china_ip_route 106.49.98.0/23 -add china_ip_route 106.49.100.0/22 -add china_ip_route 106.49.104.0/21 -add china_ip_route 106.49.112.0/20 -add china_ip_route 106.49.128.0/17 -add china_ip_route 106.50.0.0/16 -add china_ip_route 106.52.0.0/14 -add china_ip_route 106.56.0.0/13 -add china_ip_route 106.74.0.0/16 -add china_ip_route 106.75.0.0/17 -add china_ip_route 106.75.128.0/18 -add china_ip_route 106.75.201.0/24 -add china_ip_route 106.75.204.0/22 -add china_ip_route 106.75.208.0/20 -add china_ip_route 106.75.224.0/19 -add china_ip_route 106.80.0.0/12 -add china_ip_route 106.108.0.0/14 -add china_ip_route 106.112.0.0/12 -add china_ip_route 106.224.0.0/12 -add china_ip_route 109.71.4.0/24 -add china_ip_route 109.244.0.0/16 -add china_ip_route 110.6.0.0/15 -add china_ip_route 110.16.0.0/14 -add china_ip_route 110.34.40.0/21 -add china_ip_route 110.40.0.0/15 -add china_ip_route 110.42.0.0/16 -add china_ip_route 110.43.0.0/18 -add china_ip_route 110.43.64.0/21 -add china_ip_route 110.43.72.0/22 -add china_ip_route 110.43.76.0/23 -add china_ip_route 110.43.80.0/20 -add china_ip_route 110.43.96.0/19 -add china_ip_route 110.43.128.0/17 -add china_ip_route 110.44.12.0/22 -add china_ip_route 110.44.144.0/20 -add china_ip_route 110.48.0.0/16 -add china_ip_route 110.51.0.0/16 -add china_ip_route 110.52.0.0/15 -add china_ip_route 110.56.0.0/13 -add china_ip_route 110.64.0.0/15 -add china_ip_route 110.72.0.0/15 -add china_ip_route 110.75.0.0/16 -add china_ip_route 110.76.0.0/20 -add china_ip_route 110.76.16.0/22 -add china_ip_route 110.76.20.0/24 -add china_ip_route 110.76.22.0/24 -add china_ip_route 110.76.24.0/21 -add china_ip_route 110.76.32.0/19 -add china_ip_route 110.76.132.0/22 -add china_ip_route 110.76.156.0/22 -add china_ip_route 110.76.184.0/22 -add china_ip_route 110.76.192.0/18 -add china_ip_route 110.77.0.0/17 -add china_ip_route 110.80.0.0/13 -add china_ip_route 110.88.0.0/14 -add china_ip_route 110.92.68.0/22 -add china_ip_route 110.93.32.0/19 -add china_ip_route 110.94.0.0/15 -add china_ip_route 110.96.0.0/11 -add china_ip_route 110.152.0.0/14 -add china_ip_route 110.156.0.0/15 -add china_ip_route 110.166.0.0/15 -add china_ip_route 110.172.192.0/18 -add china_ip_route 110.173.0.0/19 -add china_ip_route 110.173.32.0/20 -add china_ip_route 110.173.64.0/19 -add china_ip_route 110.173.192.0/19 -add china_ip_route 110.176.0.0/12 -add china_ip_route 110.192.0.0/11 -add china_ip_route 110.228.0.0/14 -add china_ip_route 110.232.32.0/19 -add china_ip_route 110.236.0.0/15 -add china_ip_route 110.240.0.0/12 -add china_ip_route 111.0.0.0/10 -add china_ip_route 111.66.0.0/16 -add china_ip_route 111.67.192.0/20 -add china_ip_route 111.68.64.0/19 -add china_ip_route 111.72.0.0/13 -add china_ip_route 111.85.0.0/16 -add china_ip_route 111.91.192.0/19 -add china_ip_route 111.92.248.0/21 -add china_ip_route 111.112.0.0/14 -add china_ip_route 111.116.0.0/15 -add china_ip_route 111.118.200.0/21 -add china_ip_route 111.119.64.0/18 -add china_ip_route 111.119.128.0/19 -add china_ip_route 111.120.0.0/14 -add china_ip_route 111.124.0.0/16 -add china_ip_route 111.126.0.0/15 -add china_ip_route 111.128.0.0/11 -add china_ip_route 111.160.0.0/13 -add china_ip_route 111.170.0.0/16 -add china_ip_route 111.172.0.0/14 -add china_ip_route 111.176.0.0/13 -add china_ip_route 111.186.0.0/15 -add china_ip_route 111.192.0.0/12 -add china_ip_route 111.208.0.0/13 -add china_ip_route 111.221.28.0/24 -add china_ip_route 111.221.128.0/17 -add china_ip_route 111.222.0.0/16 -add china_ip_route 111.223.4.0/22 -add china_ip_route 111.223.8.0/21 -add china_ip_route 111.223.16.0/22 -add china_ip_route 111.223.240.0/22 -add china_ip_route 111.223.249.0/24 -add china_ip_route 111.223.250.0/23 -add china_ip_route 111.224.0.0/13 -add china_ip_route 111.235.96.0/19 -add china_ip_route 111.235.156.0/22 -add china_ip_route 111.235.160.0/21 -add china_ip_route 111.235.170.0/23 -add china_ip_route 111.235.172.0/22 -add china_ip_route 111.235.176.0/20 -add china_ip_route 112.0.0.0/10 -add china_ip_route 112.64.0.0/14 -add china_ip_route 112.73.64.0/18 -add china_ip_route 112.74.0.0/16 -add china_ip_route 112.80.0.0/12 -add china_ip_route 112.96.0.0/13 -add china_ip_route 112.109.128.0/17 -add china_ip_route 112.111.0.0/16 -add china_ip_route 112.112.0.0/14 -add china_ip_route 112.116.0.0/15 -add china_ip_route 112.122.0.0/15 -add china_ip_route 112.124.0.0/14 -add china_ip_route 112.128.0.0/14 -add china_ip_route 112.132.0.0/16 -add china_ip_route 112.137.48.0/21 -add china_ip_route 112.192.0.0/14 -add china_ip_route 112.224.0.0/11 -add china_ip_route 113.0.0.0/13 -add china_ip_route 113.8.0.0/15 -add china_ip_route 113.11.192.0/19 -add china_ip_route 113.12.0.0/14 -add china_ip_route 113.16.0.0/15 -add china_ip_route 113.18.0.0/16 -add china_ip_route 113.21.232.0/21 -add china_ip_route 113.24.0.0/14 -add china_ip_route 113.31.0.0/16 -add china_ip_route 113.44.0.0/14 -add china_ip_route 113.48.0.0/14 -add china_ip_route 113.52.160.0/19 -add china_ip_route 113.52.228.0/22 -add china_ip_route 113.54.0.0/15 -add china_ip_route 113.56.0.0/15 -add china_ip_route 113.58.0.0/16 -add china_ip_route 113.59.0.0/17 -add china_ip_route 113.59.224.0/22 -add china_ip_route 113.62.0.0/15 -add china_ip_route 113.64.0.0/10 -add china_ip_route 113.128.0.0/15 -add china_ip_route 113.130.96.0/20 -add china_ip_route 113.130.112.0/21 -add china_ip_route 113.132.0.0/14 -add china_ip_route 113.136.0.0/13 -add china_ip_route 113.194.0.0/15 -add china_ip_route 113.197.100.0/23 -add china_ip_route 113.197.102.0/24 -add china_ip_route 113.197.104.0/22 -add china_ip_route 113.200.0.0/15 -add china_ip_route 113.202.0.0/16 -add china_ip_route 113.204.0.0/14 -add china_ip_route 113.208.96.0/19 -add china_ip_route 113.208.128.0/17 -add china_ip_route 113.209.0.0/16 -add china_ip_route 113.212.0.0/18 -add china_ip_route 113.212.100.0/22 -add china_ip_route 113.212.184.0/21 -add china_ip_route 113.213.0.0/17 -add china_ip_route 113.214.0.0/15 -add china_ip_route 113.218.0.0/15 -add china_ip_route 113.220.0.0/14 -add china_ip_route 113.224.0.0/12 -add china_ip_route 113.240.0.0/13 -add china_ip_route 113.248.0.0/14 -add china_ip_route 114.28.0.0/17 -add china_ip_route 114.28.128.0/18 -add china_ip_route 114.28.192.0/19 -add china_ip_route 114.28.232.0/22 -add china_ip_route 114.28.240.0/20 -add china_ip_route 114.31.64.0/21 -add china_ip_route 114.54.0.0/15 -add china_ip_route 114.60.0.0/14 -add china_ip_route 114.64.0.0/14 -add china_ip_route 114.68.0.0/16 -add china_ip_route 114.79.64.0/18 -add china_ip_route 114.80.0.0/12 -add china_ip_route 114.96.0.0/13 -add china_ip_route 114.104.0.0/14 -add china_ip_route 114.110.0.0/20 -add china_ip_route 114.110.64.0/18 -add china_ip_route 114.111.0.0/19 -add china_ip_route 114.111.160.0/19 -add china_ip_route 114.112.4.0/22 -add china_ip_route 114.112.8.0/22 -add china_ip_route 114.112.24.0/21 -add china_ip_route 114.112.32.0/19 -add china_ip_route 114.112.64.0/19 -add china_ip_route 114.112.96.0/20 -add china_ip_route 114.112.116.0/22 -add china_ip_route 114.112.120.0/21 -add china_ip_route 114.112.136.0/21 -add china_ip_route 114.112.144.0/20 -add china_ip_route 114.112.160.0/19 -add china_ip_route 114.112.192.0/19 -add china_ip_route 114.113.0.0/17 -add china_ip_route 114.113.128.0/21 -add china_ip_route 114.113.140.0/22 -add china_ip_route 114.113.144.0/20 -add china_ip_route 114.113.160.0/19 -add china_ip_route 114.113.196.0/22 -add china_ip_route 114.113.200.0/21 -add china_ip_route 114.113.208.0/20 -add china_ip_route 114.113.224.0/20 -add china_ip_route 114.114.0.0/15 -add china_ip_route 114.116.0.0/15 -add china_ip_route 114.118.0.0/16 -add china_ip_route 114.119.0.0/17 -add china_ip_route 114.119.192.0/18 -add china_ip_route 114.132.0.0/16 -add china_ip_route 114.135.0.0/16 -add china_ip_route 114.138.0.0/15 -add china_ip_route 114.141.64.0/21 -add china_ip_route 114.141.80.0/21 -add china_ip_route 114.141.128.0/18 -add china_ip_route 114.196.0.0/15 -add china_ip_route 114.198.248.0/21 -add china_ip_route 114.208.0.0/12 -add china_ip_route 114.224.0.0/11 -add china_ip_route 115.24.0.0/14 -add china_ip_route 115.28.0.0/15 -add china_ip_route 115.31.64.0/20 -add china_ip_route 115.32.0.0/14 -add china_ip_route 115.42.56.0/22 -add china_ip_route 115.44.0.0/14 -add china_ip_route 115.48.0.0/12 -add china_ip_route 115.69.64.0/20 -add china_ip_route 115.84.0.0/18 -add china_ip_route 115.84.192.0/19 -add china_ip_route 115.85.192.0/18 -add china_ip_route 115.100.0.0/14 -add china_ip_route 115.104.0.0/14 -add china_ip_route 115.120.0.0/14 -add china_ip_route 115.124.16.0/20 -add china_ip_route 115.148.0.0/14 -add china_ip_route 115.152.0.0/13 -add china_ip_route 115.166.64.0/19 -add china_ip_route 115.168.0.0/16 -add china_ip_route 115.169.0.0/23 -add china_ip_route 115.169.3.0/24 -add china_ip_route 115.169.6.0/24 -add china_ip_route 115.169.9.0/24 -add china_ip_route 115.169.14.0/23 -add china_ip_route 115.169.16.0/20 -add china_ip_route 115.169.39.0/24 -add china_ip_route 115.169.42.0/23 -add china_ip_route 115.169.44.0/22 -add china_ip_route 115.169.48.0/20 -add china_ip_route 115.169.64.0/18 -add china_ip_route 115.169.128.0/17 -add china_ip_route 115.170.0.0/15 -add china_ip_route 115.172.0.0/14 -add china_ip_route 115.180.0.0/14 -add china_ip_route 115.187.0.0/20 -add china_ip_route 115.190.0.0/15 -add china_ip_route 115.192.0.0/11 -add china_ip_route 115.224.0.0/12 -add china_ip_route 116.0.8.0/21 -add china_ip_route 116.0.24.0/21 -add china_ip_route 116.1.0.0/16 -add china_ip_route 116.2.0.0/15 -add china_ip_route 116.4.0.0/14 -add china_ip_route 116.8.0.0/14 -add china_ip_route 116.13.0.0/16 -add china_ip_route 116.16.0.0/12 -add china_ip_route 116.50.0.0/20 -add china_ip_route 116.52.0.0/14 -add china_ip_route 116.56.0.0/15 -add china_ip_route 116.58.128.0/20 -add china_ip_route 116.58.208.0/20 -add china_ip_route 116.60.0.0/14 -add china_ip_route 116.66.0.0/18 -add china_ip_route 116.66.64.0/19 -add china_ip_route 116.66.96.0/20 -add china_ip_route 116.66.120.0/22 -add china_ip_route 116.68.136.0/21 -add china_ip_route 116.68.176.0/21 -add china_ip_route 116.69.0.0/16 -add china_ip_route 116.70.0.0/17 -add china_ip_route 116.76.0.0/14 -add china_ip_route 116.85.0.0/17 -add china_ip_route 116.85.128.0/18 -add china_ip_route 116.85.192.0/19 -add china_ip_route 116.85.224.0/20 -add china_ip_route 116.85.240.0/21 -add china_ip_route 116.85.248.0/23 -add china_ip_route 116.85.250.0/24 -add china_ip_route 116.85.252.0/22 -add china_ip_route 116.89.144.0/20 -add china_ip_route 116.90.80.0/20 -add china_ip_route 116.90.184.0/21 -add china_ip_route 116.95.0.0/16 -add china_ip_route 116.112.0.0/14 -add china_ip_route 116.116.0.0/15 -add china_ip_route 116.128.0.0/10 -add china_ip_route 116.192.0.0/16 -add china_ip_route 116.193.16.0/20 -add china_ip_route 116.193.32.0/19 -add china_ip_route 116.193.176.0/21 -add china_ip_route 116.194.0.0/15 -add china_ip_route 116.196.0.0/21 -add china_ip_route 116.196.8.0/22 -add china_ip_route 116.196.12.0/23 -add china_ip_route 116.196.16.0/20 -add china_ip_route 116.196.32.0/19 -add china_ip_route 116.196.64.0/18 -add china_ip_route 116.196.128.0/18 -add china_ip_route 116.196.192.0/21 -add china_ip_route 116.196.200.0/23 -add china_ip_route 116.196.203.0/24 -add china_ip_route 116.196.204.0/22 -add china_ip_route 116.196.208.0/20 -add china_ip_route 116.196.224.0/19 -add china_ip_route 116.197.160.0/21 -add china_ip_route 116.197.180.0/23 -add china_ip_route 116.198.0.0/16 -add china_ip_route 116.199.0.0/17 -add china_ip_route 116.199.128.0/19 -add china_ip_route 116.204.0.0/17 -add china_ip_route 116.204.232.0/22 -add china_ip_route 116.205.0.0/16 -add china_ip_route 116.207.0.0/16 -add china_ip_route 116.208.0.0/14 -add china_ip_route 116.212.160.0/20 -add china_ip_route 116.213.64.0/18 -add china_ip_route 116.213.128.0/17 -add china_ip_route 116.214.32.0/19 -add china_ip_route 116.214.64.0/20 -add china_ip_route 116.214.128.0/17 -add china_ip_route 116.215.0.0/16 -add china_ip_route 116.216.0.0/14 -add china_ip_route 116.224.0.0/12 -add china_ip_route 116.242.0.0/15 -add china_ip_route 116.244.0.0/14 -add china_ip_route 116.248.0.0/15 -add china_ip_route 116.252.0.0/15 -add china_ip_route 116.254.104.0/21 -add china_ip_route 116.254.129.0/24 -add china_ip_route 116.254.130.0/23 -add china_ip_route 116.254.132.0/22 -add china_ip_route 116.254.136.0/21 -add china_ip_route 116.254.144.0/20 -add china_ip_route 116.254.160.0/19 -add china_ip_route 116.254.192.0/18 -add china_ip_route 116.255.128.0/17 -add china_ip_route 117.8.0.0/13 -add china_ip_route 117.21.0.0/16 -add china_ip_route 117.22.0.0/15 -add china_ip_route 117.24.0.0/13 -add china_ip_route 117.32.0.0/13 -add china_ip_route 117.40.0.0/14 -add china_ip_route 117.44.0.0/15 -add china_ip_route 117.48.0.0/15 -add china_ip_route 117.50.0.0/16 -add china_ip_route 117.51.128.0/23 -add china_ip_route 117.51.131.0/24 -add china_ip_route 117.51.132.0/22 -add china_ip_route 117.51.136.0/21 -add china_ip_route 117.51.144.0/20 -add china_ip_route 117.51.160.0/19 -add china_ip_route 117.51.192.0/18 -add china_ip_route 117.53.48.0/20 -add china_ip_route 117.53.176.0/20 -add china_ip_route 117.57.0.0/16 -add china_ip_route 117.58.0.0/18 -add china_ip_route 117.59.0.0/16 -add china_ip_route 117.60.0.0/14 -add china_ip_route 117.64.0.0/13 -add china_ip_route 117.72.0.0/15 -add china_ip_route 117.74.64.0/19 -add china_ip_route 117.74.128.0/17 -add china_ip_route 117.75.0.0/16 -add china_ip_route 117.76.0.0/14 -add china_ip_route 117.80.0.0/12 -add china_ip_route 117.100.0.0/15 -add china_ip_route 117.103.16.0/20 -add china_ip_route 117.103.40.0/21 -add china_ip_route 117.103.72.0/21 -add china_ip_route 117.103.128.0/20 -add china_ip_route 117.104.168.0/21 -add china_ip_route 117.106.0.0/15 -add china_ip_route 117.112.0.0/13 -add china_ip_route 117.120.64.0/18 -add china_ip_route 117.120.128.0/17 -add china_ip_route 117.121.0.0/19 -add china_ip_route 117.121.32.0/21 -add china_ip_route 117.121.40.0/22 -add china_ip_route 117.121.44.0/23 -add china_ip_route 117.121.46.0/24 -add china_ip_route 117.121.48.0/20 -add china_ip_route 117.121.64.0/18 -add china_ip_route 117.121.128.0/20 -add china_ip_route 117.121.148.0/22 -add china_ip_route 117.121.152.0/21 -add china_ip_route 117.121.160.0/19 -add china_ip_route 117.121.192.0/21 -add china_ip_route 117.122.128.0/17 -add china_ip_route 117.124.0.0/14 -add china_ip_route 117.128.0.0/10 -add china_ip_route 118.24.0.0/15 -add china_ip_route 118.26.0.0/19 -add china_ip_route 118.26.40.0/21 -add china_ip_route 118.26.48.0/20 -add china_ip_route 118.26.64.0/19 -add china_ip_route 118.26.112.0/21 -add china_ip_route 118.26.121.0/24 -add china_ip_route 118.26.122.0/23 -add china_ip_route 118.26.124.0/23 -add china_ip_route 118.26.128.0/17 -add china_ip_route 118.28.0.0/15 -add china_ip_route 118.30.0.0/20 -add china_ip_route 118.30.16.0/21 -add china_ip_route 118.30.24.0/22 -add china_ip_route 118.30.32.0/19 -add china_ip_route 118.30.64.0/18 -add china_ip_route 118.30.128.0/17 -add china_ip_route 118.31.0.0/16 -add china_ip_route 118.64.0.0/15 -add china_ip_route 118.66.0.0/16 -add china_ip_route 118.67.112.0/20 -add china_ip_route 118.72.0.0/13 -add china_ip_route 118.80.0.0/15 -add china_ip_route 118.84.0.0/15 -add china_ip_route 118.88.32.0/19 -add china_ip_route 118.88.64.0/18 -add china_ip_route 118.88.128.0/17 -add china_ip_route 118.89.0.0/16 -add china_ip_route 118.102.16.0/20 -add china_ip_route 118.102.32.0/21 -add china_ip_route 118.103.164.0/22 -add china_ip_route 118.103.168.0/21 -add china_ip_route 118.103.176.0/22 -add china_ip_route 118.103.245.0/24 -add china_ip_route 118.103.246.0/23 -add china_ip_route 118.112.0.0/13 -add china_ip_route 118.120.0.0/14 -add china_ip_route 118.124.0.0/15 -add china_ip_route 118.126.1.0/24 -add china_ip_route 118.126.2.0/23 -add china_ip_route 118.126.4.0/22 -add china_ip_route 118.126.8.0/21 -add china_ip_route 118.126.16.0/23 -add china_ip_route 118.126.18.0/24 -add china_ip_route 118.126.32.0/19 -add china_ip_route 118.126.64.0/18 -add china_ip_route 118.126.128.0/17 -add china_ip_route 118.127.128.0/19 -add china_ip_route 118.132.0.0/14 -add china_ip_route 118.144.0.0/14 -add china_ip_route 118.178.0.0/16 -add china_ip_route 118.180.0.0/14 -add china_ip_route 118.184.5.0/24 -add china_ip_route 118.184.109.0/24 -add china_ip_route 118.184.110.0/23 -add china_ip_route 118.184.116.0/22 -add china_ip_route 118.184.120.0/23 -add china_ip_route 118.184.122.0/24 -add china_ip_route 118.184.128.0/18 -add china_ip_route 118.184.192.0/19 -add china_ip_route 118.184.240.0/20 -add china_ip_route 118.186.0.0/15 -add china_ip_route 118.188.0.0/16 -add china_ip_route 118.190.0.0/16 -add china_ip_route 118.191.0.0/20 -add china_ip_route 118.191.32.0/19 -add china_ip_route 118.191.64.0/18 -add china_ip_route 118.191.144.0/21 -add china_ip_route 118.191.153.0/24 -add china_ip_route 118.191.154.0/23 -add china_ip_route 118.191.156.0/22 -add china_ip_route 118.191.160.0/19 -add china_ip_route 118.191.192.0/20 -add china_ip_route 118.191.209.0/24 -add china_ip_route 118.191.210.0/23 -add china_ip_route 118.191.212.0/22 -add china_ip_route 118.191.248.0/21 -add china_ip_route 118.192.0.0/16 -add china_ip_route 118.193.0.0/22 -add china_ip_route 118.193.96.0/19 -add china_ip_route 118.194.0.0/17 -add china_ip_route 118.194.128.0/18 -add china_ip_route 118.194.192.0/19 -add china_ip_route 118.194.232.0/21 -add china_ip_route 118.194.240.0/20 -add china_ip_route 118.195.0.0/16 -add china_ip_route 118.196.0.0/14 -add china_ip_route 118.202.0.0/15 -add china_ip_route 118.204.0.0/14 -add china_ip_route 118.212.0.0/15 -add china_ip_route 118.215.192.0/18 -add china_ip_route 118.224.0.0/14 -add china_ip_route 118.228.0.0/17 -add china_ip_route 118.228.128.0/20 -add china_ip_route 118.228.144.0/21 -add china_ip_route 118.228.156.0/22 -add china_ip_route 118.228.160.0/19 -add china_ip_route 118.228.192.0/18 -add china_ip_route 118.229.0.0/16 -add china_ip_route 118.230.0.0/16 -add china_ip_route 118.239.0.0/16 -add china_ip_route 118.242.0.0/16 -add china_ip_route 118.244.0.0/14 -add china_ip_route 118.248.0.0/13 -add china_ip_route 119.0.0.0/15 -add china_ip_route 119.2.0.0/19 -add china_ip_route 119.2.128.0/17 -add china_ip_route 119.3.0.0/16 -add china_ip_route 119.4.0.0/14 -add china_ip_route 119.10.0.0/17 -add china_ip_route 119.15.136.0/21 -add china_ip_route 119.16.0.0/16 -add china_ip_route 119.18.192.0/20 -add china_ip_route 119.18.208.0/21 -add china_ip_route 119.18.224.0/19 -add china_ip_route 119.19.0.0/16 -add china_ip_route 119.20.0.0/14 -add china_ip_route 119.27.64.0/18 -add china_ip_route 119.27.128.0/17 -add china_ip_route 119.28.28.0/24 -add china_ip_route 119.29.0.0/16 -add china_ip_route 119.30.48.0/20 -add china_ip_route 119.31.192.0/19 -add china_ip_route 119.32.0.0/14 -add china_ip_route 119.36.0.0/15 -add china_ip_route 119.38.0.0/17 -add china_ip_route 119.38.128.0/18 -add china_ip_route 119.38.192.0/20 -add china_ip_route 119.38.208.0/22 -add china_ip_route 119.38.212.0/23 -add china_ip_route 119.38.214.0/27 -add china_ip_route 119.38.214.56/29 -add china_ip_route 119.38.214.64/26 -add china_ip_route 119.38.214.128/25 -add china_ip_route 119.38.215.0/24 -add china_ip_route 119.38.216.0/21 -add china_ip_route 119.39.0.0/16 -add china_ip_route 119.40.0.0/18 -add china_ip_route 119.40.64.0/20 -add china_ip_route 119.40.128.0/17 -add china_ip_route 119.41.0.0/16 -add china_ip_route 119.42.0.0/19 -add china_ip_route 119.42.52.0/22 -add china_ip_route 119.42.128.0/20 -add china_ip_route 119.42.224.0/19 -add china_ip_route 119.44.0.0/15 -add china_ip_route 119.48.0.0/13 -add china_ip_route 119.57.0.0/16 -add china_ip_route 119.58.0.0/16 -add china_ip_route 119.59.128.0/17 -add china_ip_route 119.60.0.0/15 -add china_ip_route 119.62.0.0/16 -add china_ip_route 119.63.32.0/19 -add china_ip_route 119.75.208.0/20 -add china_ip_route 119.78.0.0/15 -add china_ip_route 119.80.0.0/16 -add china_ip_route 119.82.208.0/20 -add china_ip_route 119.84.0.0/14 -add china_ip_route 119.88.0.0/16 -add china_ip_route 119.89.0.0/17 -add china_ip_route 119.89.128.0/21 -add china_ip_route 119.89.136.0/23 -add china_ip_route 119.89.139.0/24 -add china_ip_route 119.89.140.0/22 -add china_ip_route 119.89.144.0/20 -add china_ip_route 119.89.160.0/20 -add china_ip_route 119.89.176.0/22 -add china_ip_route 119.89.180.0/23 -add china_ip_route 119.89.183.0/24 -add china_ip_route 119.89.184.0/21 -add china_ip_route 119.89.192.0/23 -add china_ip_route 119.89.194.0/24 -add china_ip_route 119.89.196.0/22 -add china_ip_route 119.89.200.0/21 -add china_ip_route 119.89.208.0/21 -add china_ip_route 119.89.217.0/24 -add china_ip_route 119.89.218.0/23 -add china_ip_route 119.89.220.0/22 -add china_ip_route 119.89.224.0/19 -add china_ip_route 119.90.0.0/15 -add china_ip_route 119.96.0.0/13 -add china_ip_route 119.108.0.0/15 -add china_ip_route 119.112.0.0/12 -add china_ip_route 119.128.0.0/12 -add china_ip_route 119.144.0.0/14 -add china_ip_route 119.148.160.0/19 -add china_ip_route 119.151.192.0/18 -add china_ip_route 119.160.200.0/21 -add china_ip_route 119.161.120.0/21 -add china_ip_route 119.161.128.0/21 -add china_ip_route 119.161.160.0/19 -add china_ip_route 119.161.192.0/18 -add china_ip_route 119.162.0.0/15 -add china_ip_route 119.164.0.0/14 -add china_ip_route 119.176.0.0/12 -add china_ip_route 119.232.0.0/15 -add china_ip_route 119.235.128.0/19 -add china_ip_route 119.235.160.0/20 -add china_ip_route 119.235.184.0/22 -add china_ip_route 119.248.0.0/14 -add china_ip_route 119.252.96.0/21 -add china_ip_route 119.252.240.0/21 -add china_ip_route 119.252.249.0/24 -add china_ip_route 119.252.252.0/23 -add china_ip_route 119.253.0.0/16 -add china_ip_route 119.254.0.0/15 -add china_ip_route 120.0.0.0/12 -add china_ip_route 120.24.0.0/14 -add china_ip_route 120.30.0.0/15 -add china_ip_route 120.32.0.0/13 -add china_ip_route 120.40.0.0/14 -add china_ip_route 120.44.0.0/15 -add china_ip_route 120.46.0.0/16 -add china_ip_route 120.48.0.0/15 -add china_ip_route 120.52.0.0/14 -add china_ip_route 120.64.0.0/13 -add china_ip_route 120.72.32.0/19 -add china_ip_route 120.72.128.0/17 -add china_ip_route 120.76.0.0/14 -add china_ip_route 120.80.0.0/13 -add china_ip_route 120.88.8.0/21 -add china_ip_route 120.90.0.0/15 -add china_ip_route 120.92.0.0/17 -add china_ip_route 120.92.128.0/18 -add china_ip_route 120.92.192.0/22 -add china_ip_route 120.92.198.0/23 -add china_ip_route 120.92.200.0/21 -add china_ip_route 120.92.208.0/20 -add china_ip_route 120.92.224.0/19 -add china_ip_route 120.94.0.0/15 -add china_ip_route 120.128.0.0/13 -add china_ip_route 120.136.16.0/21 -add china_ip_route 120.136.128.0/18 -add china_ip_route 120.137.0.0/17 -add china_ip_route 120.143.128.0/19 -add china_ip_route 120.192.0.0/10 -add china_ip_route 121.0.8.0/21 -add china_ip_route 121.0.16.0/20 -add china_ip_route 121.4.0.0/15 -add china_ip_route 121.8.0.0/13 -add china_ip_route 121.16.0.0/12 -add china_ip_route 121.32.0.0/13 -add china_ip_route 121.40.0.0/14 -add china_ip_route 121.46.0.0/18 -add china_ip_route 121.46.76.0/22 -add china_ip_route 121.46.128.0/17 -add china_ip_route 121.47.0.0/16 -add china_ip_route 121.48.0.0/15 -add china_ip_route 121.50.8.0/21 -add china_ip_route 121.51.0.0/16 -add china_ip_route 121.52.160.0/19 -add china_ip_route 121.52.208.0/20 -add china_ip_route 121.52.224.0/19 -add china_ip_route 121.54.176.0/21 -add china_ip_route 121.55.0.0/18 -add china_ip_route 121.56.0.0/15 -add china_ip_route 121.58.0.0/17 -add china_ip_route 121.58.136.0/21 -add china_ip_route 121.58.144.0/20 -add china_ip_route 121.58.160.0/21 -add china_ip_route 121.59.0.0/20 -add china_ip_route 121.59.16.0/21 -add china_ip_route 121.59.24.0/22 -add china_ip_route 121.59.28.0/24 -add china_ip_route 121.59.31.0/24 -add china_ip_route 121.59.33.0/24 -add china_ip_route 121.59.35.0/24 -add china_ip_route 121.59.36.0/22 -add china_ip_route 121.59.40.0/21 -add china_ip_route 121.59.48.0/20 -add china_ip_route 121.59.64.0/18 -add china_ip_route 121.59.128.0/17 -add china_ip_route 121.60.0.0/14 -add china_ip_route 121.68.0.0/14 -add china_ip_route 121.76.0.0/15 -add china_ip_route 121.79.128.0/18 -add china_ip_route 121.89.0.0/16 -add china_ip_route 121.100.128.0/17 -add china_ip_route 121.101.0.0/18 -add china_ip_route 121.101.208.0/20 -add china_ip_route 121.192.0.0/13 -add china_ip_route 121.200.192.0/23 -add china_ip_route 121.200.194.0/24 -add china_ip_route 121.200.196.0/22 -add china_ip_route 121.201.0.0/16 -add china_ip_route 121.204.0.0/14 -add china_ip_route 121.224.0.0/12 -add china_ip_route 121.248.0.0/14 -add china_ip_route 121.255.0.0/16 -add china_ip_route 122.0.64.0/18 -add china_ip_route 122.0.128.0/17 -add china_ip_route 122.4.0.0/14 -add china_ip_route 122.9.0.0/16 -add china_ip_route 122.10.132.0/23 -add china_ip_route 122.10.136.0/23 -add china_ip_route 122.10.216.0/22 -add china_ip_route 122.10.228.0/22 -add china_ip_route 122.10.232.0/21 -add china_ip_route 122.10.240.0/22 -add china_ip_route 122.11.0.0/17 -add china_ip_route 122.12.0.0/15 -add china_ip_route 122.14.0.0/17 -add china_ip_route 122.14.192.0/18 -add china_ip_route 122.48.0.0/16 -add china_ip_route 122.49.0.0/18 -add china_ip_route 122.51.0.0/16 -add china_ip_route 122.64.0.0/14 -add china_ip_route 122.68.0.0/15 -add china_ip_route 122.70.0.0/18 -add china_ip_route 122.70.64.0/19 -add china_ip_route 122.70.96.0/20 -add china_ip_route 122.70.112.0/21 -add china_ip_route 122.70.120.0/22 -add china_ip_route 122.70.124.0/23 -add china_ip_route 122.70.126.0/24 -add china_ip_route 122.70.128.0/17 -add china_ip_route 122.71.0.0/16 -add china_ip_route 122.72.0.0/13 -add china_ip_route 122.80.0.0/12 -add china_ip_route 122.96.0.0/15 -add china_ip_route 122.98.144.0/20 -add china_ip_route 122.98.160.0/21 -add china_ip_route 122.98.172.0/22 -add china_ip_route 122.98.176.0/20 -add china_ip_route 122.98.192.0/21 -add china_ip_route 122.98.232.0/21 -add china_ip_route 122.98.240.0/20 -add china_ip_route 122.102.0.0/20 -add china_ip_route 122.102.64.0/19 -add china_ip_route 122.112.0.0/18 -add china_ip_route 122.112.64.0/19 -add china_ip_route 122.112.96.0/22 -add china_ip_route 122.112.118.0/24 -add china_ip_route 122.112.122.0/24 -add china_ip_route 122.112.125.0/24 -add china_ip_route 122.112.128.0/17 -add china_ip_route 122.113.0.0/16 -add china_ip_route 122.114.0.0/16 -add china_ip_route 122.115.0.0/18 -add china_ip_route 122.115.80.0/20 -add china_ip_route 122.115.96.0/19 -add china_ip_route 122.115.128.0/17 -add china_ip_route 122.119.0.0/16 -add china_ip_route 122.128.100.0/22 -add china_ip_route 122.128.120.0/21 -add china_ip_route 122.136.0.0/13 -add china_ip_route 122.144.128.0/17 -add china_ip_route 122.152.192.0/18 -add china_ip_route 122.156.0.0/14 -add china_ip_route 122.188.0.0/14 -add china_ip_route 122.192.0.0/14 -add china_ip_route 122.198.0.0/16 -add china_ip_route 122.200.40.0/21 -add china_ip_route 122.200.64.0/18 -add china_ip_route 122.201.48.0/20 -add china_ip_route 122.204.0.0/14 -add china_ip_route 122.224.0.0/12 -add china_ip_route 122.240.0.0/13 -add china_ip_route 122.248.24.0/21 -add china_ip_route 122.248.48.0/20 -add china_ip_route 122.255.64.0/21 -add china_ip_route 123.0.128.0/21 -add china_ip_route 123.0.136.0/23 -add china_ip_route 123.0.139.0/24 -add china_ip_route 123.0.140.0/22 -add china_ip_route 123.0.144.0/20 -add china_ip_route 123.0.160.0/19 -add china_ip_route 123.4.0.0/14 -add china_ip_route 123.8.0.0/13 -add china_ip_route 123.49.130.0/23 -add china_ip_route 123.49.132.0/22 -add china_ip_route 123.49.136.0/22 -add china_ip_route 123.49.152.0/21 -add china_ip_route 123.49.160.0/19 -add china_ip_route 123.49.192.0/18 -add china_ip_route 123.50.160.0/19 -add china_ip_route 123.52.0.0/14 -add china_ip_route 123.56.0.0/15 -add china_ip_route 123.58.0.0/18 -add china_ip_route 123.58.64.0/20 -add china_ip_route 123.58.80.0/21 -add china_ip_route 123.58.88.0/22 -add china_ip_route 123.58.96.0/19 -add china_ip_route 123.58.128.0/18 -add china_ip_route 123.58.224.0/19 -add china_ip_route 123.59.0.0/16 -add china_ip_route 123.61.0.0/16 -add china_ip_route 123.62.0.0/16 -add china_ip_route 123.64.0.0/11 -add china_ip_route 123.96.0.0/15 -add china_ip_route 123.98.0.0/17 -add china_ip_route 123.99.128.0/17 -add china_ip_route 123.100.0.0/19 -add china_ip_route 123.100.232.0/24 -add china_ip_route 123.101.0.0/16 -add china_ip_route 123.103.0.0/20 -add china_ip_route 123.103.16.0/21 -add china_ip_route 123.103.24.0/22 -add china_ip_route 123.103.28.0/23 -add china_ip_route 123.103.30.0/24 -add china_ip_route 123.103.32.0/19 -add china_ip_route 123.103.64.0/18 -add china_ip_route 123.108.134.0/24 -add china_ip_route 123.108.138.0/23 -add china_ip_route 123.108.140.0/24 -add china_ip_route 123.108.142.0/24 -add china_ip_route 123.108.208.0/20 -add china_ip_route 123.112.0.0/12 -add china_ip_route 123.128.0.0/13 -add china_ip_route 123.137.0.0/16 -add china_ip_route 123.138.0.0/15 -add china_ip_route 123.144.0.0/12 -add china_ip_route 123.160.0.0/12 -add china_ip_route 123.176.60.0/22 -add china_ip_route 123.176.80.0/20 -add china_ip_route 123.177.0.0/16 -add china_ip_route 123.178.0.0/15 -add china_ip_route 123.180.0.0/14 -add china_ip_route 123.184.0.0/13 -add china_ip_route 123.196.0.0/15 -add china_ip_route 123.199.128.0/17 -add china_ip_route 123.206.0.0/15 -add china_ip_route 123.232.0.0/14 -add china_ip_route 123.242.0.0/17 -add china_ip_route 123.242.192.0/21 -add china_ip_route 123.244.0.0/14 -add china_ip_route 123.249.0.0/16 -add china_ip_route 123.253.240.0/22 -add china_ip_route 123.254.96.0/21 -add china_ip_route 124.6.64.0/18 -add china_ip_route 124.14.0.0/15 -add china_ip_route 124.16.0.0/15 -add china_ip_route 124.20.0.0/14 -add china_ip_route 124.28.192.0/18 -add china_ip_route 124.29.0.0/17 -add china_ip_route 124.31.0.0/16 -add china_ip_route 124.40.112.0/20 -add china_ip_route 124.40.128.0/18 -add china_ip_route 124.40.192.0/19 -add china_ip_route 124.40.240.0/22 -add china_ip_route 124.42.0.0/16 -add china_ip_route 124.47.0.0/18 -add china_ip_route 124.64.0.0/15 -add china_ip_route 124.66.0.0/17 -add china_ip_route 124.67.0.0/16 -add china_ip_route 124.68.0.0/19 -add china_ip_route 124.68.32.0/20 -add china_ip_route 124.68.48.0/21 -add china_ip_route 124.68.56.0/22 -add china_ip_route 124.68.60.0/23 -add china_ip_route 124.68.63.0/24 -add china_ip_route 124.68.64.0/18 -add china_ip_route 124.68.128.0/18 -add china_ip_route 124.68.192.0/19 -add china_ip_route 124.68.224.0/23 -add china_ip_route 124.68.226.0/24 -add china_ip_route 124.68.228.0/22 -add china_ip_route 124.68.232.0/21 -add china_ip_route 124.68.240.0/23 -add china_ip_route 124.68.242.0/24 -add china_ip_route 124.68.244.0/23 -add china_ip_route 124.68.254.0/23 -add china_ip_route 124.69.0.0/16 -add china_ip_route 124.70.0.0/15 -add china_ip_route 124.72.0.0/13 -add china_ip_route 124.88.0.0/13 -add china_ip_route 124.108.8.0/21 -add china_ip_route 124.108.40.0/21 -add china_ip_route 124.109.96.0/21 -add china_ip_route 124.112.0.0/14 -add china_ip_route 124.116.0.0/15 -add china_ip_route 124.118.0.0/16 -add china_ip_route 124.119.0.0/17 -add china_ip_route 124.119.128.0/18 -add china_ip_route 124.119.192.0/19 -add china_ip_route 124.119.224.0/20 -add china_ip_route 124.119.240.0/22 -add china_ip_route 124.119.244.0/23 -add china_ip_route 124.119.246.0/25 -add china_ip_route 124.119.246.128/26 -add china_ip_route 124.119.246.192/27 -add china_ip_route 124.119.246.224/28 -add china_ip_route 124.119.246.240/29 -add china_ip_route 124.119.246.248/30 -add china_ip_route 124.119.246.254/31 -add china_ip_route 124.119.247.0/24 -add china_ip_route 124.119.248.0/21 -add china_ip_route 124.126.0.0/15 -add china_ip_route 124.128.0.0/13 -add china_ip_route 124.147.128.0/17 -add china_ip_route 124.150.137.0/24 -add china_ip_route 124.151.0.0/16 -add china_ip_route 124.152.0.0/16 -add china_ip_route 124.160.0.0/13 -add china_ip_route 124.172.0.0/16 -add china_ip_route 124.173.32.0/19 -add china_ip_route 124.173.64.0/18 -add china_ip_route 124.173.128.0/17 -add china_ip_route 124.174.0.0/15 -add china_ip_route 124.192.0.0/15 -add china_ip_route 124.196.0.0/16 -add china_ip_route 124.200.0.0/13 -add china_ip_route 124.220.0.0/14 -add china_ip_route 124.224.0.0/12 -add china_ip_route 124.240.0.0/17 -add china_ip_route 124.240.128.0/18 -add china_ip_route 124.242.0.0/16 -add china_ip_route 124.243.192.0/18 -add china_ip_route 124.248.0.0/17 -add china_ip_route 124.249.0.0/16 -add china_ip_route 124.250.0.0/15 -add china_ip_route 124.254.0.0/18 -add china_ip_route 125.31.192.0/18 -add china_ip_route 125.32.0.0/12 -add china_ip_route 125.58.128.0/17 -add china_ip_route 125.61.128.0/17 -add china_ip_route 125.62.0.0/18 -add china_ip_route 125.64.0.0/11 -add china_ip_route 125.96.0.0/15 -add china_ip_route 125.98.0.0/16 -add china_ip_route 125.104.0.0/13 -add china_ip_route 125.112.0.0/12 -add china_ip_route 125.169.0.0/16 -add china_ip_route 125.171.0.0/16 -add china_ip_route 125.208.0.0/19 -add china_ip_route 125.208.37.0/24 -add china_ip_route 125.208.40.0/24 -add china_ip_route 125.208.45.0/24 -add china_ip_route 125.208.46.0/23 -add china_ip_route 125.208.48.0/20 -add china_ip_route 125.210.0.0/15 -add china_ip_route 125.213.0.0/17 -add china_ip_route 125.214.96.0/19 -add china_ip_route 125.215.0.0/18 -add china_ip_route 125.216.0.0/13 -add china_ip_route 125.254.128.0/17 -add china_ip_route 128.108.0.0/16 -add china_ip_route 129.28.0.0/16 -add china_ip_route 129.204.0.0/16 -add china_ip_route 129.211.0.0/16 -add china_ip_route 129.223.254.0/24 -add china_ip_route 130.36.146.0/23 -add china_ip_route 130.214.218.0/23 -add china_ip_route 131.228.96.0/24 -add china_ip_route 131.253.12.0/29 -add china_ip_route 131.253.12.80/28 -add china_ip_route 131.253.12.240/29 -add china_ip_route 132.232.0.0/16 -add china_ip_route 132.237.134.0/24 -add china_ip_route 134.175.0.0/16 -add china_ip_route 135.84.247.0/24 -add china_ip_route 135.84.254.0/23 -add china_ip_route 135.159.208.0/20 -add china_ip_route 135.244.80.0/20 -add china_ip_route 137.59.59.0/24 -add china_ip_route 137.59.88.0/22 -add china_ip_route 138.32.244.0/24 -add china_ip_route 139.5.56.0/21 -add china_ip_route 139.5.80.0/22 -add china_ip_route 139.5.92.0/22 -add china_ip_route 139.5.128.0/22 -add china_ip_route 139.5.160.0/22 -add china_ip_route 139.5.192.0/22 -add china_ip_route 139.5.204.0/22 -add china_ip_route 139.5.244.0/22 -add china_ip_route 139.9.0.0/16 -add china_ip_route 139.129.0.0/16 -add china_ip_route 139.138.238.0/28 -add china_ip_route 139.148.0.0/16 -add china_ip_route 139.155.0.0/16 -add china_ip_route 139.159.0.0/19 -add china_ip_route 139.159.32.0/21 -add china_ip_route 139.159.40.0/22 -add china_ip_route 139.159.52.0/22 -add china_ip_route 139.159.56.0/21 -add china_ip_route 139.159.64.0/19 -add china_ip_route 139.159.96.0/20 -add china_ip_route 139.159.112.0/22 -add china_ip_route 139.159.116.0/23 -add china_ip_route 139.159.120.0/21 -add china_ip_route 139.159.128.0/17 -add china_ip_route 139.170.0.0/16 -add china_ip_route 139.176.0.0/16 -add china_ip_route 139.183.0.0/16 -add china_ip_route 139.186.0.0/16 -add china_ip_route 139.189.0.0/16 -add china_ip_route 139.196.0.0/15 -add china_ip_route 139.198.0.0/21 -add china_ip_route 139.198.8.0/23 -add china_ip_route 139.198.11.0/24 -add china_ip_route 139.198.12.0/22 -add china_ip_route 139.198.16.0/20 -add china_ip_route 139.198.32.0/19 -add china_ip_route 139.198.66.0/23 -add china_ip_route 139.198.68.0/22 -add china_ip_route 139.198.72.0/21 -add china_ip_route 139.198.80.0/20 -add china_ip_route 139.198.96.0/20 -add china_ip_route 139.198.116.0/22 -add china_ip_route 139.198.122.0/23 -add china_ip_route 139.198.124.0/22 -add china_ip_route 139.198.128.0/17 -add china_ip_route 139.199.0.0/16 -add china_ip_route 139.200.0.0/13 -add china_ip_route 139.208.0.0/13 -add china_ip_route 139.217.0.0/16 -add china_ip_route 139.219.0.0/16 -add china_ip_route 139.220.0.0/17 -add china_ip_route 139.220.128.0/18 -add china_ip_route 139.220.192.0/22 -add china_ip_route 139.220.196.0/23 -add china_ip_route 139.220.200.0/21 -add china_ip_route 139.220.208.0/23 -add china_ip_route 139.220.212.0/22 -add china_ip_route 139.220.216.0/21 -add china_ip_route 139.220.224.0/19 -add china_ip_route 139.221.0.0/16 -add china_ip_route 139.224.0.0/16 -add china_ip_route 139.226.0.0/15 -add china_ip_route 140.75.0.0/16 -add china_ip_route 140.101.208.0/24 -add china_ip_route 140.143.0.0/16 -add china_ip_route 140.179.0.0/16 -add china_ip_route 140.205.0.0/16 -add china_ip_route 140.206.0.0/15 -add china_ip_route 140.210.0.0/16 -add china_ip_route 140.224.0.0/16 -add china_ip_route 140.237.0.0/16 -add china_ip_route 140.240.0.0/16 -add china_ip_route 140.242.223.0/24 -add china_ip_route 140.242.224.0/24 -add china_ip_route 140.243.0.0/16 -add china_ip_route 140.246.0.0/16 -add china_ip_route 140.249.0.0/16 -add china_ip_route 140.250.0.0/16 -add china_ip_route 140.255.0.0/16 -add china_ip_route 142.70.0.0/16 -add china_ip_route 142.86.0.0/16 -add china_ip_route 144.0.0.0/16 -add china_ip_route 144.7.0.0/16 -add china_ip_route 144.12.0.0/16 -add china_ip_route 144.36.146.0/23 -add china_ip_route 144.48.64.0/22 -add china_ip_route 144.48.88.0/22 -add china_ip_route 144.48.156.0/22 -add china_ip_route 144.48.180.0/22 -add china_ip_route 144.48.184.0/22 -add china_ip_route 144.48.204.0/22 -add china_ip_route 144.48.208.0/21 -add china_ip_route 144.52.0.0/16 -add china_ip_route 144.123.0.0/16 -add china_ip_route 144.211.80.0/24 -add china_ip_route 144.211.138.0/24 -add china_ip_route 144.255.0.0/16 -add china_ip_route 146.56.192.0/18 -add china_ip_route 146.88.175.0/24 -add china_ip_route 146.196.56.0/22 -add china_ip_route 146.196.68.0/22 -add china_ip_route 146.196.92.0/22 -add china_ip_route 146.196.112.0/21 -add china_ip_route 146.196.124.0/22 -add china_ip_route 146.217.137.0/24 -add china_ip_route 146.222.79.0/24 -add china_ip_route 146.222.81.0/24 -add china_ip_route 146.222.94.0/24 -add china_ip_route 147.243.13.32/27 -add china_ip_route 147.243.13.64/27 -add china_ip_route 147.243.14.32/27 -add china_ip_route 148.70.0.0/16 -add china_ip_route 150.0.0.0/16 -add china_ip_route 150.115.0.0/16 -add china_ip_route 150.121.0.0/16 -add china_ip_route 150.122.0.0/16 -add china_ip_route 150.129.136.0/22 -add china_ip_route 150.129.192.0/22 -add china_ip_route 150.129.252.0/22 -add china_ip_route 150.138.0.0/15 -add china_ip_route 150.158.0.0/16 -add china_ip_route 150.222.88.0/23 -add china_ip_route 150.223.0.0/16 -add china_ip_route 150.242.0.0/21 -add china_ip_route 150.242.8.0/22 -add china_ip_route 150.242.28.0/22 -add china_ip_route 150.242.44.0/22 -add china_ip_route 150.242.48.0/21 -add china_ip_route 150.242.56.0/22 -add china_ip_route 150.242.76.0/22 -add china_ip_route 150.242.80.0/22 -add china_ip_route 150.242.92.0/22 -add china_ip_route 150.242.96.0/22 -add china_ip_route 150.242.112.0/21 -add china_ip_route 150.242.120.0/22 -add china_ip_route 150.242.152.0/22 -add china_ip_route 150.242.158.0/24 -add china_ip_route 150.242.160.0/21 -add china_ip_route 150.242.168.0/22 -add china_ip_route 150.242.184.0/21 -add china_ip_route 150.242.192.0/22 -add china_ip_route 150.242.224.0/22 -add china_ip_route 150.242.232.0/21 -add china_ip_route 150.242.240.0/21 -add china_ip_route 150.242.248.0/22 -add china_ip_route 150.248.0.0/16 -add china_ip_route 150.255.0.0/16 -add china_ip_route 152.32.178.0/23 -add china_ip_route 152.104.128.0/17 -add china_ip_route 152.136.0.0/16 -add china_ip_route 153.0.0.0/16 -add china_ip_route 153.3.0.0/16 -add china_ip_route 153.34.0.0/15 -add china_ip_route 153.36.0.0/15 -add china_ip_route 153.99.0.0/16 -add china_ip_route 153.101.0.0/16 -add china_ip_route 153.118.0.0/15 -add china_ip_route 154.8.128.0/17 -add china_ip_route 155.126.176.0/23 -add china_ip_route 156.107.160.0/24 -add china_ip_route 156.107.170.0/24 -add china_ip_route 156.107.179.0/24 -add china_ip_route 156.107.181.0/24 -add china_ip_route 156.154.62.0/23 -add china_ip_route 157.0.0.0/16 -add china_ip_route 157.18.0.0/16 -add china_ip_route 157.61.0.0/16 -add china_ip_route 157.119.8.0/21 -add china_ip_route 157.119.16.0/22 -add china_ip_route 157.119.28.0/22 -add china_ip_route 157.119.132.0/22 -add china_ip_route 157.119.136.0/21 -add china_ip_route 157.119.144.0/20 -add china_ip_route 157.119.160.0/21 -add china_ip_route 157.119.172.0/22 -add china_ip_route 157.119.192.0/21 -add china_ip_route 157.119.240.0/22 -add china_ip_route 157.119.252.0/22 -add china_ip_route 157.122.0.0/16 -add china_ip_route 157.133.186.0/23 -add china_ip_route 157.133.192.0/21 -add china_ip_route 157.133.212.0/24 -add china_ip_route 157.133.236.0/24 -add china_ip_route 157.148.0.0/16 -add china_ip_route 157.156.0.0/16 -add china_ip_route 157.255.0.0/16 -add china_ip_route 158.79.0.0/24 -add china_ip_route 158.79.2.0/23 -add china_ip_route 158.79.4.0/22 -add china_ip_route 158.79.8.0/21 -add china_ip_route 158.79.16.0/20 -add china_ip_route 158.79.32.0/19 -add china_ip_route 158.79.64.0/18 -add china_ip_route 158.79.128.0/17 -add china_ip_route 159.75.0.0/16 -add china_ip_route 159.221.232.0/22 -add china_ip_route 159.226.0.0/16 -add china_ip_route 160.19.212.0/22 -add china_ip_route 160.19.216.0/22 -add china_ip_route 160.20.48.0/22 -add china_ip_route 160.62.10.0/24 -add china_ip_route 160.83.109.0/24 -add china_ip_route 160.83.110.0/23 -add china_ip_route 160.202.60.0/23 -add china_ip_route 160.202.62.0/24 -add china_ip_route 160.202.148.0/22 -add china_ip_route 160.202.152.0/22 -add china_ip_route 160.202.212.0/22 -add china_ip_route 160.202.216.0/21 -add china_ip_route 160.202.224.0/19 -add china_ip_route 160.238.64.0/22 -add china_ip_route 161.120.0.0/16 -add china_ip_route 161.163.0.0/21 -add china_ip_route 161.163.28.0/23 -add china_ip_route 161.163.176.0/24 -add china_ip_route 161.163.178.0/23 -add china_ip_route 161.163.180.0/22 -add china_ip_route 161.189.0.0/16 -add china_ip_route 161.207.0.0/16 -add china_ip_route 162.14.0.0/21 -add china_ip_route 162.14.12.0/22 -add china_ip_route 162.14.16.0/21 -add china_ip_route 162.14.26.0/23 -add china_ip_route 162.14.28.0/22 -add china_ip_route 162.14.32.0/19 -add china_ip_route 162.14.64.0/18 -add china_ip_route 162.14.128.0/17 -add china_ip_route 162.105.0.0/16 -add china_ip_route 163.0.0.0/16 -add china_ip_route 163.47.4.0/22 -add china_ip_route 163.53.0.0/20 -add china_ip_route 163.53.36.0/22 -add china_ip_route 163.53.40.0/22 -add china_ip_route 163.53.48.0/20 -add china_ip_route 163.53.64.0/22 -add china_ip_route 163.53.88.0/21 -add china_ip_route 163.53.96.0/19 -add china_ip_route 163.53.128.0/21 -add china_ip_route 163.53.136.0/22 -add china_ip_route 163.53.160.0/20 -add china_ip_route 163.53.188.0/22 -add china_ip_route 163.53.220.0/22 -add china_ip_route 163.53.240.0/22 -add china_ip_route 163.116.202.0/23 -add china_ip_route 163.125.0.0/16 -add china_ip_route 163.142.0.0/16 -add china_ip_route 163.177.0.0/16 -add china_ip_route 163.179.0.0/16 -add china_ip_route 163.204.0.0/16 -add china_ip_route 163.244.246.0/24 -add china_ip_route 164.52.80.0/24 -add china_ip_route 165.84.197.0/24 -add china_ip_route 165.84.251.0/25 -add china_ip_route 165.84.251.128/26 -add china_ip_route 165.84.251.192/27 -add china_ip_route 165.84.251.224/28 -add china_ip_route 165.84.251.240/29 -add china_ip_route 165.84.251.248/30 -add china_ip_route 165.84.251.253/32 -add china_ip_route 165.84.251.254/31 -add china_ip_route 165.156.30.0/24 -add china_ip_route 165.254.82.27/32 -add china_ip_route 166.111.0.0/16 -add china_ip_route 167.139.0.0/16 -add china_ip_route 167.189.0.0/16 -add china_ip_route 167.220.244.0/22 -add china_ip_route 168.159.144.0/21 -add china_ip_route 168.159.152.0/22 -add china_ip_route 168.159.156.0/23 -add china_ip_route 168.159.158.0/24 -add china_ip_route 168.160.0.0/16 -add china_ip_route 168.230.0.0/24 -add china_ip_route 170.179.0.0/16 -add china_ip_route 170.225.224.0/23 -add china_ip_route 170.252.152.0/21 -add china_ip_route 171.8.0.0/13 -add china_ip_route 171.34.0.0/15 -add china_ip_route 171.36.0.0/14 -add china_ip_route 171.40.0.0/13 -add china_ip_route 171.80.0.0/12 -add china_ip_route 171.104.0.0/13 -add china_ip_route 171.112.0.0/12 -add china_ip_route 171.208.0.0/12 -add china_ip_route 172.81.192.0/18 -add china_ip_route 173.39.200.0/23 -add china_ip_route 175.0.0.0/12 -add china_ip_route 175.16.0.0/13 -add china_ip_route 175.24.0.0/14 -add china_ip_route 175.30.0.0/15 -add china_ip_route 175.42.0.0/15 -add china_ip_route 175.44.0.0/16 -add china_ip_route 175.46.0.0/15 -add china_ip_route 175.48.0.0/12 -add china_ip_route 175.64.0.0/11 -add china_ip_route 175.102.0.0/16 -add china_ip_route 175.106.128.0/17 -add china_ip_route 175.111.144.0/20 -add china_ip_route 175.111.160.0/20 -add china_ip_route 175.111.184.0/22 -add china_ip_route 175.146.0.0/15 -add china_ip_route 175.148.0.0/14 -add china_ip_route 175.152.0.0/14 -add china_ip_route 175.158.96.0/22 -add china_ip_route 175.160.0.0/12 -add china_ip_route 175.176.156.0/22 -add china_ip_route 175.176.188.0/22 -add china_ip_route 175.178.0.0/16 -add china_ip_route 175.184.128.0/18 -add china_ip_route 175.185.0.0/16 -add china_ip_route 175.186.0.0/15 -add china_ip_route 175.188.0.0/14 -add china_ip_route 180.76.16.0/20 -add china_ip_route 180.76.32.0/19 -add china_ip_route 180.76.64.0/18 -add china_ip_route 180.76.128.0/18 -add china_ip_route 180.76.192.0/19 -add china_ip_route 180.76.224.0/20 -add china_ip_route 180.76.240.0/24 -add china_ip_route 180.76.242.0/23 -add china_ip_route 180.76.244.0/22 -add china_ip_route 180.76.248.0/22 -add china_ip_route 180.76.252.0/23 -add china_ip_route 180.76.255.0/24 -add china_ip_route 180.77.0.0/16 -add china_ip_route 180.78.0.0/15 -add china_ip_route 180.84.0.0/15 -add china_ip_route 180.86.0.0/16 -add china_ip_route 180.87.93.98/32 -add china_ip_route 180.88.0.0/14 -add china_ip_route 180.94.56.0/21 -add china_ip_route 180.94.96.0/20 -add china_ip_route 180.94.120.0/21 -add china_ip_route 180.95.128.0/17 -add china_ip_route 180.96.0.0/11 -add china_ip_route 180.129.128.0/17 -add china_ip_route 180.130.0.0/16 -add china_ip_route 180.136.0.0/13 -add china_ip_route 180.148.16.0/21 -add china_ip_route 180.148.152.0/21 -add china_ip_route 180.148.216.0/21 -add china_ip_route 180.148.224.0/19 -add china_ip_route 180.149.128.0/19 -add china_ip_route 180.150.160.0/21 -add china_ip_route 180.150.176.0/20 -add china_ip_route 180.152.0.0/13 -add china_ip_route 180.160.0.0/12 -add china_ip_route 180.178.112.0/21 -add china_ip_route 180.178.192.0/18 -add china_ip_route 180.184.0.0/14 -add china_ip_route 180.188.0.0/17 -add china_ip_route 180.189.148.0/22 -add china_ip_route 180.200.252.0/22 -add china_ip_route 180.201.0.0/16 -add china_ip_route 180.202.0.0/15 -add china_ip_route 180.208.0.0/15 -add china_ip_route 180.210.212.0/22 -add china_ip_route 180.210.233.0/24 -add china_ip_route 180.210.236.0/22 -add china_ip_route 180.212.0.0/15 -add china_ip_route 180.222.224.0/19 -add china_ip_route 180.223.0.0/18 -add china_ip_route 180.223.80.0/20 -add china_ip_route 180.223.96.0/19 -add china_ip_route 180.223.129.0/24 -add china_ip_route 180.223.130.0/23 -add china_ip_route 180.223.132.0/22 -add china_ip_route 180.223.136.0/21 -add china_ip_route 180.223.144.0/20 -add china_ip_route 180.223.160.0/19 -add china_ip_route 180.223.192.0/18 -add china_ip_route 180.233.0.0/18 -add china_ip_route 180.233.64.0/19 -add china_ip_route 180.233.144.0/22 -add china_ip_route 180.235.64.0/19 -add china_ip_route 180.235.112.0/22 -add china_ip_route 182.16.144.0/21 -add china_ip_route 182.16.192.0/19 -add china_ip_route 182.18.0.0/17 -add china_ip_route 182.23.184.0/21 -add china_ip_route 182.23.200.0/21 -add china_ip_route 182.32.0.0/12 -add china_ip_route 182.48.96.0/19 -add china_ip_route 182.49.0.0/16 -add china_ip_route 182.50.0.0/22 -add china_ip_route 182.50.8.0/21 -add china_ip_route 182.50.112.0/20 -add china_ip_route 182.51.0.0/16 -add china_ip_route 182.54.0.0/17 -add china_ip_route 182.61.0.0/18 -add china_ip_route 182.61.128.0/19 -add china_ip_route 182.61.192.0/18 -add china_ip_route 182.80.0.0/13 -add china_ip_route 182.88.0.0/14 -add china_ip_route 182.92.0.0/16 -add china_ip_route 182.96.0.0/11 -add china_ip_route 182.128.0.0/12 -add china_ip_route 182.144.0.0/13 -add china_ip_route 182.157.0.0/16 -add china_ip_route 182.160.64.0/19 -add china_ip_route 182.174.0.0/15 -add china_ip_route 182.200.0.0/13 -add china_ip_route 182.236.128.0/17 -add china_ip_route 182.237.24.0/21 -add china_ip_route 182.238.0.0/16 -add china_ip_route 182.239.0.0/19 -add china_ip_route 182.240.0.0/13 -add china_ip_route 182.254.0.0/18 -add china_ip_route 182.254.64.0/19 -add china_ip_route 182.254.96.0/20 -add china_ip_route 182.254.112.0/22 -add china_ip_route 182.254.117.0/24 -add china_ip_route 182.254.119.0/24 -add china_ip_route 182.254.120.0/21 -add china_ip_route 182.254.128.0/17 -add china_ip_route 183.0.0.0/10 -add china_ip_route 183.64.0.0/13 -add china_ip_route 183.78.160.0/21 -add china_ip_route 183.78.180.0/22 -add china_ip_route 183.81.180.0/22 -add china_ip_route 183.84.0.0/15 -add china_ip_route 183.91.128.0/22 -add china_ip_route 183.91.136.0/21 -add china_ip_route 183.91.144.0/20 -add china_ip_route 183.92.0.0/14 -add china_ip_route 183.128.0.0/11 -add china_ip_route 183.160.0.0/13 -add china_ip_route 183.168.0.0/15 -add china_ip_route 183.170.0.0/16 -add china_ip_route 183.172.0.0/14 -add china_ip_route 183.184.0.0/13 -add china_ip_route 183.192.0.0/10 -add china_ip_route 185.109.236.0/24 -add china_ip_route 185.216.118.0/26 -add china_ip_route 185.216.118.64/27 -add china_ip_route 185.216.118.112/28 -add china_ip_route 185.216.118.128/25 -add china_ip_route 188.131.128.0/17 -add china_ip_route 192.11.23.0/24 -add china_ip_route 192.11.26.0/24 -add china_ip_route 192.11.39.0/24 -add china_ip_route 192.11.236.0/24 -add china_ip_route 192.23.191.0/24 -add china_ip_route 192.55.10.0/23 -add china_ip_route 192.55.40.0/24 -add china_ip_route 192.55.46.0/24 -add china_ip_route 192.55.68.0/22 -add china_ip_route 192.102.204.0/22 -add china_ip_route 192.124.154.0/24 -add china_ip_route 192.137.31.0/24 -add china_ip_route 192.140.128.0/21 -add china_ip_route 192.140.136.0/22 -add china_ip_route 192.140.156.0/22 -add china_ip_route 192.140.160.0/19 -add china_ip_route 192.140.192.0/20 -add china_ip_route 192.140.208.0/21 -add china_ip_route 192.144.128.0/17 -add china_ip_route 192.163.11.0/24 -add china_ip_route 192.232.97.0/24 -add china_ip_route 193.17.120.0/22 -add china_ip_route 193.20.64.0/22 -add china_ip_route 193.112.0.0/16 -add china_ip_route 193.200.196.0/24 -add china_ip_route 193.200.222.160/28 -add china_ip_route 194.138.136.0/24 -add china_ip_route 194.138.202.0/23 -add china_ip_route 194.138.245.0/24 -add china_ip_route 195.142.215.0/24 -add china_ip_route 198.175.100.0/22 -add china_ip_route 198.208.17.0/24 -add china_ip_route 198.208.19.0/24 -add china_ip_route 199.7.72.0/24 -add china_ip_route 199.65.192.0/21 -add china_ip_route 199.244.144.0/24 -add china_ip_route 202.0.100.0/23 -add china_ip_route 202.0.122.0/23 -add china_ip_route 202.1.105.0/24 -add china_ip_route 202.1.106.0/24 -add china_ip_route 202.3.128.0/23 -add china_ip_route 202.4.128.0/19 -add china_ip_route 202.4.252.0/22 -add china_ip_route 202.5.208.0/21 -add china_ip_route 202.5.216.0/22 -add china_ip_route 202.6.6.0/23 -add china_ip_route 202.6.66.0/23 -add china_ip_route 202.6.72.0/23 -add china_ip_route 202.6.87.0/24 -add china_ip_route 202.6.88.0/23 -add china_ip_route 202.6.92.0/23 -add china_ip_route 202.6.103.0/24 -add china_ip_route 202.6.108.0/24 -add china_ip_route 202.6.110.0/23 -add china_ip_route 202.6.114.0/24 -add china_ip_route 202.6.176.0/20 -add china_ip_route 202.8.0.0/24 -add china_ip_route 202.8.2.0/23 -add china_ip_route 202.8.4.0/23 -add china_ip_route 202.8.12.0/24 -add china_ip_route 202.8.24.0/24 -add china_ip_route 202.8.77.0/24 -add china_ip_route 202.8.128.0/19 -add china_ip_route 202.8.192.0/20 -add china_ip_route 202.9.32.0/24 -add china_ip_route 202.9.34.0/23 -add china_ip_route 202.9.48.0/23 -add china_ip_route 202.9.51.0/24 -add china_ip_route 202.9.52.0/23 -add china_ip_route 202.9.54.0/24 -add china_ip_route 202.9.57.0/24 -add china_ip_route 202.9.58.0/23 -add china_ip_route 202.10.64.0/21 -add china_ip_route 202.10.74.0/23 -add china_ip_route 202.10.76.0/22 -add china_ip_route 202.10.112.0/20 -add china_ip_route 202.12.1.0/24 -add china_ip_route 202.12.2.0/24 -add china_ip_route 202.12.17.0/24 -add china_ip_route 202.12.18.0/23 -add china_ip_route 202.12.72.0/24 -add china_ip_route 202.12.84.0/23 -add china_ip_route 202.12.96.0/24 -add china_ip_route 202.12.98.0/23 -add china_ip_route 202.12.106.0/24 -add china_ip_route 202.12.111.0/24 -add china_ip_route 202.12.116.0/24 -add china_ip_route 202.14.64.0/23 -add china_ip_route 202.14.69.0/24 -add china_ip_route 202.14.73.0/24 -add china_ip_route 202.14.74.0/23 -add china_ip_route 202.14.76.0/24 -add china_ip_route 202.14.78.0/23 -add china_ip_route 202.14.88.0/24 -add china_ip_route 202.14.97.0/24 -add china_ip_route 202.14.104.0/23 -add china_ip_route 202.14.108.0/23 -add china_ip_route 202.14.111.0/24 -add china_ip_route 202.14.114.0/23 -add china_ip_route 202.14.118.0/23 -add china_ip_route 202.14.124.0/23 -add china_ip_route 202.14.127.0/24 -add china_ip_route 202.14.129.0/24 -add china_ip_route 202.14.135.0/24 -add china_ip_route 202.14.136.0/24 -add china_ip_route 202.14.149.0/24 -add china_ip_route 202.14.151.0/24 -add china_ip_route 202.14.157.0/24 -add china_ip_route 202.14.158.0/23 -add china_ip_route 202.14.169.0/24 -add china_ip_route 202.14.170.0/23 -add china_ip_route 202.14.172.0/22 -add china_ip_route 202.14.176.0/24 -add china_ip_route 202.14.184.0/23 -add china_ip_route 202.14.208.0/23 -add china_ip_route 202.14.213.0/24 -add china_ip_route 202.14.219.0/24 -add china_ip_route 202.14.220.0/24 -add china_ip_route 202.14.222.0/23 -add china_ip_route 202.14.225.0/24 -add china_ip_route 202.14.226.0/23 -add china_ip_route 202.14.231.0/24 -add china_ip_route 202.14.235.0/24 -add china_ip_route 202.14.236.0/22 -add china_ip_route 202.14.246.0/24 -add china_ip_route 202.14.251.0/24 -add china_ip_route 202.20.66.0/24 -add china_ip_route 202.20.79.0/24 -add china_ip_route 202.20.87.0/24 -add china_ip_route 202.20.88.0/23 -add china_ip_route 202.20.90.0/24 -add china_ip_route 202.20.94.0/23 -add china_ip_route 202.20.114.0/24 -add china_ip_route 202.20.117.0/24 -add china_ip_route 202.20.120.0/24 -add china_ip_route 202.20.125.0/24 -add china_ip_route 202.20.126.0/23 -add china_ip_route 202.21.48.0/20 -add china_ip_route 202.21.131.0/24 -add china_ip_route 202.21.132.0/24 -add china_ip_route 202.21.141.0/24 -add china_ip_route 202.21.142.0/24 -add china_ip_route 202.21.147.0/24 -add china_ip_route 202.21.148.0/24 -add china_ip_route 202.21.150.0/23 -add china_ip_route 202.21.152.0/23 -add china_ip_route 202.21.154.0/24 -add china_ip_route 202.21.156.0/24 -add china_ip_route 202.21.208.0/24 -add china_ip_route 202.22.248.0/21 -add china_ip_route 202.27.12.0/24 -add china_ip_route 202.27.14.0/24 -add china_ip_route 202.27.136.0/23 -add china_ip_route 202.36.226.0/24 -add china_ip_route 202.38.0.0/22 -add china_ip_route 202.38.8.0/21 -add china_ip_route 202.38.48.0/20 -add china_ip_route 202.38.64.0/18 -add china_ip_route 202.38.128.0/21 -add china_ip_route 202.38.136.0/23 -add china_ip_route 202.38.138.0/24 -add china_ip_route 202.38.140.0/22 -add china_ip_route 202.38.146.0/23 -add china_ip_route 202.38.149.0/24 -add china_ip_route 202.38.150.0/23 -add china_ip_route 202.38.152.0/22 -add china_ip_route 202.38.156.0/24 -add china_ip_route 202.38.158.0/23 -add china_ip_route 202.38.160.0/23 -add china_ip_route 202.38.164.0/22 -add china_ip_route 202.38.168.0/22 -add china_ip_route 202.38.176.0/23 -add china_ip_route 202.38.184.0/21 -add china_ip_route 202.38.192.0/18 -add china_ip_route 202.40.4.0/23 -add china_ip_route 202.40.7.0/24 -add china_ip_route 202.40.15.0/24 -add china_ip_route 202.40.135.0/24 -add china_ip_route 202.40.136.0/24 -add china_ip_route 202.40.140.0/24 -add china_ip_route 202.40.143.0/24 -add china_ip_route 202.40.144.0/23 -add china_ip_route 202.40.150.0/24 -add china_ip_route 202.40.155.0/24 -add china_ip_route 202.40.156.0/24 -add china_ip_route 202.40.158.0/23 -add china_ip_route 202.40.162.0/24 -add china_ip_route 202.41.8.0/23 -add china_ip_route 202.41.11.0/24 -add china_ip_route 202.41.12.0/23 -add china_ip_route 202.41.128.0/24 -add china_ip_route 202.41.130.0/23 -add china_ip_route 202.41.142.0/24 -add china_ip_route 202.41.152.0/21 -add china_ip_route 202.41.192.0/24 -add china_ip_route 202.41.196.0/22 -add china_ip_route 202.41.200.0/22 -add china_ip_route 202.41.240.0/20 -add china_ip_route 202.43.76.0/22 -add china_ip_route 202.43.144.0/20 -add china_ip_route 202.44.16.0/20 -add china_ip_route 202.44.48.0/22 -add china_ip_route 202.44.67.0/24 -add china_ip_route 202.44.74.0/24 -add china_ip_route 202.44.97.0/24 -add china_ip_route 202.44.129.0/24 -add china_ip_route 202.44.132.0/23 -add china_ip_route 202.44.146.0/23 -add china_ip_route 202.45.0.0/23 -add china_ip_route 202.45.2.0/24 -add china_ip_route 202.45.15.0/24 -add china_ip_route 202.45.16.0/20 -add china_ip_route 202.46.16.0/23 -add china_ip_route 202.46.18.0/24 -add china_ip_route 202.46.20.0/23 -add china_ip_route 202.46.128.0/24 -add china_ip_route 202.46.224.0/20 -add china_ip_route 202.47.82.0/23 -add china_ip_route 202.47.96.0/20 -add china_ip_route 202.47.126.0/24 -add china_ip_route 202.47.128.0/24 -add china_ip_route 202.47.130.0/23 -add china_ip_route 202.52.34.0/24 -add china_ip_route 202.52.143.0/24 -add china_ip_route 202.53.140.0/24 -add china_ip_route 202.53.143.0/24 -add china_ip_route 202.53.202.0/24 -add china_ip_route 202.57.212.0/22 -add china_ip_route 202.57.216.0/22 -add china_ip_route 202.57.240.0/20 -add china_ip_route 202.58.0.0/24 -add china_ip_route 202.58.112.0/22 -add china_ip_route 202.59.0.0/23 -add china_ip_route 202.59.212.0/22 -add china_ip_route 202.59.236.0/24 -add china_ip_route 202.59.240.0/24 -add china_ip_route 202.60.48.0/21 -add china_ip_route 202.60.96.0/21 -add china_ip_route 202.60.112.0/20 -add china_ip_route 202.60.132.0/22 -add china_ip_route 202.60.136.0/21 -add china_ip_route 202.60.144.0/20 -add china_ip_route 202.61.68.0/22 -add china_ip_route 202.61.76.0/22 -add china_ip_route 202.61.88.0/22 -add china_ip_route 202.61.123.0/24 -add china_ip_route 202.61.127.0/24 -add china_ip_route 202.62.112.0/22 -add china_ip_route 202.62.248.0/22 -add china_ip_route 202.62.252.0/24 -add china_ip_route 202.62.255.0/24 -add china_ip_route 202.63.80.0/20 -add china_ip_route 202.63.160.0/19 -add china_ip_route 202.63.248.0/22 -add china_ip_route 202.63.253.0/24 -add china_ip_route 202.65.0.0/21 -add china_ip_route 202.65.8.0/23 -add china_ip_route 202.67.0.0/22 -add china_ip_route 202.69.4.0/23 -add china_ip_route 202.69.16.0/20 -add china_ip_route 202.70.0.0/19 -add china_ip_route 202.70.96.0/20 -add china_ip_route 202.70.192.0/20 -add china_ip_route 202.71.32.0/20 -add china_ip_route 202.72.40.0/21 -add china_ip_route 202.72.80.0/20 -add china_ip_route 202.72.112.0/20 -add china_ip_route 202.73.128.0/22 -add china_ip_route 202.73.240.0/20 -add china_ip_route 202.74.8.0/21 -add china_ip_route 202.74.36.0/24 -add china_ip_route 202.74.42.0/24 -add china_ip_route 202.74.52.0/24 -add china_ip_route 202.74.80.0/20 -add china_ip_route 202.74.254.0/23 -add china_ip_route 202.75.208.0/20 -add china_ip_route 202.75.252.0/22 -add china_ip_route 202.76.247.0/24 -add china_ip_route 202.76.252.0/22 -add china_ip_route 202.77.80.0/21 -add china_ip_route 202.77.92.0/22 -add china_ip_route 202.78.8.0/21 -add china_ip_route 202.79.224.0/21 -add china_ip_route 202.79.248.0/22 -add china_ip_route 202.80.192.0/20 -add china_ip_route 202.81.0.0/22 -add china_ip_route 202.81.176.0/20 -add china_ip_route 202.83.252.0/22 -add china_ip_route 202.84.0.0/20 -add china_ip_route 202.84.16.0/23 -add china_ip_route 202.84.22.0/24 -add china_ip_route 202.84.24.0/21 -add china_ip_route 202.85.208.0/20 -add china_ip_route 202.86.249.0/24 -add china_ip_route 202.87.80.0/20 -add china_ip_route 202.88.32.0/22 -add china_ip_route 202.89.8.0/21 -add china_ip_route 202.89.96.0/22 -add china_ip_route 202.89.108.0/22 -add china_ip_route 202.89.119.0/24 -add china_ip_route 202.89.232.0/21 -add china_ip_route 202.90.0.0/22 -add china_ip_route 202.90.16.0/20 -add china_ip_route 202.90.37.0/24 -add china_ip_route 202.90.96.0/19 -add china_ip_route 202.90.193.0/24 -add china_ip_route 202.90.196.0/24 -add china_ip_route 202.90.205.0/24 -add china_ip_route 202.90.224.0/20 -add china_ip_route 202.91.0.0/22 -add china_ip_route 202.91.96.0/20 -add china_ip_route 202.91.128.0/22 -add china_ip_route 202.91.176.0/20 -add china_ip_route 202.91.224.0/19 -add china_ip_route 202.92.0.0/22 -add china_ip_route 202.92.8.0/21 -add china_ip_route 202.92.48.0/20 -add china_ip_route 202.92.252.0/22 -add china_ip_route 202.93.0.0/22 -add china_ip_route 202.93.252.0/22 -add china_ip_route 202.94.0.0/19 -add china_ip_route 202.94.74.0/24 -add china_ip_route 202.94.81.0/24 -add china_ip_route 202.94.92.0/22 -add china_ip_route 202.95.240.0/21 -add china_ip_route 202.95.252.0/22 -add china_ip_route 202.96.0.0/12 -add china_ip_route 202.112.0.0/13 -add china_ip_route 202.120.0.0/15 -add china_ip_route 202.122.0.0/21 -add china_ip_route 202.122.32.0/21 -add china_ip_route 202.122.64.0/19 -add china_ip_route 202.122.112.0/20 -add china_ip_route 202.122.128.0/24 -add china_ip_route 202.122.132.0/24 -add china_ip_route 202.123.96.0/20 -add china_ip_route 202.123.116.0/22 -add china_ip_route 202.123.120.0/22 -add china_ip_route 202.124.16.0/21 -add china_ip_route 202.124.24.0/22 -add china_ip_route 202.125.107.0/24 -add china_ip_route 202.125.109.0/24 -add china_ip_route 202.125.112.0/20 -add china_ip_route 202.125.176.0/20 -add china_ip_route 202.127.0.0/21 -add china_ip_route 202.127.12.0/22 -add china_ip_route 202.127.16.0/20 -add china_ip_route 202.127.40.0/21 -add china_ip_route 202.127.48.0/20 -add china_ip_route 202.127.112.0/20 -add china_ip_route 202.127.128.0/19 -add china_ip_route 202.127.160.0/21 -add china_ip_route 202.127.192.0/20 -add china_ip_route 202.127.208.0/23 -add china_ip_route 202.127.212.0/22 -add china_ip_route 202.127.216.0/21 -add china_ip_route 202.127.224.0/19 -add china_ip_route 202.129.208.0/24 -add china_ip_route 202.130.0.0/19 -add china_ip_route 202.130.39.0/24 -add china_ip_route 202.130.224.0/19 -add china_ip_route 202.131.16.0/21 -add china_ip_route 202.131.59.0/24 -add china_ip_route 202.131.208.0/20 -add china_ip_route 202.133.32.0/20 -add china_ip_route 202.134.58.0/24 -add china_ip_route 202.134.128.0/20 -add china_ip_route 202.134.208.0/20 -add china_ip_route 202.136.48.0/20 -add china_ip_route 202.136.208.0/20 -add china_ip_route 202.136.224.0/20 -add china_ip_route 202.136.248.0/22 -add china_ip_route 202.136.254.0/23 -add china_ip_route 202.137.231.0/24 -add china_ip_route 202.140.140.0/22 -add china_ip_route 202.140.144.0/20 -add china_ip_route 202.141.160.0/19 -add china_ip_route 202.142.16.0/20 -add china_ip_route 202.143.4.0/22 -add china_ip_route 202.143.16.0/20 -add china_ip_route 202.143.32.0/20 -add china_ip_route 202.143.56.0/21 -add china_ip_route 202.143.100.0/22 -add china_ip_route 202.143.104.0/22 -add china_ip_route 202.146.160.0/20 -add china_ip_route 202.146.186.0/24 -add china_ip_route 202.146.188.0/22 -add china_ip_route 202.146.196.0/22 -add china_ip_route 202.146.200.0/21 -add china_ip_route 202.147.12.0/26 -add china_ip_route 202.147.12.64/27 -add china_ip_route 202.147.12.96/28 -add china_ip_route 202.147.12.128/29 -add china_ip_route 202.147.12.136/30 -add china_ip_route 202.147.12.140/31 -add china_ip_route 202.147.12.142/32 -add china_ip_route 202.147.12.144/28 -add china_ip_route 202.147.12.160/27 -add china_ip_route 202.147.12.192/26 -add china_ip_route 202.147.144.0/20 -add china_ip_route 202.148.32.0/20 -add china_ip_route 202.148.64.0/18 -add china_ip_route 202.149.32.0/19 -add china_ip_route 202.149.160.0/19 -add china_ip_route 202.149.224.0/19 -add china_ip_route 202.150.16.0/20 -add china_ip_route 202.150.32.0/20 -add china_ip_route 202.150.56.0/22 -add china_ip_route 202.150.192.0/20 -add china_ip_route 202.150.224.0/19 -add china_ip_route 202.151.0.0/22 -add china_ip_route 202.151.128.0/19 -add china_ip_route 202.152.176.0/20 -add china_ip_route 202.153.0.0/22 -add china_ip_route 202.153.7.0/24 -add china_ip_route 202.153.48.0/20 -add china_ip_route 202.157.192.0/19 -add china_ip_route 202.158.160.0/19 -add china_ip_route 202.158.242.0/24 -add china_ip_route 202.160.156.0/22 -add china_ip_route 202.160.176.0/20 -add china_ip_route 202.162.67.0/24 -add china_ip_route 202.162.75.0/24 -add china_ip_route 202.164.0.0/20 -add china_ip_route 202.164.96.0/19 -add china_ip_route 202.165.176.0/20 -add china_ip_route 202.165.208.0/20 -add china_ip_route 202.165.239.0/24 -add china_ip_route 202.165.240.0/23 -add china_ip_route 202.165.243.0/24 -add china_ip_route 202.165.245.0/24 -add china_ip_route 202.165.251.0/24 -add china_ip_route 202.165.252.0/22 -add china_ip_route 202.166.224.0/19 -add china_ip_route 202.168.80.0/22 -add china_ip_route 202.168.128.0/20 -add china_ip_route 202.168.160.0/19 -add china_ip_route 202.170.128.0/19 -add china_ip_route 202.170.216.0/21 -add china_ip_route 202.170.224.0/19 -add china_ip_route 202.171.216.0/21 -add china_ip_route 202.171.232.0/24 -add china_ip_route 202.171.235.0/24 -add china_ip_route 202.172.0.0/22 -add china_ip_route 202.172.7.0/24 -add china_ip_route 202.173.0.0/22 -add china_ip_route 202.173.6.0/24 -add china_ip_route 202.173.8.0/21 -add china_ip_route 202.173.112.0/22 -add china_ip_route 202.173.224.0/19 -add china_ip_route 202.174.64.0/20 -add china_ip_route 202.174.124.0/22 -add china_ip_route 202.176.224.0/19 -add china_ip_route 202.179.160.0/20 -add china_ip_route 202.179.240.0/20 -add china_ip_route 202.180.128.0/19 -add china_ip_route 202.180.208.0/21 -add china_ip_route 202.181.8.0/22 -add china_ip_route 202.181.28.0/22 -add china_ip_route 202.181.112.0/20 -add china_ip_route 202.182.32.0/20 -add china_ip_route 202.182.192.0/19 -add china_ip_route 202.189.0.0/18 -add china_ip_route 202.189.80.0/20 -add china_ip_route 202.189.184.0/21 -add china_ip_route 202.191.0.0/24 -add china_ip_route 202.191.68.0/22 -add china_ip_route 202.191.72.0/21 -add china_ip_route 202.191.80.0/20 -add china_ip_route 202.192.0.0/12 -add china_ip_route 203.0.4.0/22 -add china_ip_route 203.0.10.0/23 -add china_ip_route 203.0.18.0/24 -add china_ip_route 203.0.24.0/24 -add china_ip_route 203.0.42.0/23 -add china_ip_route 203.0.45.0/24 -add china_ip_route 203.0.46.0/23 -add china_ip_route 203.0.81.0/24 -add china_ip_route 203.0.82.0/23 -add china_ip_route 203.0.90.0/23 -add china_ip_route 203.0.96.0/23 -add china_ip_route 203.0.104.0/21 -add china_ip_route 203.0.114.0/23 -add china_ip_route 203.0.122.0/24 -add china_ip_route 203.0.128.0/24 -add china_ip_route 203.0.130.0/23 -add china_ip_route 203.0.132.0/22 -add china_ip_route 203.0.137.0/24 -add china_ip_route 203.0.142.0/24 -add china_ip_route 203.0.144.0/24 -add china_ip_route 203.0.146.0/24 -add china_ip_route 203.0.148.0/24 -add china_ip_route 203.0.150.0/23 -add china_ip_route 203.0.152.0/24 -add china_ip_route 203.0.177.0/24 -add china_ip_route 203.0.224.0/24 -add china_ip_route 203.1.4.0/22 -add china_ip_route 203.1.18.0/24 -add china_ip_route 203.1.26.0/23 -add china_ip_route 203.1.65.0/24 -add china_ip_route 203.1.66.0/23 -add china_ip_route 203.1.70.0/23 -add china_ip_route 203.1.76.0/23 -add china_ip_route 203.1.90.0/24 -add china_ip_route 203.1.97.0/24 -add china_ip_route 203.1.98.0/23 -add china_ip_route 203.1.100.0/22 -add china_ip_route 203.1.108.0/24 -add china_ip_route 203.1.253.0/24 -add china_ip_route 203.1.254.0/24 -add china_ip_route 203.2.64.0/21 -add china_ip_route 203.2.73.0/24 -add china_ip_route 203.2.112.0/21 -add china_ip_route 203.2.126.0/23 -add china_ip_route 203.2.140.0/24 -add china_ip_route 203.2.150.0/24 -add china_ip_route 203.2.152.0/22 -add china_ip_route 203.2.156.0/23 -add china_ip_route 203.2.160.0/21 -add china_ip_route 203.2.180.0/23 -add china_ip_route 203.2.196.0/23 -add china_ip_route 203.2.209.0/24 -add china_ip_route 203.2.214.0/23 -add china_ip_route 203.2.226.0/23 -add china_ip_route 203.2.229.0/24 -add china_ip_route 203.2.236.0/23 -add china_ip_route 203.3.68.0/24 -add china_ip_route 203.3.72.0/23 -add china_ip_route 203.3.75.0/24 -add china_ip_route 203.3.80.0/21 -add china_ip_route 203.3.96.0/22 -add china_ip_route 203.3.105.0/24 -add china_ip_route 203.3.112.0/21 -add china_ip_route 203.3.120.0/24 -add china_ip_route 203.3.123.0/24 -add china_ip_route 203.3.135.0/24 -add china_ip_route 203.3.139.0/24 -add china_ip_route 203.3.143.0/24 -add china_ip_route 203.4.132.0/23 -add china_ip_route 203.4.134.0/24 -add china_ip_route 203.4.151.0/24 -add china_ip_route 203.4.152.0/22 -add china_ip_route 203.4.174.0/23 -add china_ip_route 203.4.180.0/24 -add china_ip_route 203.4.186.0/24 -add china_ip_route 203.4.205.0/24 -add china_ip_route 203.4.208.0/22 -add china_ip_route 203.4.227.0/24 -add china_ip_route 203.4.230.0/23 -add china_ip_route 203.5.4.0/23 -add china_ip_route 203.5.7.0/24 -add china_ip_route 203.5.8.0/23 -add china_ip_route 203.5.11.0/24 -add china_ip_route 203.5.21.0/24 -add china_ip_route 203.5.22.0/24 -add china_ip_route 203.5.44.0/24 -add china_ip_route 203.5.46.0/23 -add china_ip_route 203.5.52.0/22 -add china_ip_route 203.5.56.0/23 -add china_ip_route 203.5.60.0/23 -add china_ip_route 203.5.114.0/23 -add china_ip_route 203.5.118.0/24 -add china_ip_route 203.5.120.0/24 -add china_ip_route 203.5.172.0/24 -add china_ip_route 203.5.180.0/23 -add china_ip_route 203.5.182.0/24 -add china_ip_route 203.5.185.0/24 -add china_ip_route 203.5.186.0/24 -add china_ip_route 203.5.188.0/23 -add china_ip_route 203.5.190.0/24 -add china_ip_route 203.5.195.0/24 -add china_ip_route 203.5.214.0/23 -add china_ip_route 203.5.218.0/23 -add china_ip_route 203.6.131.0/24 -add china_ip_route 203.6.136.0/24 -add china_ip_route 203.6.138.0/23 -add china_ip_route 203.6.142.0/24 -add china_ip_route 203.6.150.0/23 -add china_ip_route 203.6.157.0/24 -add china_ip_route 203.6.159.0/24 -add china_ip_route 203.6.224.0/20 -add china_ip_route 203.6.248.0/23 -add china_ip_route 203.7.129.0/24 -add china_ip_route 203.7.138.0/23 -add china_ip_route 203.7.147.0/24 -add china_ip_route 203.7.150.0/23 -add china_ip_route 203.7.158.0/24 -add china_ip_route 203.7.192.0/23 -add china_ip_route 203.7.200.0/24 -add china_ip_route 203.8.0.0/24 -add china_ip_route 203.8.8.0/24 -add china_ip_route 203.8.23.0/24 -add china_ip_route 203.8.70.0/24 -add china_ip_route 203.8.82.0/24 -add china_ip_route 203.8.86.0/23 -add china_ip_route 203.8.91.0/24 -add china_ip_route 203.8.110.0/23 -add china_ip_route 203.8.115.0/24 -add china_ip_route 203.8.166.0/23 -add china_ip_route 203.8.169.0/24 -add china_ip_route 203.8.173.0/24 -add china_ip_route 203.8.184.0/24 -add china_ip_route 203.8.186.0/23 -add china_ip_route 203.8.190.0/23 -add china_ip_route 203.8.192.0/24 -add china_ip_route 203.8.197.0/24 -add china_ip_route 203.8.198.0/23 -add china_ip_route 203.8.203.0/24 -add china_ip_route 203.8.209.0/24 -add china_ip_route 203.8.210.0/23 -add china_ip_route 203.8.212.0/22 -add china_ip_route 203.8.217.0/24 -add china_ip_route 203.8.220.0/24 -add china_ip_route 203.9.32.0/24 -add china_ip_route 203.9.36.0/23 -add china_ip_route 203.9.57.0/24 -add china_ip_route 203.9.63.0/24 -add china_ip_route 203.9.65.0/24 -add china_ip_route 203.9.70.0/23 -add china_ip_route 203.9.72.0/24 -add china_ip_route 203.9.75.0/24 -add china_ip_route 203.9.76.0/23 -add china_ip_route 203.9.96.0/22 -add china_ip_route 203.9.100.0/23 -add china_ip_route 203.9.108.0/24 -add china_ip_route 203.9.158.0/24 -add china_ip_route 203.10.34.0/24 -add china_ip_route 203.10.56.0/24 -add china_ip_route 203.10.74.0/23 -add china_ip_route 203.10.84.0/22 -add china_ip_route 203.10.88.0/24 -add china_ip_route 203.10.95.0/24 -add china_ip_route 203.10.125.0/24 -add china_ip_route 203.11.70.0/24 -add china_ip_route 203.11.76.0/22 -add china_ip_route 203.11.82.0/24 -add china_ip_route 203.11.84.0/22 -add china_ip_route 203.11.100.0/22 -add china_ip_route 203.11.109.0/24 -add china_ip_route 203.11.117.0/24 -add china_ip_route 203.11.122.0/24 -add china_ip_route 203.11.126.0/24 -add china_ip_route 203.11.136.0/22 -add china_ip_route 203.11.141.0/24 -add china_ip_route 203.11.142.0/23 -add china_ip_route 203.11.180.0/22 -add china_ip_route 203.11.208.0/22 -add china_ip_route 203.12.16.0/24 -add china_ip_route 203.12.19.0/24 -add china_ip_route 203.12.24.0/24 -add china_ip_route 203.12.57.0/24 -add china_ip_route 203.12.65.0/24 -add china_ip_route 203.12.66.0/24 -add china_ip_route 203.12.70.0/23 -add china_ip_route 203.12.87.0/24 -add china_ip_route 203.12.100.0/23 -add china_ip_route 203.12.103.0/24 -add china_ip_route 203.12.114.0/24 -add china_ip_route 203.12.118.0/24 -add china_ip_route 203.12.130.0/24 -add china_ip_route 203.12.137.0/24 -add china_ip_route 203.12.196.0/22 -add china_ip_route 203.12.211.0/24 -add china_ip_route 203.12.219.0/24 -add china_ip_route 203.12.226.0/24 -add china_ip_route 203.12.240.0/22 -add china_ip_route 203.13.18.0/24 -add china_ip_route 203.13.24.0/24 -add china_ip_route 203.13.44.0/23 -add china_ip_route 203.13.88.0/23 -add china_ip_route 203.13.92.0/22 -add china_ip_route 203.13.173.0/24 -add china_ip_route 203.13.224.0/23 -add china_ip_route 203.13.227.0/24 -add china_ip_route 203.13.233.0/24 -add china_ip_route 203.14.24.0/22 -add china_ip_route 203.14.33.0/24 -add china_ip_route 203.14.56.0/24 -add china_ip_route 203.14.61.0/24 -add china_ip_route 203.14.62.0/24 -add china_ip_route 203.14.104.0/24 -add china_ip_route 203.14.114.0/23 -add china_ip_route 203.14.118.0/24 -add china_ip_route 203.14.162.0/24 -add china_ip_route 203.14.184.0/21 -add china_ip_route 203.14.192.0/24 -add china_ip_route 203.14.194.0/23 -add china_ip_route 203.14.214.0/24 -add china_ip_route 203.14.231.0/24 -add china_ip_route 203.14.246.0/24 -add china_ip_route 203.15.0.0/20 -add china_ip_route 203.15.20.0/23 -add china_ip_route 203.15.22.0/24 -add china_ip_route 203.15.87.0/24 -add china_ip_route 203.15.88.0/23 -add china_ip_route 203.15.105.0/24 -add china_ip_route 203.15.112.0/21 -add china_ip_route 203.15.130.0/23 -add china_ip_route 203.15.149.0/24 -add china_ip_route 203.15.151.0/24 -add china_ip_route 203.15.156.0/22 -add china_ip_route 203.15.174.0/24 -add china_ip_route 203.15.227.0/24 -add china_ip_route 203.15.232.0/22 -add china_ip_route 203.15.238.0/23 -add china_ip_route 203.15.240.0/23 -add china_ip_route 203.15.246.0/24 -add china_ip_route 203.16.10.0/24 -add china_ip_route 203.16.12.0/23 -add china_ip_route 203.16.16.0/21 -add china_ip_route 203.16.27.0/24 -add china_ip_route 203.16.38.0/24 -add china_ip_route 203.16.49.0/24 -add china_ip_route 203.16.50.0/23 -add china_ip_route 203.16.58.0/24 -add china_ip_route 203.16.63.0/24 -add china_ip_route 203.16.133.0/24 -add china_ip_route 203.16.161.0/24 -add china_ip_route 203.16.162.0/24 -add china_ip_route 203.16.186.0/23 -add china_ip_route 203.16.228.0/24 -add china_ip_route 203.16.238.0/24 -add china_ip_route 203.16.240.0/24 -add china_ip_route 203.16.245.0/24 -add china_ip_route 203.17.2.0/24 -add china_ip_route 203.17.18.0/24 -add china_ip_route 203.17.28.0/24 -add china_ip_route 203.17.39.0/24 -add china_ip_route 203.17.56.0/24 -add china_ip_route 203.17.74.0/23 -add china_ip_route 203.17.88.0/23 -add china_ip_route 203.17.136.0/24 -add china_ip_route 203.17.164.0/24 -add china_ip_route 203.17.187.0/24 -add china_ip_route 203.17.190.0/23 -add china_ip_route 203.17.231.0/24 -add china_ip_route 203.17.233.0/24 -add china_ip_route 203.17.248.0/23 -add china_ip_route 203.17.255.0/24 -add china_ip_route 203.18.2.0/23 -add china_ip_route 203.18.4.0/24 -add china_ip_route 203.18.7.0/24 -add china_ip_route 203.18.31.0/24 -add china_ip_route 203.18.37.0/24 -add china_ip_route 203.18.48.0/23 -add china_ip_route 203.18.52.0/24 -add china_ip_route 203.18.72.0/22 -add china_ip_route 203.18.80.0/23 -add china_ip_route 203.18.87.0/24 -add china_ip_route 203.18.100.0/23 -add china_ip_route 203.18.105.0/24 -add china_ip_route 203.18.107.0/24 -add china_ip_route 203.18.110.0/24 -add china_ip_route 203.18.129.0/24 -add china_ip_route 203.18.131.0/24 -add china_ip_route 203.18.132.0/23 -add china_ip_route 203.18.144.0/24 -add china_ip_route 203.18.153.0/24 -add china_ip_route 203.18.199.0/24 -add china_ip_route 203.18.208.0/24 -add china_ip_route 203.18.211.0/24 -add china_ip_route 203.18.215.0/24 -add china_ip_route 203.19.1.0/24 -add china_ip_route 203.19.18.0/24 -add china_ip_route 203.19.24.0/24 -add china_ip_route 203.19.30.0/24 -add china_ip_route 203.19.41.0/24 -add china_ip_route 203.19.44.0/23 -add china_ip_route 203.19.46.0/24 -add china_ip_route 203.19.58.0/24 -add china_ip_route 203.19.60.0/23 -add china_ip_route 203.19.64.0/24 -add china_ip_route 203.19.68.0/24 -add china_ip_route 203.19.72.0/24 -add china_ip_route 203.19.101.0/24 -add china_ip_route 203.19.111.0/24 -add china_ip_route 203.19.131.0/24 -add china_ip_route 203.19.133.0/24 -add china_ip_route 203.19.144.0/24 -add china_ip_route 203.19.147.0/24 -add china_ip_route 203.19.149.0/24 -add china_ip_route 203.19.156.0/24 -add china_ip_route 203.19.176.0/24 -add china_ip_route 203.19.178.0/23 -add china_ip_route 203.19.208.0/24 -add china_ip_route 203.19.228.0/22 -add china_ip_route 203.19.233.0/24 -add china_ip_route 203.19.242.0/24 -add china_ip_route 203.19.248.0/23 -add china_ip_route 203.19.255.0/24 -add china_ip_route 203.20.17.0/24 -add china_ip_route 203.20.40.0/23 -add china_ip_route 203.20.44.0/24 -add china_ip_route 203.20.48.0/24 -add china_ip_route 203.20.61.0/24 -add china_ip_route 203.20.65.0/24 -add china_ip_route 203.20.84.0/23 -add china_ip_route 203.20.89.0/24 -add china_ip_route 203.20.106.0/23 -add china_ip_route 203.20.115.0/24 -add china_ip_route 203.20.117.0/24 -add china_ip_route 203.20.118.0/23 -add china_ip_route 203.20.122.0/24 -add china_ip_route 203.20.126.0/23 -add china_ip_route 203.20.135.0/24 -add china_ip_route 203.20.140.0/22 -add china_ip_route 203.20.150.0/24 -add china_ip_route 203.20.230.0/24 -add china_ip_route 203.20.232.0/24 -add china_ip_route 203.20.236.0/24 -add china_ip_route 203.21.0.0/23 -add china_ip_route 203.21.2.0/24 -add china_ip_route 203.21.8.0/24 -add china_ip_route 203.21.10.0/24 -add china_ip_route 203.21.18.0/24 -add china_ip_route 203.21.33.0/24 -add china_ip_route 203.21.34.0/24 -add china_ip_route 203.21.41.0/24 -add china_ip_route 203.21.44.0/24 -add china_ip_route 203.21.68.0/24 -add china_ip_route 203.21.82.0/24 -add china_ip_route 203.21.96.0/22 -add china_ip_route 203.21.124.0/24 -add china_ip_route 203.21.136.0/23 -add china_ip_route 203.21.145.0/24 -add china_ip_route 203.21.206.0/24 -add china_ip_route 203.22.24.0/24 -add china_ip_route 203.22.28.0/23 -add china_ip_route 203.22.31.0/24 -add china_ip_route 203.22.68.0/24 -add china_ip_route 203.22.76.0/24 -add china_ip_route 203.22.84.0/24 -add china_ip_route 203.22.87.0/24 -add china_ip_route 203.22.92.0/22 -add china_ip_route 203.22.99.0/24 -add china_ip_route 203.22.106.0/24 -add china_ip_route 203.22.122.0/23 -add china_ip_route 203.22.131.0/24 -add china_ip_route 203.22.163.0/24 -add china_ip_route 203.22.166.0/24 -add china_ip_route 203.22.170.0/24 -add china_ip_route 203.22.176.0/22 -add china_ip_route 203.22.180.0/23 -add china_ip_route 203.22.182.0/30 -add china_ip_route 203.22.182.6/31 -add china_ip_route 203.22.182.8/29 -add china_ip_route 203.22.182.18/31 -add china_ip_route 203.22.182.20/30 -add china_ip_route 203.22.182.24/29 -add china_ip_route 203.22.182.32/27 -add china_ip_route 203.22.182.64/26 -add china_ip_route 203.22.182.128/25 -add china_ip_route 203.22.183.0/24 -add china_ip_route 203.22.194.0/24 -add china_ip_route 203.22.242.0/23 -add china_ip_route 203.22.245.0/24 -add china_ip_route 203.22.246.0/24 -add china_ip_route 203.22.252.0/23 -add china_ip_route 203.23.0.0/24 -add china_ip_route 203.23.47.0/24 -add china_ip_route 203.23.61.0/24 -add china_ip_route 203.23.62.0/23 -add china_ip_route 203.23.73.0/24 -add china_ip_route 203.23.85.0/24 -add china_ip_route 203.23.92.0/22 -add china_ip_route 203.23.98.0/24 -add china_ip_route 203.23.107.0/24 -add china_ip_route 203.23.112.0/24 -add china_ip_route 203.23.130.0/24 -add china_ip_route 203.23.140.0/23 -add china_ip_route 203.23.172.0/24 -add china_ip_route 203.23.182.0/24 -add china_ip_route 203.23.186.0/23 -add china_ip_route 203.23.192.0/24 -add china_ip_route 203.23.197.0/24 -add china_ip_route 203.23.198.0/24 -add china_ip_route 203.23.204.0/22 -add china_ip_route 203.23.224.0/24 -add china_ip_route 203.23.226.0/23 -add china_ip_route 203.23.228.0/22 -add china_ip_route 203.23.249.0/24 -add china_ip_route 203.23.251.0/24 -add china_ip_route 203.24.13.0/24 -add china_ip_route 203.24.18.0/24 -add china_ip_route 203.24.27.0/24 -add china_ip_route 203.24.43.0/24 -add china_ip_route 203.24.56.0/24 -add china_ip_route 203.24.58.0/24 -add china_ip_route 203.24.67.0/24 -add china_ip_route 203.24.74.0/24 -add china_ip_route 203.24.79.0/24 -add china_ip_route 203.24.80.0/23 -add china_ip_route 203.24.84.0/23 -add china_ip_route 203.24.86.0/24 -add china_ip_route 203.24.90.0/24 -add china_ip_route 203.24.111.0/24 -add china_ip_route 203.24.112.0/24 -add china_ip_route 203.24.116.0/24 -add china_ip_route 203.24.122.0/23 -add china_ip_route 203.24.145.0/24 -add china_ip_route 203.24.152.0/23 -add china_ip_route 203.24.157.0/24 -add china_ip_route 203.24.161.0/24 -add china_ip_route 203.24.167.0/24 -add china_ip_route 203.24.186.0/23 -add china_ip_route 203.24.199.0/24 -add china_ip_route 203.24.202.0/24 -add china_ip_route 203.24.212.0/23 -add china_ip_route 203.24.217.0/24 -add china_ip_route 203.24.219.0/24 -add china_ip_route 203.24.244.0/24 -add china_ip_route 203.25.19.0/24 -add china_ip_route 203.25.20.0/23 -add china_ip_route 203.25.46.0/24 -add china_ip_route 203.25.64.0/23 -add china_ip_route 203.25.91.0/24 -add china_ip_route 203.25.99.0/24 -add china_ip_route 203.25.100.0/24 -add china_ip_route 203.25.106.0/24 -add china_ip_route 203.25.131.0/24 -add china_ip_route 203.25.135.0/24 -add china_ip_route 203.25.138.0/24 -add china_ip_route 203.25.147.0/24 -add china_ip_route 203.25.153.0/24 -add china_ip_route 203.25.154.0/23 -add china_ip_route 203.25.164.0/24 -add china_ip_route 203.25.166.0/24 -add china_ip_route 203.25.174.0/23 -add china_ip_route 203.25.180.0/24 -add china_ip_route 203.25.182.0/24 -add china_ip_route 203.25.191.0/24 -add china_ip_route 203.25.199.0/24 -add china_ip_route 203.25.200.0/24 -add china_ip_route 203.25.202.0/23 -add china_ip_route 203.25.208.0/20 -add china_ip_route 203.25.229.0/24 -add china_ip_route 203.25.235.0/24 -add china_ip_route 203.25.236.0/24 -add china_ip_route 203.25.242.0/24 -add china_ip_route 203.26.12.0/24 -add china_ip_route 203.26.34.0/24 -add china_ip_route 203.26.49.0/24 -add china_ip_route 203.26.50.0/24 -add china_ip_route 203.26.55.0/24 -add china_ip_route 203.26.56.0/23 -add china_ip_route 203.26.60.0/24 -add china_ip_route 203.26.65.0/24 -add china_ip_route 203.26.68.0/24 -add china_ip_route 203.26.76.0/24 -add china_ip_route 203.26.80.0/24 -add china_ip_route 203.26.84.0/24 -add china_ip_route 203.26.97.0/24 -add china_ip_route 203.26.102.0/23 -add china_ip_route 203.26.115.0/24 -add china_ip_route 203.26.116.0/24 -add china_ip_route 203.26.129.0/24 -add china_ip_route 203.26.143.0/24 -add china_ip_route 203.26.144.0/24 -add china_ip_route 203.26.148.0/23 -add china_ip_route 203.26.154.0/24 -add china_ip_route 203.26.158.0/23 -add china_ip_route 203.26.170.0/24 -add china_ip_route 203.26.173.0/24 -add china_ip_route 203.26.176.0/24 -add china_ip_route 203.26.185.0/24 -add china_ip_route 203.26.202.0/23 -add china_ip_route 203.26.210.0/24 -add china_ip_route 203.26.214.0/24 -add china_ip_route 203.26.222.0/24 -add china_ip_route 203.26.224.0/24 -add china_ip_route 203.26.228.0/24 -add china_ip_route 203.26.232.0/24 -add china_ip_route 203.27.0.0/24 -add china_ip_route 203.27.10.0/24 -add china_ip_route 203.27.15.0/24 -add china_ip_route 203.27.16.0/24 -add china_ip_route 203.27.20.0/24 -add china_ip_route 203.27.22.0/23 -add china_ip_route 203.27.40.0/24 -add china_ip_route 203.27.45.0/24 -add china_ip_route 203.27.53.0/24 -add china_ip_route 203.27.65.0/24 -add china_ip_route 203.27.66.0/24 -add china_ip_route 203.27.81.0/24 -add china_ip_route 203.27.88.0/24 -add china_ip_route 203.27.102.0/24 -add china_ip_route 203.27.109.0/24 -add china_ip_route 203.27.117.0/24 -add china_ip_route 203.27.121.0/24 -add china_ip_route 203.27.122.0/23 -add china_ip_route 203.27.125.0/24 -add china_ip_route 203.27.200.0/24 -add china_ip_route 203.27.202.0/24 -add china_ip_route 203.27.233.0/24 -add china_ip_route 203.27.241.0/24 -add china_ip_route 203.27.250.0/24 -add china_ip_route 203.28.10.0/24 -add china_ip_route 203.28.12.0/24 -add china_ip_route 203.28.33.0/24 -add china_ip_route 203.28.34.0/23 -add china_ip_route 203.28.43.0/24 -add china_ip_route 203.28.44.0/24 -add china_ip_route 203.28.54.0/24 -add china_ip_route 203.28.56.0/24 -add china_ip_route 203.28.73.0/24 -add china_ip_route 203.28.74.0/24 -add china_ip_route 203.28.76.0/24 -add china_ip_route 203.28.86.0/24 -add china_ip_route 203.28.88.0/24 -add china_ip_route 203.28.112.0/24 -add china_ip_route 203.28.131.0/24 -add china_ip_route 203.28.136.0/24 -add china_ip_route 203.28.140.0/24 -add china_ip_route 203.28.145.0/24 -add china_ip_route 203.28.165.0/24 -add china_ip_route 203.28.169.0/24 -add china_ip_route 203.28.170.0/24 -add china_ip_route 203.28.178.0/23 -add china_ip_route 203.28.185.0/24 -add china_ip_route 203.28.187.0/24 -add china_ip_route 203.28.196.0/24 -add china_ip_route 203.28.226.0/23 -add china_ip_route 203.28.239.0/24 -add china_ip_route 203.29.2.0/24 -add china_ip_route 203.29.8.0/23 -add china_ip_route 203.29.13.0/24 -add china_ip_route 203.29.14.0/24 -add china_ip_route 203.29.28.0/24 -add china_ip_route 203.29.46.0/24 -add china_ip_route 203.29.57.0/24 -add china_ip_route 203.29.61.0/24 -add china_ip_route 203.29.63.0/24 -add china_ip_route 203.29.69.0/24 -add china_ip_route 203.29.73.0/24 -add china_ip_route 203.29.81.0/24 -add china_ip_route 203.29.90.0/24 -add china_ip_route 203.29.95.0/24 -add china_ip_route 203.29.100.0/24 -add china_ip_route 203.29.103.0/24 -add china_ip_route 203.29.112.0/24 -add china_ip_route 203.29.120.0/22 -add china_ip_route 203.29.182.0/23 -add china_ip_route 203.29.187.0/24 -add china_ip_route 203.29.189.0/24 -add china_ip_route 203.29.190.0/24 -add china_ip_route 203.29.205.0/24 -add china_ip_route 203.29.210.0/24 -add china_ip_route 203.29.217.0/24 -add china_ip_route 203.29.227.0/24 -add china_ip_route 203.29.231.0/24 -add china_ip_route 203.29.233.0/24 -add china_ip_route 203.29.234.0/24 -add china_ip_route 203.29.248.0/24 -add china_ip_route 203.29.254.0/23 -add china_ip_route 203.30.16.0/23 -add china_ip_route 203.30.25.0/24 -add china_ip_route 203.30.29.0/24 -add china_ip_route 203.30.66.0/24 -add china_ip_route 203.30.81.0/24 -add china_ip_route 203.30.87.0/24 -add china_ip_route 203.30.111.0/24 -add china_ip_route 203.30.121.0/24 -add china_ip_route 203.30.123.0/24 -add china_ip_route 203.30.152.0/24 -add china_ip_route 203.30.156.0/24 -add china_ip_route 203.30.162.0/24 -add china_ip_route 203.30.173.0/24 -add china_ip_route 203.30.175.0/24 -add china_ip_route 203.30.187.0/24 -add china_ip_route 203.30.194.0/24 -add china_ip_route 203.30.217.0/24 -add china_ip_route 203.30.220.0/24 -add china_ip_route 203.30.222.0/24 -add china_ip_route 203.30.232.0/23 -add china_ip_route 203.30.235.0/24 -add china_ip_route 203.30.240.0/23 -add china_ip_route 203.30.246.0/24 -add china_ip_route 203.30.250.0/23 -add china_ip_route 203.31.45.0/24 -add china_ip_route 203.31.46.0/24 -add china_ip_route 203.31.49.0/24 -add china_ip_route 203.31.51.0/24 -add china_ip_route 203.31.54.0/23 -add china_ip_route 203.31.69.0/24 -add china_ip_route 203.31.72.0/24 -add china_ip_route 203.31.80.0/24 -add china_ip_route 203.31.85.0/24 -add china_ip_route 203.31.97.0/24 -add china_ip_route 203.31.105.0/24 -add china_ip_route 203.31.106.0/24 -add china_ip_route 203.31.108.0/23 -add china_ip_route 203.31.124.0/24 -add china_ip_route 203.31.162.0/24 -add china_ip_route 203.31.174.0/24 -add china_ip_route 203.31.177.0/24 -add china_ip_route 203.31.181.0/24 -add china_ip_route 203.31.187.0/24 -add china_ip_route 203.31.189.0/24 -add china_ip_route 203.31.204.0/24 -add china_ip_route 203.31.220.0/24 -add china_ip_route 203.31.222.0/23 -add china_ip_route 203.31.225.0/24 -add china_ip_route 203.31.229.0/24 -add china_ip_route 203.31.248.0/23 -add china_ip_route 203.31.253.0/24 -add china_ip_route 203.32.20.0/24 -add china_ip_route 203.32.48.0/23 -add china_ip_route 203.32.56.0/24 -add china_ip_route 203.32.60.0/24 -add china_ip_route 203.32.62.0/24 -add china_ip_route 203.32.68.0/23 -add china_ip_route 203.32.76.0/24 -add china_ip_route 203.32.81.0/24 -add china_ip_route 203.32.84.0/23 -add china_ip_route 203.32.95.0/24 -add china_ip_route 203.32.102.0/24 -add china_ip_route 203.32.105.0/24 -add china_ip_route 203.32.130.0/24 -add china_ip_route 203.32.133.0/24 -add china_ip_route 203.32.140.0/24 -add china_ip_route 203.32.152.0/24 -add china_ip_route 203.32.186.0/23 -add china_ip_route 203.32.192.0/24 -add china_ip_route 203.32.196.0/24 -add china_ip_route 203.32.203.0/24 -add china_ip_route 203.32.204.0/23 -add china_ip_route 203.32.212.0/24 -add china_ip_route 203.33.4.0/24 -add china_ip_route 203.33.7.0/24 -add china_ip_route 203.33.12.0/23 -add china_ip_route 203.33.21.0/24 -add china_ip_route 203.33.26.0/24 -add china_ip_route 203.33.32.0/24 -add china_ip_route 203.33.63.0/24 -add china_ip_route 203.33.64.0/24 -add china_ip_route 203.33.67.0/24 -add china_ip_route 203.33.68.0/24 -add china_ip_route 203.33.73.0/24 -add china_ip_route 203.33.79.0/24 -add china_ip_route 203.33.100.0/24 -add china_ip_route 203.33.122.0/24 -add china_ip_route 203.33.129.0/24 -add china_ip_route 203.33.131.0/24 -add china_ip_route 203.33.145.0/24 -add china_ip_route 203.33.156.0/24 -add china_ip_route 203.33.158.0/23 -add china_ip_route 203.33.174.0/24 -add china_ip_route 203.33.185.0/24 -add china_ip_route 203.33.200.0/24 -add china_ip_route 203.33.202.0/23 -add china_ip_route 203.33.204.0/24 -add china_ip_route 203.33.206.0/23 -add china_ip_route 203.33.214.0/23 -add china_ip_route 203.33.224.0/23 -add china_ip_route 203.33.226.0/24 -add china_ip_route 203.33.233.0/24 -add china_ip_route 203.33.243.0/24 -add china_ip_route 203.33.250.0/24 -add china_ip_route 203.34.4.0/24 -add china_ip_route 203.34.21.0/24 -add china_ip_route 203.34.27.0/24 -add china_ip_route 203.34.39.0/24 -add china_ip_route 203.34.48.0/23 -add china_ip_route 203.34.54.0/24 -add china_ip_route 203.34.56.0/23 -add china_ip_route 203.34.67.0/24 -add china_ip_route 203.34.69.0/24 -add china_ip_route 203.34.76.0/24 -add china_ip_route 203.34.92.0/24 -add china_ip_route 203.34.106.0/24 -add china_ip_route 203.34.113.0/24 -add china_ip_route 203.34.147.0/24 -add china_ip_route 203.34.150.0/24 -add china_ip_route 203.34.152.0/23 -add china_ip_route 203.34.161.0/24 -add china_ip_route 203.34.162.0/24 -add china_ip_route 203.34.187.0/24 -add china_ip_route 203.34.192.0/22 -add china_ip_route 203.34.197.0/24 -add china_ip_route 203.34.198.0/23 -add china_ip_route 203.34.204.0/22 -add china_ip_route 203.34.232.0/24 -add china_ip_route 203.34.240.0/24 -add china_ip_route 203.34.242.0/24 -add china_ip_route 203.34.245.0/24 -add china_ip_route 203.34.251.0/24 -add china_ip_route 203.55.2.0/23 -add china_ip_route 203.55.4.0/24 -add china_ip_route 203.55.10.0/24 -add china_ip_route 203.55.13.0/24 -add china_ip_route 203.55.22.0/24 -add china_ip_route 203.55.30.0/24 -add china_ip_route 203.55.93.0/24 -add china_ip_route 203.55.101.0/24 -add china_ip_route 203.55.109.0/24 -add china_ip_route 203.55.110.0/24 -add china_ip_route 203.55.116.0/23 -add china_ip_route 203.55.119.0/24 -add china_ip_route 203.55.128.0/23 -add china_ip_route 203.55.146.0/23 -add china_ip_route 203.55.192.0/24 -add china_ip_route 203.55.196.0/24 -add china_ip_route 203.55.218.0/23 -add china_ip_route 203.55.221.0/24 -add china_ip_route 203.55.224.0/24 -add china_ip_route 203.56.1.0/24 -add china_ip_route 203.56.4.0/24 -add china_ip_route 203.56.12.0/24 -add china_ip_route 203.56.24.0/24 -add china_ip_route 203.56.38.0/24 -add china_ip_route 203.56.40.0/24 -add china_ip_route 203.56.46.0/24 -add china_ip_route 203.56.50.0/23 -add china_ip_route 203.56.52.0/22 -add china_ip_route 203.56.68.0/23 -add china_ip_route 203.56.82.0/23 -add china_ip_route 203.56.84.0/23 -add china_ip_route 203.56.95.0/24 -add china_ip_route 203.56.110.0/24 -add china_ip_route 203.56.121.0/24 -add china_ip_route 203.56.161.0/24 -add china_ip_route 203.56.169.0/24 -add china_ip_route 203.56.172.0/23 -add china_ip_route 203.56.175.0/24 -add china_ip_route 203.56.183.0/24 -add china_ip_route 203.56.185.0/24 -add china_ip_route 203.56.187.0/24 -add china_ip_route 203.56.192.0/24 -add china_ip_route 203.56.198.0/24 -add china_ip_route 203.56.201.0/24 -add china_ip_route 203.56.208.0/23 -add china_ip_route 203.56.210.0/24 -add china_ip_route 203.56.214.0/24 -add china_ip_route 203.56.216.0/24 -add china_ip_route 203.56.227.0/24 -add china_ip_route 203.56.228.0/24 -add china_ip_route 203.56.232.0/24 -add china_ip_route 203.56.240.0/24 -add china_ip_route 203.56.252.0/24 -add china_ip_route 203.56.254.0/24 -add china_ip_route 203.57.5.0/24 -add china_ip_route 203.57.6.0/24 -add china_ip_route 203.57.12.0/23 -add china_ip_route 203.57.28.0/24 -add china_ip_route 203.57.39.0/24 -add china_ip_route 203.57.46.0/24 -add china_ip_route 203.57.58.0/24 -add china_ip_route 203.57.61.0/24 -add china_ip_route 203.57.66.0/24 -add china_ip_route 203.57.69.0/24 -add china_ip_route 203.57.70.0/23 -add china_ip_route 203.57.73.0/24 -add china_ip_route 203.57.90.0/24 -add china_ip_route 203.57.101.0/24 -add china_ip_route 203.57.109.0/24 -add china_ip_route 203.57.123.0/24 -add china_ip_route 203.57.157.0/24 -add china_ip_route 203.57.200.0/24 -add china_ip_route 203.57.202.0/24 -add china_ip_route 203.57.206.0/24 -add china_ip_route 203.57.222.0/24 -add china_ip_route 203.57.224.0/20 -add china_ip_route 203.57.246.0/23 -add china_ip_route 203.57.249.0/24 -add china_ip_route 203.57.253.0/24 -add china_ip_route 203.57.254.0/23 -add china_ip_route 203.62.2.0/24 -add china_ip_route 203.62.131.0/24 -add china_ip_route 203.62.139.0/24 -add china_ip_route 203.62.161.0/24 -add china_ip_route 203.62.197.0/24 -add china_ip_route 203.62.228.0/22 -add china_ip_route 203.62.234.0/24 -add china_ip_route 203.62.246.0/24 -add china_ip_route 203.65.240.0/22 -add china_ip_route 203.76.160.0/22 -add china_ip_route 203.76.168.0/22 -add china_ip_route 203.76.208.0/21 -add china_ip_route 203.76.216.0/22 -add china_ip_route 203.76.240.0/22 -add china_ip_route 203.77.180.0/22 -add china_ip_route 203.78.48.0/20 -add china_ip_route 203.78.156.0/22 -add china_ip_route 203.79.0.0/20 -add china_ip_route 203.80.4.0/23 -add china_ip_route 203.80.32.0/20 -add china_ip_route 203.80.57.0/24 -add china_ip_route 203.80.129.0/24 -add china_ip_route 203.80.132.0/22 -add china_ip_route 203.80.140.0/22 -add china_ip_route 203.80.144.0/20 -add china_ip_route 203.81.0.0/21 -add china_ip_route 203.81.16.0/20 -add china_ip_route 203.81.244.0/22 -add china_ip_route 203.82.0.0/23 -add china_ip_route 203.82.16.0/21 -add china_ip_route 203.82.112.0/20 -add china_ip_route 203.82.224.0/20 -add china_ip_route 203.83.0.0/22 -add china_ip_route 203.83.12.0/22 -add china_ip_route 203.83.56.0/21 -add china_ip_route 203.83.224.0/20 -add china_ip_route 203.86.0.0/17 -add china_ip_route 203.86.250.0/24 -add china_ip_route 203.86.254.0/23 -add china_ip_route 203.88.32.0/19 -add china_ip_route 203.88.100.0/22 -add china_ip_route 203.88.192.0/19 -add china_ip_route 203.89.0.0/22 -add china_ip_route 203.89.100.0/22 -add china_ip_route 203.89.136.0/22 -add china_ip_route 203.89.144.0/24 -add china_ip_route 203.90.0.0/22 -add china_ip_route 203.90.8.0/21 -add china_ip_route 203.90.128.0/18 -add china_ip_route 203.90.192.0/19 -add china_ip_route 203.91.32.0/19 -add china_ip_route 203.91.96.0/20 -add china_ip_route 203.91.120.0/21 -add china_ip_route 203.92.0.0/22 -add china_ip_route 203.92.6.0/24 -add china_ip_route 203.92.160.0/19 -add china_ip_route 203.93.0.0/16 -add china_ip_route 203.94.0.0/19 -add china_ip_route 203.95.0.0/21 -add china_ip_route 203.95.96.0/19 -add china_ip_route 203.95.128.0/18 -add china_ip_route 203.95.200.0/21 -add china_ip_route 203.95.208.0/22 -add china_ip_route 203.95.224.0/19 -add china_ip_route 203.99.8.0/21 -add china_ip_route 203.99.16.0/22 -add china_ip_route 203.99.30.0/23 -add china_ip_route 203.99.80.0/20 -add china_ip_route 203.100.32.0/20 -add china_ip_route 203.100.58.0/24 -add china_ip_route 203.100.60.0/24 -add china_ip_route 203.100.63.0/24 -add china_ip_route 203.100.80.0/20 -add china_ip_route 203.100.96.0/19 -add china_ip_route 203.100.192.0/20 -add china_ip_route 203.104.32.0/20 -add china_ip_route 203.105.96.0/19 -add china_ip_route 203.105.128.0/19 -add china_ip_route 203.107.0.0/19 -add china_ip_route 203.107.32.0/20 -add china_ip_route 203.107.52.0/22 -add china_ip_route 203.107.56.0/21 -add china_ip_route 203.107.69.0/24 -add china_ip_route 203.107.70.0/23 -add china_ip_route 203.107.72.0/21 -add china_ip_route 203.107.80.0/20 -add china_ip_route 203.107.96.0/19 -add china_ip_route 203.110.160.0/19 -add china_ip_route 203.110.208.0/20 -add china_ip_route 203.110.232.0/23 -add china_ip_route 203.110.234.0/24 -add china_ip_route 203.114.80.0/20 -add china_ip_route 203.114.244.0/22 -add china_ip_route 203.118.192.0/19 -add china_ip_route 203.118.241.0/24 -add china_ip_route 203.118.248.0/22 -add china_ip_route 203.119.24.0/22 -add china_ip_route 203.119.28.0/23 -add china_ip_route 203.119.30.0/24 -add china_ip_route 203.119.32.0/24 -add china_ip_route 203.119.34.0/23 -add china_ip_route 203.119.80.0/22 -add china_ip_route 203.119.85.0/24 -add china_ip_route 203.119.113.0/24 -add china_ip_route 203.119.114.0/23 -add china_ip_route 203.119.116.0/22 -add china_ip_route 203.119.128.0/17 -add china_ip_route 203.123.58.0/24 -add china_ip_route 203.128.32.0/19 -add china_ip_route 203.128.96.0/19 -add china_ip_route 203.128.128.0/24 -add china_ip_route 203.128.225.0/24 -add china_ip_route 203.128.226.0/23 -add china_ip_route 203.128.228.0/22 -add china_ip_route 203.130.32.0/20 -add china_ip_route 203.130.49.0/24 -add china_ip_route 203.130.51.0/24 -add china_ip_route 203.130.53.0/24 -add china_ip_route 203.130.54.0/23 -add china_ip_route 203.130.56.0/22 -add china_ip_route 203.130.60.0/23 -add china_ip_route 203.132.32.0/19 -add china_ip_route 203.134.240.0/22 -add china_ip_route 203.134.246.0/23 -add china_ip_route 203.135.96.0/19 -add china_ip_route 203.135.160.0/20 -add china_ip_route 203.142.12.0/23 -add china_ip_route 203.142.219.0/24 -add china_ip_route 203.142.224.0/19 -add china_ip_route 203.144.96.0/19 -add china_ip_route 203.145.0.0/19 -add china_ip_route 203.148.0.0/18 -add china_ip_route 203.148.64.0/20 -add china_ip_route 203.148.80.0/22 -add china_ip_route 203.148.86.0/23 -add china_ip_route 203.149.92.0/22 -add china_ip_route 203.152.64.0/19 -add china_ip_route 203.152.128.0/19 -add china_ip_route 203.153.0.0/22 -add china_ip_route 203.156.192.0/18 -add china_ip_route 203.158.16.0/21 -add china_ip_route 203.160.129.0/24 -add china_ip_route 203.160.192.0/19 -add china_ip_route 203.161.0.0/22 -add china_ip_route 203.161.180.0/24 -add china_ip_route 203.161.183.0/24 -add china_ip_route 203.161.192.0/19 -add china_ip_route 203.166.160.0/19 -add china_ip_route 203.167.28.0/22 -add china_ip_route 203.168.0.0/19 -add china_ip_route 203.170.58.0/23 -add china_ip_route 203.171.0.0/22 -add china_ip_route 203.171.208.0/24 -add china_ip_route 203.171.224.0/20 -add china_ip_route 203.174.4.0/24 -add china_ip_route 203.174.6.0/24 -add china_ip_route 203.174.96.0/20 -add china_ip_route 203.175.128.0/19 -add china_ip_route 203.175.192.0/18 -add china_ip_route 203.176.0.0/18 -add china_ip_route 203.176.64.0/19 -add china_ip_route 203.176.168.0/21 -add china_ip_route 203.184.80.0/20 -add china_ip_route 203.187.160.0/19 -add china_ip_route 203.189.0.0/23 -add china_ip_route 203.189.6.0/23 -add china_ip_route 203.189.112.0/22 -add china_ip_route 203.189.192.0/19 -add china_ip_route 203.189.240.0/22 -add china_ip_route 203.190.96.0/20 -add china_ip_route 203.190.249.0/24 -add china_ip_route 203.191.0.0/23 -add china_ip_route 203.191.2.0/24 -add china_ip_route 203.191.5.0/24 -add china_ip_route 203.191.7.0/24 -add china_ip_route 203.191.29.0/24 -add china_ip_route 203.191.31.0/24 -add china_ip_route 203.191.64.0/18 -add china_ip_route 203.191.133.0/24 -add china_ip_route 203.191.144.0/20 -add china_ip_route 203.192.0.0/19 -add china_ip_route 203.193.224.0/19 -add china_ip_route 203.195.64.0/19 -add china_ip_route 203.195.128.0/17 -add china_ip_route 203.196.0.0/21 -add china_ip_route 203.196.12.0/22 -add china_ip_route 203.196.28.0/22 -add china_ip_route 203.201.181.0/24 -add china_ip_route 203.201.182.0/24 -add china_ip_route 203.202.236.0/22 -add china_ip_route 203.205.64.0/19 -add china_ip_route 203.207.64.0/18 -add china_ip_route 203.207.128.0/17 -add china_ip_route 203.208.0.0/20 -add china_ip_route 203.208.16.0/22 -add china_ip_route 203.208.32.0/19 -add china_ip_route 203.209.224.0/19 -add china_ip_route 203.212.0.0/20 -add china_ip_route 203.212.80.0/20 -add china_ip_route 203.217.164.0/22 -add china_ip_route 203.223.0.0/20 -add china_ip_route 204.55.160.0/24 -add china_ip_route 204.74.96.0/24 -add china_ip_route 204.114.176.0/23 -add china_ip_route 207.89.20.0/24 -add china_ip_route 210.2.0.0/23 -add china_ip_route 210.2.2.0/24 -add china_ip_route 210.2.5.0/24 -add china_ip_route 210.2.6.0/23 -add china_ip_route 210.2.8.0/21 -add china_ip_route 210.2.24.0/21 -add china_ip_route 210.5.0.0/19 -add china_ip_route 210.5.60.0/24 -add china_ip_route 210.5.128.0/19 -add china_ip_route 210.7.56.0/21 -add china_ip_route 210.12.0.0/15 -add china_ip_route 210.14.64.0/19 -add china_ip_route 210.14.112.0/20 -add china_ip_route 210.14.128.0/17 -add china_ip_route 210.15.0.0/17 -add china_ip_route 210.15.128.0/18 -add china_ip_route 210.16.128.0/21 -add china_ip_route 210.16.136.0/22 -add china_ip_route 210.16.156.0/22 -add china_ip_route 210.16.160.0/19 -add china_ip_route 210.21.0.0/16 -add china_ip_route 210.22.0.0/16 -add china_ip_route 210.23.32.0/19 -add china_ip_route 210.25.0.0/16 -add china_ip_route 210.26.0.0/15 -add china_ip_route 210.28.0.0/14 -add china_ip_route 210.32.0.0/12 -add china_ip_route 210.51.0.0/16 -add china_ip_route 210.52.0.0/18 -add china_ip_route 210.52.64.0/23 -add china_ip_route 210.52.66.0/24 -add china_ip_route 210.52.68.0/22 -add china_ip_route 210.52.72.0/21 -add china_ip_route 210.52.80.0/20 -add china_ip_route 210.52.96.0/21 -add china_ip_route 210.52.104.0/22 -add china_ip_route 210.52.108.0/24 -add china_ip_route 210.52.110.0/23 -add china_ip_route 210.52.112.0/20 -add china_ip_route 210.52.128.0/17 -add china_ip_route 210.53.0.0/16 -add china_ip_route 210.56.192.0/19 -add china_ip_route 210.72.0.0/14 -add china_ip_route 210.76.0.0/15 -add china_ip_route 210.78.0.0/16 -add china_ip_route 210.79.64.0/18 -add china_ip_route 210.79.224.0/19 -add china_ip_route 210.82.0.0/15 -add china_ip_route 210.87.128.0/18 -add china_ip_route 210.185.192.0/18 -add china_ip_route 210.192.96.0/19 -add china_ip_route 211.64.0.0/13 -add china_ip_route 211.80.0.0/12 -add china_ip_route 211.96.0.0/14 -add china_ip_route 211.100.0.0/17 -add china_ip_route 211.100.128.0/19 -add china_ip_route 211.100.160.0/20 -add china_ip_route 211.100.184.0/21 -add china_ip_route 211.100.192.0/18 -add china_ip_route 211.101.0.0/16 -add china_ip_route 211.102.0.0/15 -add china_ip_route 211.136.0.0/13 -add china_ip_route 211.144.0.0/13 -add china_ip_route 211.152.0.0/17 -add china_ip_route 211.152.134.0/23 -add china_ip_route 211.152.140.0/22 -add china_ip_route 211.152.150.0/23 -add china_ip_route 211.152.157.0/24 -add china_ip_route 211.152.160.0/19 -add china_ip_route 211.152.192.0/18 -add china_ip_route 211.153.0.0/16 -add china_ip_route 211.154.0.0/19 -add china_ip_route 211.154.32.0/20 -add china_ip_route 211.154.48.0/21 -add china_ip_route 211.154.64.0/18 -add china_ip_route 211.154.128.0/17 -add china_ip_route 211.155.0.0/18 -add china_ip_route 211.155.67.0/24 -add china_ip_route 211.155.68.0/24 -add china_ip_route 211.155.72.0/21 -add china_ip_route 211.155.80.0/20 -add china_ip_route 211.155.97.0/24 -add china_ip_route 211.155.98.0/23 -add china_ip_route 211.155.100.0/22 -add china_ip_route 211.155.104.0/21 -add china_ip_route 211.155.113.0/24 -add china_ip_route 211.155.116.0/22 -add china_ip_route 211.155.120.0/21 -add china_ip_route 211.155.128.0/17 -add china_ip_route 211.156.0.0/18 -add china_ip_route 211.156.64.0/19 -add china_ip_route 211.156.96.0/21 -add china_ip_route 211.156.104.0/22 -add china_ip_route 211.156.108.0/23 -add china_ip_route 211.156.112.0/20 -add china_ip_route 211.156.128.0/17 -add china_ip_route 211.157.0.0/16 -add china_ip_route 211.158.0.0/15 -add china_ip_route 211.160.0.0/13 -add china_ip_route 212.64.0.0/17 -add china_ip_route 212.129.128.0/17 -add china_ip_route 213.199.169.0/24 -add china_ip_route 218.0.0.0/12 -add china_ip_route 218.16.0.0/13 -add china_ip_route 218.24.0.0/14 -add china_ip_route 218.28.0.0/15 -add china_ip_route 218.30.0.0/19 -add china_ip_route 218.30.64.0/18 -add china_ip_route 218.30.128.0/18 -add china_ip_route 218.30.192.0/19 -add china_ip_route 218.30.224.0/20 -add china_ip_route 218.30.240.0/21 -add china_ip_route 218.30.248.0/22 -add china_ip_route 218.30.252.0/25 -add china_ip_route 218.30.252.128/26 -add china_ip_route 218.30.252.194/31 -add china_ip_route 218.30.252.196/30 -add china_ip_route 218.30.252.200/29 -add china_ip_route 218.30.252.208/28 -add china_ip_route 218.30.252.224/27 -add china_ip_route 218.30.253.0/24 -add china_ip_route 218.30.254.0/23 -add china_ip_route 218.31.0.0/16 -add china_ip_route 218.56.0.0/13 -add china_ip_route 218.64.0.0/11 -add china_ip_route 218.96.0.0/15 -add china_ip_route 218.98.0.0/18 -add china_ip_route 218.98.96.0/19 -add china_ip_route 218.98.128.0/19 -add china_ip_route 218.98.192.0/18 -add china_ip_route 218.99.0.0/16 -add china_ip_route 218.100.96.0/19 -add china_ip_route 218.100.128.0/17 -add china_ip_route 218.104.0.0/14 -add china_ip_route 218.108.0.0/15 -add china_ip_route 218.185.192.0/19 -add china_ip_route 218.192.0.0/12 -add china_ip_route 218.240.0.0/14 -add china_ip_route 218.244.0.0/15 -add china_ip_route 218.246.0.0/19 -add china_ip_route 218.246.32.0/20 -add china_ip_route 218.246.48.0/21 -add china_ip_route 218.246.56.0/23 -add china_ip_route 218.246.58.0/24 -add china_ip_route 218.246.60.0/22 -add china_ip_route 218.246.64.0/18 -add china_ip_route 218.246.129.0/24 -add china_ip_route 218.246.131.0/24 -add china_ip_route 218.246.132.0/23 -add china_ip_route 218.246.134.0/24 -add china_ip_route 218.246.139.0/24 -add china_ip_route 218.246.144.0/20 -add china_ip_route 218.246.160.0/19 -add china_ip_route 218.246.192.0/18 -add china_ip_route 218.247.0.0/18 -add china_ip_route 218.247.96.0/19 -add china_ip_route 218.247.128.0/17 -add china_ip_route 218.249.0.0/16 -add china_ip_route 219.72.0.0/16 -add china_ip_route 219.82.0.0/16 -add china_ip_route 219.83.128.0/17 -add china_ip_route 219.90.68.0/22 -add china_ip_route 219.90.72.0/21 -add china_ip_route 219.128.0.0/11 -add china_ip_route 219.216.0.0/13 -add china_ip_route 219.224.0.0/13 -add china_ip_route 219.232.0.0/15 -add china_ip_route 219.234.0.0/21 -add china_ip_route 219.234.9.0/24 -add china_ip_route 219.234.10.0/23 -add china_ip_route 219.234.12.0/22 -add china_ip_route 219.234.32.0/19 -add china_ip_route 219.234.64.0/18 -add china_ip_route 219.234.128.0/17 -add china_ip_route 219.235.0.0/16 -add china_ip_route 219.236.0.0/14 -add china_ip_route 219.242.0.0/15 -add china_ip_route 219.244.0.0/14 -add china_ip_route 220.101.192.0/18 -add china_ip_route 220.112.0.0/14 -add china_ip_route 220.152.128.0/17 -add china_ip_route 220.154.0.0/16 -add china_ip_route 220.155.0.0/21 -add china_ip_route 220.155.9.0/24 -add china_ip_route 220.155.10.0/23 -add china_ip_route 220.155.12.0/22 -add china_ip_route 220.155.16.0/21 -add china_ip_route 220.155.24.0/22 -add china_ip_route 220.155.28.0/23 -add china_ip_route 220.155.31.0/24 -add china_ip_route 220.155.32.0/19 -add china_ip_route 220.155.64.0/18 -add china_ip_route 220.155.128.0/17 -add china_ip_route 220.158.241.0/24 -add china_ip_route 220.158.243.0/24 -add china_ip_route 220.160.0.0/11 -add china_ip_route 220.192.0.0/12 -add china_ip_route 220.231.0.0/18 -add china_ip_route 220.231.128.0/17 -add china_ip_route 220.232.64.0/18 -add china_ip_route 220.234.0.0/16 -add china_ip_route 220.242.0.0/23 -add china_ip_route 220.242.6.0/24 -add china_ip_route 220.242.8.0/24 -add china_ip_route 220.242.12.0/23 -add china_ip_route 220.242.14.0/24 -add china_ip_route 220.242.17.0/24 -add china_ip_route 220.242.18.0/23 -add china_ip_route 220.242.20.0/24 -add china_ip_route 220.242.32.0/20 -add china_ip_route 220.242.48.0/23 -add china_ip_route 220.242.53.0/24 -add china_ip_route 220.242.55.0/24 -add china_ip_route 220.242.56.0/22 -add china_ip_route 220.242.60.0/23 -add china_ip_route 220.242.62.0/24 -add china_ip_route 220.242.64.0/19 -add china_ip_route 220.242.96.0/20 -add china_ip_route 220.242.112.0/21 -add china_ip_route 220.242.120.0/22 -add china_ip_route 220.242.124.0/23 -add china_ip_route 220.242.126.0/24 -add china_ip_route 220.242.134.0/23 -add china_ip_route 220.242.173.0/24 -add china_ip_route 220.242.183.0/24 -add china_ip_route 220.242.197.0/24 -add china_ip_route 220.242.205.0/24 -add china_ip_route 220.242.207.0/24 -add china_ip_route 220.242.217.0/24 -add china_ip_route 220.242.218.0/23 -add china_ip_route 220.242.220.0/22 -add china_ip_route 220.242.224.0/19 -add china_ip_route 220.243.0.0/17 -add china_ip_route 220.243.128.0/18 -add china_ip_route 220.243.192.0/23 -add china_ip_route 220.243.196.0/24 -add china_ip_route 220.243.198.0/23 -add china_ip_route 220.243.201.0/24 -add china_ip_route 220.243.204.0/24 -add china_ip_route 220.243.214.0/24 -add china_ip_route 220.243.216.0/23 -add china_ip_route 220.243.218.0/24 -add china_ip_route 220.243.220.0/23 -add china_ip_route 220.243.223.0/24 -add china_ip_route 220.243.225.0/24 -add china_ip_route 220.243.226.0/23 -add china_ip_route 220.243.229.0/24 -add china_ip_route 220.243.230.0/24 -add china_ip_route 220.243.233.0/24 -add china_ip_route 220.243.234.0/23 -add china_ip_route 220.243.237.0/24 -add china_ip_route 220.243.238.0/23 -add china_ip_route 220.243.243.0/24 -add china_ip_route 220.243.244.0/24 -add china_ip_route 220.243.246.0/23 -add china_ip_route 220.243.249.0/24 -add china_ip_route 220.243.250.0/24 -add china_ip_route 220.243.252.0/24 -add china_ip_route 220.243.254.0/23 -add china_ip_route 220.247.136.0/21 -add china_ip_route 220.248.0.0/14 -add china_ip_route 220.252.0.0/16 -add china_ip_route 221.0.0.0/13 -add china_ip_route 221.8.0.0/14 -add china_ip_route 221.12.0.0/17 -add china_ip_route 221.12.128.0/18 -add china_ip_route 221.13.0.0/16 -add china_ip_route 221.14.0.0/15 -add china_ip_route 221.122.0.0/15 -add china_ip_route 221.128.128.0/17 -add china_ip_route 221.129.0.0/16 -add china_ip_route 221.130.0.0/15 -add china_ip_route 221.133.224.0/19 -add china_ip_route 221.136.0.0/15 -add china_ip_route 221.172.0.0/14 -add china_ip_route 221.176.0.0/19 -add china_ip_route 221.176.32.0/20 -add china_ip_route 221.176.48.0/21 -add china_ip_route 221.176.56.0/24 -add china_ip_route 221.176.58.0/23 -add china_ip_route 221.176.60.0/22 -add china_ip_route 221.176.64.0/18 -add china_ip_route 221.176.128.0/17 -add china_ip_route 221.177.0.0/16 -add china_ip_route 221.178.0.0/15 -add china_ip_route 221.180.0.0/14 -add china_ip_route 221.192.0.0/14 -add china_ip_route 221.196.0.0/15 -add china_ip_route 221.198.0.0/16 -add china_ip_route 221.199.0.0/17 -add china_ip_route 221.199.128.0/18 -add china_ip_route 221.199.192.0/20 -add china_ip_route 221.199.224.0/19 -add china_ip_route 221.200.0.0/13 -add china_ip_route 221.208.0.0/12 -add china_ip_route 221.224.0.0/12 -add china_ip_route 222.16.0.0/12 -add china_ip_route 222.32.0.0/11 -add china_ip_route 222.64.0.0/11 -add china_ip_route 222.125.0.0/16 -add china_ip_route 222.126.128.0/19 -add china_ip_route 222.126.160.0/21 -add china_ip_route 222.126.168.0/22 -add china_ip_route 222.126.172.0/23 -add china_ip_route 222.126.174.40/29 -add china_ip_route 222.126.174.76/30 -add china_ip_route 222.126.174.88/29 -add china_ip_route 222.126.174.144/28 -add china_ip_route 222.126.178.0/23 -add china_ip_route 222.126.180.0/22 -add china_ip_route 222.126.184.0/21 -add china_ip_route 222.126.192.0/21 -add china_ip_route 222.126.200.104/29 -add china_ip_route 222.126.206.0/23 -add china_ip_route 222.126.208.0/22 -add china_ip_route 222.126.212.0/26 -add china_ip_route 222.126.212.64/27 -add china_ip_route 222.126.212.96/28 -add china_ip_route 222.126.212.112/29 -add china_ip_route 222.126.212.128/25 -add china_ip_route 222.126.213.0/24 -add china_ip_route 222.126.214.0/23 -add china_ip_route 222.126.216.0/21 -add china_ip_route 222.126.224.0/19 -add china_ip_route 222.128.0.0/12 -add china_ip_route 222.160.0.0/14 -add china_ip_route 222.168.0.0/13 -add china_ip_route 222.176.0.0/12 -add china_ip_route 222.192.0.0/11 -add china_ip_route 222.240.0.0/13 -add china_ip_route 222.248.0.0/15 -add china_ip_route 223.0.0.0/12 -add china_ip_route 223.20.0.0/15 -add china_ip_route 223.27.184.0/22 -add china_ip_route 223.29.208.0/22 -add china_ip_route 223.29.252.0/22 -add china_ip_route 223.64.0.0/11 -add china_ip_route 223.96.0.0/12 -add china_ip_route 223.112.0.0/14 -add china_ip_route 223.116.0.0/15 -add china_ip_route 223.120.0.0/13 -add china_ip_route 223.128.0.0/15 -add china_ip_route 223.144.0.0/12 -add china_ip_route 223.160.0.0/14 -add china_ip_route 223.166.0.0/15 -add china_ip_route 223.192.0.0/15 -add china_ip_route 223.198.0.0/15 -add china_ip_route 223.201.8.0/21 -add china_ip_route 223.201.16.0/20 -add china_ip_route 223.201.32.0/19 -add china_ip_route 223.201.64.0/18 -add china_ip_route 223.201.128.0/17 -add china_ip_route 223.202.0.0/15 -add china_ip_route 223.208.0.0/13 -add china_ip_route 223.220.0.0/15 -add china_ip_route 223.223.176.0/20 -add china_ip_route 223.223.192.0/20 -add china_ip_route 223.240.0.0/13 -add china_ip_route 223.248.0.0/14 -add china_ip_route 223.252.128.0/19 -add china_ip_route 223.252.192.0/18 -add china_ip_route 223.254.0.0/16 -add china_ip_route 223.255.0.0/17 -add china_ip_route 223.255.236.0/22 -add china_ip_route 223.255.252.0/23 diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/lhie1.yaml b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/lhie1.yaml index e310322dad..b63075d868 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/lhie1.yaml +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/lhie1.yaml @@ -1,292 +1,53 @@ -rule-providers: - Reject: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Reject.yaml' - path: ./Rules/Reject - interval: 86400 - Special: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Special.yaml' - path: ./Rules/Special - interval: 86400 - Netflix: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Netflix.yaml' - path: ./Rules/Media/Netflix - interval: 86400 - Spotify: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Spotify.yaml' - path: ./Rules/Media/Spotify - interval: 86400 - # YouTube Music: - # type: http - # behavior: classical - # url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/YouTube%20Music.yaml' - # path: ./Rules/Media/YouTube_Music - # interval: 86400 - YouTube: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/YouTube.yaml' - path: ./Rules/Media/YouTube - interval: 86400 - Bilibili: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Bilibili.yaml' - path: ./Rules/Media/Bilibili - interval: 86400 - iQiyi: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/iQiyi.yaml' - path: ./Rules/Media/iQiyi - interval: 86400 - Letv: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Letv.yaml' - path: ./Rules/Media/Letv - interval: 86400 - # MOO: - # type: http - # behavior: classical - # url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/MOO.yaml' - # path: ./Rules/Media/MOO - # interval: 86400 - Netease Music: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Netease%20Music.yaml' - path: ./Rules/Media/Netease_Music - interval: 86400 - Tencent Video: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Tencent%20Video.yaml' - path: ./Rules/Media/Tencent_Video - interval: 86400 - Youku: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Youku.yaml' - path: ./Rules/Media/Youku - interval: 86400 - ABC: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/ABC.yaml' - path: ./Rules/Media/ABC - interval: 86400 - Abema TV: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Abema%20TV.yaml' - path: ./Rules/Media/Abema_TV - interval: 86400 - Amazon: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Amazon.yaml' - path: ./Rules/Media/Amazon - interval: 86400 - Apple News: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Apple%20News.yaml' - path: ./Rules/Media/Apple_News - interval: 86400 - Apple TV: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Apple%20TV.yaml' - path: ./Rules/Media/Apple_TV - interval: 86400 - Bahamut: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Bahamut.yaml' - path: ./Rules/Media/Bahamut - interval: 86400 - BBC iPlayer: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/BBC%20iPlayer.yaml' - path: ./Rules/Media/BBC_iPlayer - interval: 86400 - DAZN: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/DAZN.yaml' - path: ./Rules/Media/DAZN - interval: 86400 - Disney Plus: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Disney%20Plus.yaml' - path: ./Rules/Media/Disney_Plus - interval: 86400 - encoreTVB: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/encoreTVB.yaml' - path: ./Rules/Media/encoreTVB - interval: 86400 - Fox Now: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Fox%20Now.yaml' - path: ./Rules/Media/Fox_Now - interval: 86400 - Fox+: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Fox%2B.yaml' - path: ./Rules/Media/Fox+ - interval: 86400 - HBO: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/HBO.yaml' - path: ./Rules/Media/HBO - interval: 86400 - Hulu Japan: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Hulu%20Japan.yaml' - path: ./Rules/Media/Hulu_Japan - interval: 86400 - Hulu: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Hulu.yaml' - path: ./Rules/Media/Hulu - interval: 86400 - Japonx: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Japonx.yaml' - path: ./Rules/Media/Japonx - interval: 86400 - JOOX: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/JOOX.yaml' - path: ./Rules/Media/JOOX - interval: 86400 - KKBOX: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/KKBOX.yaml' - path: ./Rules/Media/KKBOX - interval: 86400 - KKTV: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/KKTV.yaml' - path: ./Rules/Media/KKTV - interval: 86400 - Line TV: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Line%20TV.yaml' - path: ./Rules/Media/Line_TV - interval: 86400 - myTV SUPER: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/myTV%20SUPER.yaml' - path: ./Rules/Media/myTV_SUPER - interval: 86400 - Pandora: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Pandora.yaml' - path: ./Rules/Media/Pandora - interval: 86400 - PBS: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/PBS.yaml' - path: ./Rules/Media/PBS - interval: 86400 - Pornhub: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Pornhub.yaml' - path: ./Rules/Media/Pornhub - interval: 86400 - Soundcloud: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/Soundcloud.yaml' - path: ./Rules/Media/Soundcloud - interval: 86400 - ViuTV: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Media/ViuTV.yaml' - path: ./Rules/Media/ViuTV - interval: 86400 - Telegram: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Telegram.yaml' - path: ./Rules/Telegram - interval: 86400 - Steam: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Steam.yaml' - path: ./Rules/Steam - interval: 86400 - Speedtest: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Speedtest.yaml' - path: ./Rules/Speedtest - interval: 86400 - PayPal: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/PayPal.yaml' - path: ./Rules/PayPal - interval: 86400 - Microsoft: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Microsoft.yaml' - path: ./Rules/Microsoft - interval: 86400 - PROXY: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Proxy.yaml' - path: ./Rules/Proxy - interval: 86400 - Domestic: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Domestic.yaml' - path: ./Rules/Domestic - interval: 86400 - Apple: - type: http - behavior: classical - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Apple.yaml' - path: ./Rules/Apple - interval: 86400 - Domestic IPs: - type: http - behavior: ipcidr - url: 'https://gitee.com/lhie1/Rules/raw/master/Clash/Provider/Domestic%20IPs.yaml' - path: ./Rules/Domestic_IPs - interval: 86400 +rules: +- RULE-SET,Reject,AdBlock +- RULE-SET,Special,DIRECT +- RULE-SET,Netflix,Netflix +- RULE-SET,Spotify,Spotify +- RULE-SET,YouTube,YouTube +- RULE-SET,Bilibili,AsianTV +- RULE-SET,iQiyi,AsianTV +- RULE-SET,Letv,AsianTV +- RULE-SET,Netease Music,AsianTV +- RULE-SET,Tencent Video,AsianTV +- RULE-SET,Youku,AsianTV +- RULE-SET,ABC,GlobalTV +- RULE-SET,Abema TV,GlobalTV +- RULE-SET,Amazon,GlobalTV +- RULE-SET,Apple News,GlobalTV +- RULE-SET,Apple TV,GlobalTV +- RULE-SET,Bahamut,GlobalTV +- RULE-SET,BBC iPlayer,GlobalTV +- RULE-SET,DAZN,GlobalTV +- RULE-SET,Disney Plus,GlobalTV +- RULE-SET,encoreTVB,GlobalTV +- RULE-SET,Fox Now,GlobalTV +- RULE-SET,Fox+,GlobalTV +- RULE-SET,HBO,GlobalTV +- RULE-SET,Hulu Japan,GlobalTV +- RULE-SET,Hulu,GlobalTV +- RULE-SET,Japonx,GlobalTV +- RULE-SET,JOOX,GlobalTV +- RULE-SET,KKBOX,GlobalTV +- RULE-SET,KKTV,GlobalTV +- RULE-SET,Line TV,GlobalTV +- RULE-SET,myTV SUPER,GlobalTV +- RULE-SET,Pandora,GlobalTV +- RULE-SET,PBS,GlobalTV +- RULE-SET,Pornhub,GlobalTV +- RULE-SET,Soundcloud,GlobalTV +- RULE-SET,ViuTV,GlobalTV +- RULE-SET,Telegram,Telegram +- RULE-SET,Steam,Steam +- RULE-SET,Speedtest,Speedtest +- RULE-SET,PayPal,PayPal +- RULE-SET,Microsoft,Microsoft +- RULE-SET,PROXY,Proxy +- RULE-SET,Apple,Apple +- RULE-SET,Domestic,Domestic +- RULE-SET,Domestic IPs,Domestic +- RULE-SET,LAN,DIRECT +- GEOIP,CN,Domestic +- MATCH,Others script: code: | def main(ctx, metadata): @@ -336,7 +97,8 @@ script: "PROXY": "Proxy", "Apple": "Apple", "Domestic": "Domestic", - "Domestic IPs": "Domestic" + "Domestic IPs": "Domestic", + "LAN": "DIRECT" } port = int(metadata["dst_port"]) @@ -353,73 +115,291 @@ script: return "DIRECT" code = ctx.geoip(ip) - if code == "LAN": - return "DIRECT" if code == "CN": return "Domestic" return "Others" - -rules: -##source:lhie1 -- RULE-SET,Reject,AdBlock -- RULE-SET,Special,DIRECT - -- RULE-SET,Netflix,Netflix -- RULE-SET,Spotify,Spotify - -# - RULE-SET,YouTube Music,YouTube -- RULE-SET,YouTube,YouTube - -- RULE-SET,Bilibili,AsianTV -- RULE-SET,iQiyi,AsianTV -- RULE-SET,Letv,AsianTV -# - RULE-SET,MOO,AsianTV -- RULE-SET,Netease Music,AsianTV -- RULE-SET,Tencent Video,AsianTV -- RULE-SET,Youku,AsianTV - -- RULE-SET,ABC,GlobalTV -- RULE-SET,Abema TV,GlobalTV -- RULE-SET,Amazon,GlobalTV -- RULE-SET,Apple News,GlobalTV -- RULE-SET,Apple TV,GlobalTV -- RULE-SET,Bahamut,GlobalTV -- RULE-SET,BBC iPlayer,GlobalTV -- RULE-SET,DAZN,GlobalTV -- RULE-SET,Disney Plus,GlobalTV -- RULE-SET,encoreTVB,GlobalTV -- RULE-SET,Fox Now,GlobalTV -- RULE-SET,Fox+,GlobalTV -- RULE-SET,HBO,GlobalTV -- RULE-SET,Hulu Japan,GlobalTV -- RULE-SET,Hulu,GlobalTV -- RULE-SET,Japonx,GlobalTV -- RULE-SET,JOOX,GlobalTV -- RULE-SET,KKBOX,GlobalTV -- RULE-SET,KKTV,GlobalTV -- RULE-SET,Line TV,GlobalTV -- RULE-SET,myTV SUPER,GlobalTV -- RULE-SET,Pandora,GlobalTV -- RULE-SET,PBS,GlobalTV -- RULE-SET,Pornhub,GlobalTV -- RULE-SET,Soundcloud,GlobalTV -- RULE-SET,ViuTV,GlobalTV - -- RULE-SET,Telegram,Telegram -- RULE-SET,Steam,Steam -- RULE-SET,Speedtest,Speedtest -- RULE-SET,PayPal,PayPal -- RULE-SET,Microsoft,Microsoft - -- RULE-SET,PROXY,Proxy - -- RULE-SET,Apple,Apple - -- RULE-SET,Domestic,Domestic -- RULE-SET,Domestic IPs,Domestic - -- GEOIP,CN,Domestic -- MATCH,Others - +rule-providers: + Reject: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Reject.yaml + path: "./Rules/Reject" + interval: 86400 + Special: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Special.yaml + path: "./Rules/Special" + interval: 86400 + Netflix: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Netflix.yaml + path: "./Rules/Media/Netflix" + interval: 86400 + Spotify: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Spotify.yaml + path: "./Rules/Media/Spotify" + interval: 86400 + YouTube: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/YouTube.yaml + path: "./Rules/Media/YouTube" + interval: 86400 + Bilibili: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Bilibili.yaml + path: "./Rules/Media/Bilibili" + interval: 86400 + iQiyi: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/iQiyi.yaml + path: "./Rules/Media/iQiyi" + interval: 86400 + Letv: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Letv.yaml + path: "./Rules/Media/Letv" + interval: 86400 + Netease Music: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Netease%20Music.yaml + path: "./Rules/Media/Netease_Music" + interval: 86400 + Tencent Video: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Tencent%20Video.yaml + path: "./Rules/Media/Tencent_Video" + interval: 86400 + Youku: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Youku.yaml + path: "./Rules/Media/Youku" + interval: 86400 + ABC: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/ABC.yaml + path: "./Rules/Media/ABC" + interval: 86400 + Abema TV: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Abema%20TV.yaml + path: "./Rules/Media/Abema_TV" + interval: 86400 + Amazon: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Amazon.yaml + path: "./Rules/Media/Amazon" + interval: 86400 + Apple News: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Apple%20News.yaml + path: "./Rules/Media/Apple_News" + interval: 86400 + Apple TV: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Apple%20TV.yaml + path: "./Rules/Media/Apple_TV" + interval: 86400 + Bahamut: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Bahamut.yaml + path: "./Rules/Media/Bahamut" + interval: 86400 + BBC iPlayer: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/BBC%20iPlayer.yaml + path: "./Rules/Media/BBC_iPlayer" + interval: 86400 + DAZN: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/DAZN.yaml + path: "./Rules/Media/DAZN" + interval: 86400 + Disney Plus: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Disney%20Plus.yaml + path: "./Rules/Media/Disney_Plus" + interval: 86400 + encoreTVB: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/encoreTVB.yaml + path: "./Rules/Media/encoreTVB" + interval: 86400 + Fox Now: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Fox%20Now.yaml + path: "./Rules/Media/Fox_Now" + interval: 86400 + Fox+: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Fox%2B.yaml + path: "./Rules/Media/Fox+" + interval: 86400 + HBO: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/HBO.yaml + path: "./Rules/Media/HBO" + interval: 86400 + Hulu Japan: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Hulu%20Japan.yaml + path: "./Rules/Media/Hulu_Japan" + interval: 86400 + Hulu: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Hulu.yaml + path: "./Rules/Media/Hulu" + interval: 86400 + Japonx: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Japonx.yaml + path: "./Rules/Media/Japonx" + interval: 86400 + JOOX: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/JOOX.yaml + path: "./Rules/Media/JOOX" + interval: 86400 + KKBOX: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/KKBOX.yaml + path: "./Rules/Media/KKBOX" + interval: 86400 + KKTV: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/KKTV.yaml + path: "./Rules/Media/KKTV" + interval: 86400 + Line TV: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Line%20TV.yaml + path: "./Rules/Media/Line_TV" + interval: 86400 + myTV SUPER: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/myTV%20SUPER.yaml + path: "./Rules/Media/myTV_SUPER" + interval: 86400 + Pandora: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Pandora.yaml + path: "./Rules/Media/Pandora" + interval: 86400 + PBS: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/PBS.yaml + path: "./Rules/Media/PBS" + interval: 86400 + Pornhub: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Pornhub.yaml + path: "./Rules/Media/Pornhub" + interval: 86400 + Soundcloud: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/Soundcloud.yaml + path: "./Rules/Media/Soundcloud" + interval: 86400 + ViuTV: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Media/ViuTV.yaml + path: "./Rules/Media/ViuTV" + interval: 86400 + Telegram: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Telegram.yaml + path: "./Rules/Telegram" + interval: 86400 + Steam: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Steam.yaml + path: "./Rules/Steam" + interval: 86400 + Speedtest: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Speedtest.yaml + path: "./Rules/Speedtest" + interval: 86400 + PayPal: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/PayPal.yaml + path: "./Rules/PayPal" + interval: 86400 + Microsoft: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Microsoft.yaml + path: "./Rules/Microsoft" + interval: 86400 + PROXY: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Proxy.yaml + path: "./Rules/Proxy" + interval: 86400 + Domestic: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Domestic.yaml + path: "./Rules/Domestic" + interval: 86400 + Apple: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Apple.yaml + path: "./Rules/Apple" + interval: 86400 + Domestic IPs: + type: http + behavior: ipcidr + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/Domestic%20IPs.yaml + path: "./Rules/Domestic_IPs" + interval: 86400 + LAN: + type: http + behavior: classical + url: https://cdn.jsdelivr.net/gh/lhie1/Rules@master/Clash/Provider/LAN.yaml + path: "./Rules/LAN" + interval: 86400 diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version index 9762aadfe3..c5ff8af338 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version @@ -1,2 +1,2 @@ -v0.41.06-beta -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYQAAAAqCAMAAACEAtzLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdBQzk5OTJGMzMyMTExRUI4QzcwQjRGQ0M2MjJDMzA0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjdBQzk5OTMwMzMyMTExRUI4QzcwQjRGQ0M2MjJDMzA0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N0FDOTk5MkQzMzIxMTFFQjhDNzBCNEZDQzYyMkMzMDQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0FDOTk5MkUzMzIxMTFFQjhDNzBCNEZDQzYyMkMzMDQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5HbDnDAAADAFBMVEW6uro6lcoFaaJkq9MFbanh7/djlbFISEilpaWKioqGv98Kcq11tdkdcqLR0dEGVYKxytk9PT0jhbyenp6CgoIGXpHv9Pcwk8sHcKzR5vJFgKI1dZre3t61tbVFkr0Vapo/Pz9ubm6StcmizOXa2tobhcHn5+fOzs5Ui6vR4emCrscEU4CRkZEHZp1FRUVLS0sIWokFZZtycnJXlbgkapKy0eJ3d3eFhYUkeqqcnJxiYmJjnLyixtq/v7+srKx4eHiz1uqhoaFFmsrg4OCUxuIKdbJDQ0M0faZBQUEKaqAEYJQEWYoIZJmUlJQqjMXCwsJqamoJYpVXpdLIyMjw9PcHVoQXgLzFxcVAQEDAwMDR3+gIbaXB1eCiwNK2trbKysoHXI4gdaaCss5lZWVgYGDB2eeEscwYbZ0XYo1Kn8+kzuaNjY0FcrCDqsGTxOAEXI4nicGDq8JnrtZDfqCSvtYEYphHnMw2ksavr690dHQJWIWJweJzn7l0sdUmb5lFia81h7UBcrNZWVlTU1NRUVFUVFRVVVVSUlILfL0FdrcKe7wHeLlWVlYOgMAOf8ADdLQEdrYDdLUDdbUEdbYSg8MSg8QShMQThMUAcrIGd7hXV1cOf78Nfr8Nfr4Mfb4Mfb0JeroJe7sJersIeboIebk6OjqqqqrV1dXU1NSrq6vC3u6pqanw9/s7OzuAgIB+fn719fWBgYGEvd2EvN3q6urB3u709PTz8/OFvt5MTEyDvNx/f3/B3e2CqcBJns4IV4TB3e7o6OiEtNDg6u+hv9CFvd6Fvd1Hm8yXl5dGm8sIaJ8UXonW1taErMIsj8fA1N8JeLgFdLTC3u9Vos/B2+qDr8iEu9uEq8IHdbLg6vDC3+9EmcrC3OtHmsmixNejo6NIi7KEtM91qMVlp82RuM/B1+PD3+9Inc1Inc4ab6CAudkFZ6AGXY/Q5PAHWIcCc7QRgsMPgMEQgcJaWlpfX19NTU1eXl5cXFxbW1tPT09QUFBYWFhdXV1OTk7///////8p4/DxAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADGFJREFUeNrsVwlYVOUaHhAYtoRhIEEhWVQMdEbUwEspAoqgKC7ALZhcUm9qKGapbbe6jggO0817u0tS3UQZ1ikR2TTFNVMrNcuyzbJ9se6Wlhov91/OmXPODCjPreepmcf3efj/b//++d4z5x9UXV2N9438zhUw5u9OiH4PWru6VF3prkEBIeFvTol+YV2qxpEXXARj/uqc6GdV3XfBZUj4i5PiQdXIH10FY/7lpOin+vEaCb84XImE/zgrVN+7DK6R8CvAvH87K1Q/uAyukfBrIOExZ4Xqvy6DeX90VnRLQvC4cePuivr5xzQ/OHi+TYkKDu5NTkpwSm9JeKpHHFvh67u4W89jbouPSdpit25CFvv6rjimLPag/2BljC98n/r/oVpjj+TZjWBIP5y85icieFywQm/EYZucgzm9KfEKXulls3lP94QJ7PN4unXjmgn42pQOfOYQ4ObJkifY9M+Y3qGM8pVVsUeHb8fTV4YDCSnNwKA6rTaWdAr+qSSMwzi5ah6LdBvXwLCfmYRnekA7cj/6cNRNsA52cLlZgXZBPrbCinfsAwZbcdOoDz/KFaNWALm3v/pqQYd9i/Znem7fs49DdVmJ5HS0RWko9Nq24Ms/EYQEhR4FRAniYbSV9qaETqPrZbN5/+ge04ABDxAYsMTBZQUZL5fZA/6OfcQSBNLc/sA0qnYAr1L9gYnPKsLaxSrd4Eo+DpXD2NqSNRlqvV6n0Zin93bYicEKvoKDo7onQT0EqYJYg9md3eWKdIk1JBKSg4OT5Y+LUiUkPNs9/BE4otDPL7s/rHaewWHwMqCdK4fePGXAO/bJVgyY4TexcIQB/lT1JByMyM7KCpmoDGunVaZ1uMlqd3RMk/kEdHTIY0TYk9AIbeRaJpn1VKjBNqZtQ42wHk4H6i7XoS65jry5qLeOXiKNdSwOSGZqTTJTOGzV12rRLH0nzMpcqfjl4HSa1ngbKVIHXjixhppqEoXIqNuoOlt+9OvKBAwmjy2XlmBCWdl4vDWRKjMAtzIFTuL2PZ+inSt79ux5CyeVAWVuwAy6+72F8WSbibf3ZJV1AzLomfTy8Jwp5J2kxztJ+4lDIEZ+vVjb7bNVFQpsAypKRaWkpKKCkCA4atiazmZRV1GHOc1U2lZBXmCNKm9VI26jcUAzGmMHkWudKDXNaK4hkOqvARKZkIoh6gplrlT8LqCvt/csWp00qqPxiY0I9/YOR2Mii2xsxL7YIYQF2dltJJDZC5/TStkIwyim+BVgpuKzk1fNnsJ6MTYrK2s/6u3GMxMFjMCyUQhjGdFZg7/4wq0bEsjlstBATv85VcnN8c3+/TfCSiLrPeFZT1BW9jk8z+zff4uVPhlXIoHMRq8w2JOA1tQdGnUymQ32+dyqWfd9RQQGqckVom5j46VmoiUzTaOFll4vUjn9IEQwIR3VlyqUuVLxZp6mrpZIaMZsapqNZn6MviOJloRGOQkmAZv6w5MJK2AYbjIBN5Qx1YAXTTL4o2BRtqleZnwR9SYlXoSBCzcAZK1H9Hj2MPs7xFl/tygvb1EB60yuGq88grsx3mQi691UMZmW96d73gBgsDJbZVagDrFGhaEGz7P9edSwdd95Nh4S+NtIKl0iv3JKNDq1TjMMESQC0Gs0GZmaHNSZzRmpSM0gkMoZk9BK90TyjjKblblScfKqylATs+YSPREpZJ6KNk2mWp1J6JpKIwdpNJEZkZo24XQMNhJM2W9jponNzGsiJeF9bn4Ph2SffAVyF82gMZLxkAMJh/AeF95nJNAXTszZswXAEvu4uLy8kJC80eSVZzJNwO15c7Oy5ublknGHnMKpEAKTyS+PXifZ3xqw6iok9DVfkYRYjbrEXGIkgdrIHWSoJT4YlFlCXCVRLAKgZjN5+deZxQnKcR7wIRv9CpjNylyp+BCEJ1Kz2kZCBHJ0NF2Xw+mKzSAu845YBQmVIvwewhKyTUNuiKmyEljFzfVosoVUrrbmDph7QmlsQn2lEjbLKqCSljo7gz7MXqzm6pP0NVM/gcXFHSXFTsx9G30qK8MwtJAmHTXQsCaxw0S/ylVNTeMX5ooHEqFap0A1wpUGQgLbCQls7WsUA71FwQYaAfAAb1QzZ7Wy3LodORhLtmYMK7XPlYonEUPznOr719lK1EDLPEYtj6zlgX2F0zFct9mGh4H8zZubEF1IFOAlbiXzlkLqMfTbE3ZGMvLNStgsLwGsVP8R2UePzg0gP3eZjaKexfEqEw1UkD4Wbd1k69Bklaxy2JGQAiy4Igk1NraqRaG5msFb68NIkPsdSTCmoHUBqYPzDrlS8cioHHbWOTISBM69OQk1ytNxEjbZkBUI/02bPPFwFVEO4Ai3tuBjKaRFNikItu1o2aTEx6LlCA6QlVwvTCtcSu359/SnmMQyt/O4hVQAYrYznFoaJPMtA87c/MjDIZ+KBxKhKlECmKrQa/EC219ArW2lILMRhUHPCchk+XK/LUpCBnmrl4xFjtohVyquJ4YFSeR/dq1YYhYiuCsCs2SR4ukYvtxiw+mh8NxyBIZsqhiwnVvJCKWQew0tDFZ4trQINkLCFiXIfSy6DKxUH66eJZEnQgMYQphb6BGG39NGQwMEhEq+fOAhZjPgiLKLHQmd5OfHd6Ly3XT6MX2uTAL57vyo5tD3hoQdszGnpBVJpQ65UvGSzgxKzGxq4CU+QDj3hOODHkmokjCZPP4x8DpN5VOIYbbVQKEUcU6YkgFLAwIE2060VClRCCxnwnicImu0UIqo91ZVbQxlKGKZO5l9OfBoVZUBZ4YLOC35jgABKwtDT1e14Iiyi8qoQKkRCL/AZZ/WrUajCmOpfGEsasm2la0UDWjgAvkneJZgu5/8kTtB5tfybAXITyIt2jIcc6XiWvJ3UZ/ZQL280A/AViM7AH6QRdZyK8eX5RI8lmI8rj/H5Emw5tN9GQJDybZ6794+ZEs4x/Ep4s6dE7J2Yq9YYNleJoYGYifdyVM8iZXCaqout+KRcjl28rDyGBxwLy/3EsJIM/L3e8QwOQ0Yw2yeSFMkl9uRYMwgl2JrhM/WrQ3h7HOTT92wdWtEK3oi4Tx5nGeRwJHa5gYHEqaDEHlhqrLDELQiQu+YKxVH89TpJK2VHoAXUjeglZQhpgZ1b0goJ1czot23UHF4IMJWl+f7k1tVmMVOWeAuUUtLS4tBGFnzuRnMSn7U++eXrw7D8eFEyz4IK2Hw9TAczLYjwbrs9bQ+e0kPQvS5AhK2vDz/9Rha5FFY08rz+5SHHkBYnzRiw9VIuGiZPkS4rdq0a8jIIpi8b2pPJBg1KW1Cwm8cSFDzbEWHzmHEsqCbXKm4eIKGDLHQRQuvhAjLxR5J2ChDQiAwmouhLxfwXK8Qqr4LvCkL3CVqtlv6XW4Gs4Z4cWPBy6Gs1EGuHoz3kHfb+KaQe73XFKK5vxwo6kT7muds9BhwPRPuvZG3kKAqtYPaYknRxsbGNqRYLDtKS/WWpJzYnCSNUetDnPPZSpGoTRQkvUWXpKqtVU016oim1cr9nSS7dlaqsoNZq9VmdJMrFbekpPat7ZtqtOhtjXSW6dW1tdXTLTr5MXy086W6d8o/V9GA3Q+tFOSQeK9bdr0RN5oPLmj37hvWS4E3i9odd9wRt/tusgZx827OYPzouDd23eIVX8zUyfH3RO/d9ck98ZOVY7xhd/+hZ44fjxZ6TIkfELdw1xunhsazEl6BLTfFEevo6OPHP5kU77U76CoklO7QWDie010iagaTNWrLrdTHVj4UnZigf05IUNP5WRR+nu1As+V8N7lScfEEOlkjXsnC2LNF3kqfExsJ62XYEBIfXyTIr02JZ3Bnmkd8fIIssFjU4kV4cHM8N7tz45TXeKnJXJ28XokEITeA93g8RNSpxnPWbwgNYMLKKbyFBNVaR+h1kZGROr2gqTMjM9VrO3VqIvOVx+ht8ZfUGZGRGepOKut0Sj/N1inLd+p0uu5ypeLCCToVjahNkG2Rah7DoSBhfWjC15LiPrm4OEHgpCghQT4Dd1FLEFHEzSJTRQnFxZPdbfEeK4uLV9oNkVgTPDxIj5VFUvti0tLjCd4jpDiEliuiuaEb3BOKrk6Ck+LODc4K1SWXwZ1POCtciYQ/OytUF10GA//krHAlEh53Vqjmd7oKBv7TSRGk8r5Gwi+Nr1StLvNVGPgH50SQVdUVnnzeNeCcJDwZ9E2Xqqur1ds1aBj4pBMi6CtrV9f/BBgA70F3ssn+sLsAAAAASUVORK5CYII= \ No newline at end of file +v0.41.12-beta +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYQAAAAqCAMAAACEAtzLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYxRTAxMzM3M0ZDNzExRUJBQUM0RDg0MkJENzFBRjgwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYxRTAxMzM4M0ZDNzExRUJBQUM0RDg0MkJENzFBRjgwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjFFMDEzMzUzRkM3MTFFQkFBQzREODQyQkQ3MUFGODAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjFFMDEzMzYzRkM3MTFFQkFBQzREODQyQkQ3MUFGODAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5Pf4DMAAADAFBMVEWKiooihLwFXI5Jns4FaaKUxeEdcqI1dZrR0dEFbak9PT3R4utkq9Kenp4GcKyCgoIHXpHR5vLh7/cxk8yGvt8KdbIJca7e3t5jlbGxytm1tbUVapo/Pz+izOVubm6y0eN1tdna2trn5+fOzs4HZp1Ui6sGVYIqjMWRkZFjnL0bhcFGRkZLS0tycnJFgKJFmsoHVoSCrsZ3d3eFhYVFkb0keqqcnJxiYmIEU4AkapK/v7+srKx4eHgFZZtYpdKhoaHg4OAJZJlDQ0Pw9PcKaqBBQUGixtqUlJTCwsIXYYwXgL2Stchqamq6urrIyMiiwNEIWolXlbnFxcVAQEDAwMA0fKYEWYnQ3+i2trbKysoJYZMFYJQgdaY7l8tlZWWTvtZgYGCz1enB2ecYbZ0IbaWnp6eDq8KCudk3k8iNjY0FcrCCqsCkzuY2kcZGirEJWIWvr68EYph0dHRHnMyJweJzn7l0sdUmbpdnrtYnisI1h7UUXokBcrNZWVlTU1NRUVFUVFRVVVUKe7wLfL1SUlIHeLkFdrdWVlYOgMAEdbYDdbUOf8AEdrYDdLUDdLQSg8MSg8QShMQThMUAcrIGd7hXV1cOf78Nfr8Nfr4Mfb4Mfb0Je7sJersJeroIeboIebk6OjqqqqrV1dXU1NSrq6vC3u6pqalISEg7OzuAgIB+fn7w9/v19fWEvN2BqcCBgYGEvd1JSUmDvNzq6urB3u7B1eD09PTz8/OFvt5MTEyCss5/f3+lpaXB3e0IV4XB3e7C3++EtNDo6OjC3u/v9PeXl5eFvd6Fvd3W1tbg6u9Hm8wJeLjA1N+Du9xEmcpGm8vD3++Eq8IHdbJVos+Dr8iFudeErMIrjsfB2+rv9vqixNdEf6HB1+Ohv9Dg6vAFdLSEsMqjo6PC1eEIaJ85lcm4uLgwk8t/uNjC3OsFZ6Aab6AId7cmcZwmhr2RuM8Cc7QRgsMPgMEQgcJaWlpfX19NTU1eXl5cXFxbW1tPT09QUFBYWFhdXV1OTk7///////+98cn1AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAC8ZJREFUeNrsVwl0VNUZfiRgkpHJTNKQjSQCkUXeQDZoAiQkDERCWK3KooCAaDWAiCtKGcIkYWpr7SLR1rBMdmUGSMgGGoJsbqAoUhFc6latWtvaChUwX3qXt85MMKd6js4cvnPy7v9//3bf/SZzE6Gry33niK8CAaP/4If4yT2uri6hKy8wJCAi/N4v8XFEl+AecTZAMPp3/omPXcKdZwNGhN/6Ke4RRnwTKBj9Lz/Fx8I3l0T4wRFIIvzbXyH8N2BwSYQfAeZ/6a8Qvg4YXBLhxyDCL/0Vwn8CBvN/7a/wKYJp3Lhxtyd9/8e00GRaqDhJJlNParJN2T0V4bFucXJ1VFSw79CC4JOqE7zAZ45Kfzl8fNQ9A7yzohD12P8PYa0nMue6wZB3OHPtd4RpnEnnu3FYsQswryctXsALPRw2//Hu0Ie9T+QCH6HxQJTiBONVX+UqffJVfjQRnq2iNF28yqOCH784vETIbgIG1hiNyWSW6buKMA7jtK5jLPIUrYFh37MIf+wGUTi1445rroBruFdogYuIINknV7vwrHe1lg4GPnjjjZkTvVpFKV18je8+xiFc0CMzD21JBgqLsc104TuCiKDzk4AkyTyMttKetBANYg+Hzf+TbwwFQmZ1rFz5AZZ7hVyYiChus4/4s17VOjp45v0rCUJOYYA+K0ru4gMXi3EIXsfWlmmwNlososHgmNbTw0436fQymZJ8i1A/CLmSWYW5nb5qZbnkHqoImSZTpvbjoneJCE/4xgDEzVraL3rCSLg8IsMjENuC3dzZ/ef3WvCsV7WO7rdy5Q2TJk2YNdUzcTftMjT4I03v4OChmpiE4GBtjgxPEdwwJqxjlsNCjSrsZN5OVEnPw3lAzYUa1GTWkG8uGq2hl4i7huUBmcytymQOh9J9nRFN6u+EQ1+rNr9gyqNl7utIkxrwxulVlKpKlzKTrqPuXO3WLyuRMBwYyq3l6FNSshiv9aPODcBHJTocxMyOt7GbOx0dHa/hYIkndHT0hCN06ZfmmUgOenwkvXfGc/+jg3R7B+k8+RAIGckM127PGUK5DjuB8lLZKS4uLyciSIEq9sxjZ1FTXoN5TdTaWU6+wNzT26e7cR3NA5rgTh5IrnXiVDWhqYpA7b8WSGdGLgaJ5fpatfntQGh7+wzanQyqofnpbsS0t8fAnc4y3W4cSB5EVNDsXRGBnL30ni6qRgSuofYT0XMwXvfuyxHXsbRWzp00adJ+1HqJ4JNejJs8RSCXy5IWsvtg6q4md/f+/ZfDRVSojURkLUFJSTAiT+/ff7WLfjIuJgI5G4uO8BQBrbl7DI2Z5GxwQLjWsP6/5fEY2EiukMY2dryUJl4m8wxGGOn1orazDEQ8M/JQeb5cX6s2b+JljZWqCE2YS6m5aOLbCB1BvAy4tSLYJWweiUhmrEbLlXY7MKqEuS14zq7BAMyZMsFeqyGfQ63dB7xocsvc4Zniem9KR+qUOWwyuWpiUwluxWK7nTxvpY7d/sVIuqaGAMP11YJDhxok23REFZ5i61OoYs8DZ9jxkMSfJVDrPPkrp9ggNoqGYYgnGYDFYLDmGwpQ43BYc5FrJVDb2TLQStd08h3lcOhr1ebkq8ra2Ggl3emOSCPHZLQZ8hsb8+vbMJlmDjQYEqwJhjZpdwyKCPYJ72I8XWsR24+KkMLpv+F5zZuvxsQpN9AclXzetwhedC0TV5+SlppqNqeOAW6z2/tgZqp50ofm1InkuM0ncMJMYLdHp86aQG6Ujhbc/S0ihDouKkKyobHYUWwjicaEPeRQiwUMzC8moeIklgFQ2kG+/Gsc8glqcQagI8mvgOhw6GvV5oMQk05pUREhHgUiLRcLuFzJVhJy7EnWiVAhI/peLCfLA5hoJgtwN6dr0aCkVNzmmhgSdERPNqC2wgc86eVEvmjaopahD0tJ+5A0OxL0LvpWVERg8FKa+GELHd0gT+gXXXF3Q8PiJRPlDckQ1utQiRg9QURgKxGBPUNtcmK7bCigGQBPaEclC1bq263fU4CxZGnCsFLPWrV5BiGa5lXetV5pUQUji9iMPLOaJ4ZKu2O4bJOC+4HCTZsaMHUpcYCXOEvOW02pxeCOIx4kOe1NPuBBEw1CzNR4iW+9lqXwLv1aqKG+Fh3doExocKmsFh4iZAOLLipClaJWpWw0VTLcYhSYCNq4twi2bLQuIn1wxqtWbZ6QVMD2Ok8jgqR5OxehSr87LsJmBZPiMGDz5kjcT50XcYyzzei7VUlp1pwUJG47mjf7gJ5OxKGQjs+pVfjWSIrrK2jKdh5dQg0gcTvDiWVfaGLkH/fTV93xd/Pb8oZkCMV6AJN1fjWeYeszqFaeFORsZGPgkxLyWb02rmSpsJJv9eKxKGj0qlWbWwixKIP8z26UW8xAPA/FY4YmU94dw2dbFBwfjMgtx/BBDnVasJ2z5IZWU25qaWZwIbK5WeLIaW/xAS1dmIg5IR3R1DwSPoTBzFKkGRG4jw4aPERCuBorBO5lXAuO6Qd4iNBJ/vz4Sna+mkZfU7i4COR355t6DktPRNgzF/OKW5FR6lWrNi/utFJh5lKCt3gfMTwSg/e7FWGrihvJxz8RscepfQKJjFsBLFUzzNIptWDZkCEStwvNW31AQxdGYM6ajiLufB7OUMRSdjHqAeDBrVtbcPpKCcfV2DFgyKql4ce3NuOYfoBg06HUBsSc5bbQus1mm46x1D47FtVk2caeFHWo44Y4CDMk7i7yQ+4ETdzIq3UgfxIZ0Wb1rlWbG8nPOUt+HY3yRl8D22xsA/hak1nNWY7PylSELcNiHApi9vVwFdK1D+LCybJi376+ZMkJ4ngbaUFBUtUu7JMb9NmnmBp6hQvvrAmKLvMCOWi2JuLF3mVlscAKqYD83IdEZqcAoxkXiRR9tYcINiu5FFvjhW3b6mLYe5O3rtu2Lb4V3YlwhnycZ5DEEcamOi8RpoEIeXayfsIgtCLe4l2rNkfT5GmkrJVugDcS69BK2hCqTuyJCGXkasbU3luoeWUcIlaUFQ4A3pLOYpcmca/spaSkJCKCPAs5DR/0XhxatuznuyhSPERw9Xk9pe8+MoNIFDQHrr4PlBW+nkibPAhXSllh37LwFxHRN4Vw+DYRzjmnDZJuqzbjWnJk8cw+MLk7EWyG7Dap4KdeItTzat2EzmGEWeSjVm0u76DOKjc65+SdEO88160IGzXIiQPGcDN8zRxeG2um7ivAy5rEvbKn3NKvcBo+6L3qXa7tsXHjyxJ7KHY28XqviZN94n36DjM3hoUcYsZNl/MRKoRSDzQ6ndnG5OTkumync09pqcWZUZBckGGwGWnmQqOcn25MlyyLU8z4a3X19Mk2kXhGozbeSaqrZ+TqJziMRqPVR63a3JmdG1odmmtzWpRBonNaZXV15TSnqN2GYFyo9r1Z+15FITvuXSXZ5qzYq/e+mTYmK4x6vZbtGKVJvEr2nn766bQdt5LnF5ze4YMmrIxRumMctWPk4NNHj06VZszOCklbsvfN9wZn0Q9BVmxc8xVphB0z9ejRf1yfFbuj1+cXF6F0j8HJ8aR4nrhWZhtE57U0xp78UES5wPKkVEAZp1MX59X6ASJhzvioVZvLO7BqBllVSs28ln5OFBE2aPCwOSurSLL/MjuLoTfzwrKycjSJQbKXJSOM01k+6CDF0/XYsCFHYofwGY+YZZ96NzJzw8PhQ5ixajYfoUJY5w2LmJCQYLVIXn1+Qn79uk6xntj8yXMsSv75eivJFzupLYr6OK0W9e07RVH0Vas25zvgDZVBFquyKSWznudw6ETYEJ7zqer0vjEoKEfSpCgnR3sGvWUvR0YRp3N80L0VL0d/jmE5YWFkxqoidTy59HPCHuIzzEFm2q5oFUkJJ12Kvl0EP8XND/srhPMBg5sf8lcEkgi/8lcI5wIG/X/jrwgkER7xVwgLOwMF/f/pp+gl3HJJhB8anwitAfOr0P8X/olep4SumMwzgQH/FOHRXhFdQldX6y2BIUP/R/0QvT451dX1PwEGANhK/H/+Sne9AAAAAElFTkSuQmCC \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/rule_providers.list b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/rule_providers.list index 118f4124bd..d4173692b2 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/rule_providers.list +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/rule_providers.list @@ -107,6 +107,7 @@ ViuTV,ConnersHua,classical,DivineEngine/Profiles/master/Clash/RuleSet/StreamingM ViuTV(By lhie1),lhie1,classical,lhie1/Rules/master/Clash/Provider/Media/,ViuTV.yaml,ViuTV-lhie1.yaml YouTube Music,lhie1,classical,lhie1/Rules/master/Clash/Provider/Media/,YouTube%20Music.yaml,YouTube Music.yaml YouTube,ConnersHua,classical,DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/Video/,YouTube.yaml +YouTubeMusic,ConnersHua,classical,DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/Music/,YouTubeMusic.yaml YouTube(By lhie1),lhie1,classical,lhie1/Rules/master/Clash/Provider/Media/,YouTube.yaml,YouTube-lhie1.yaml Youku,lhie1,classical,lhie1/Rules/master/Clash/Provider/Media/,Youku.yaml encoreTVB,ConnersHua,classical,DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/Video/,encoreTVB.yaml diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/sub_ini.list b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/sub_ini.list index 3b492fa329..857ed451b8 100644 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/sub_ini.list +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/sub_ini.list @@ -1,7 +1,8 @@ +默认(附带用于Clash的AdGuard DNS),default_with_clash_adg.yml,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/default_with_clash_adg.yml 无Urltest,no_urltest.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/no_urltest.ini 带Urltest,urltest.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/urltest.ini ConnersHua 神机规则 Basic,connershua_basic.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/connershua_basic.ini -ConnersHua 神机规则 Pro,connershua_pro.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/connershua_pro.ini +ConnersHua 神机规则 Pro,connershua_pro.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/connershua_new.ini ConnersHua 神机规则 BacktoCN 回国专用,connershua_backtocn.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/connershua_backtocn.ini lhie1 洞主规则(使用 Clash 分组规则),lhie1_clash.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/lhie1_clash.ini lhie1 洞主规则完整版,lhie1_dler.ini,https://gist.githubusercontent.com/tindy2013/1fa08640a9088ac8652dbd40c5d2715b/raw/lhie1_dler.ini diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_change.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_change.sh index 83c6095672..1c2200f2a8 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_change.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_change.sh @@ -8,14 +8,9 @@ LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") if [ "$14" != "1" ]; then controller_address="0.0.0.0" bind_address="*" -elif [ "$18" != "Tun" ] && [ "$14" = "1" ]; then +else controller_address=$11 bind_address=$11 -elif [ "$18" = "Tun" ] && [ "$14" = "1" ]; then - echo "Warning: Stop Set The Bind Address Option In TUN Mode, Because The Router Will Not Be Able To Connect To The Internet" >> $LOG_FILE - echo "警告: 在TUN内核下启用仅允许内网会导致路由器无法联网,已忽略此项修改!" >$START_LOG - controller_address="0.0.0.0" - bind_address="*" fi if [ -n "$(ruby_read "$7" "['tun']")" ]; then diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_get.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_get.sh index e20c49daac..36ceebe57a 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_get.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_get.sh @@ -175,7 +175,7 @@ do Thread.new{ #test_url if Value['proxy-groups'][$count].key?('url') then - group_test_url = '${uci_set}test_url=' + Value['proxy-groups'][$count]['url'].to_s + group_test_url = '${uci_set}test_url=\"' + Value['proxy-groups'][$count]['url'].to_s + '\"' system(group_test_url) end }.join; @@ -203,13 +203,8 @@ do Value['proxy-groups'][$count]['proxies'].each{ |x| if Value_1.include?(x) then - if '$group_type' == 'select' or '$group_type' == 'relay' then - uci = '${uci_add}other_group=\"' + x.to_s + '\"' - system(uci) - elsif x == 'DIRECT' or x == 'REJECT' then - uci = '${uci_add}other_group_dr=' + x.to_s - system(uci) - end + uci = '${uci_add}other_group=\"' + x.to_s + '\"' + system(uci) end } end diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_name_ch.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_name_ch.sh index 79ce105341..16a1557d33 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_name_ch.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_name_ch.sh @@ -33,7 +33,6 @@ cfg_groups_set() sed -i "s/old_name_cfg \'${old_name_cfg}\'/old_name_cfg \'${name}\'/g" $CFG_FILE 2>/dev/null sed -i "s/groups \'${old_name_cfg}/groups \'${name}/g" $CFG_FILE 2>/dev/null sed -i "s/other_group \'${old_name_cfg}/other_group \'${name}/g" $CFG_FILE 2>/dev/null - sed -i "s/other_group_dr \'${old_name_cfg}/other_group_dr \'${name}/g" $CFG_FILE 2>/dev/null sed -i "s/new_servers_group \'${old_name_cfg}/new_servers_group \'${name}/g" $CFG_FILE 2>/dev/null sed -i "s/relay_groups \'${old_name_cfg}/relay_groups \'${name}/g" $CFG_FILE 2>/dev/null #第三方规则处理 diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_set.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_set.sh index 4ab812491d..82e87f18ef 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_set.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_groups_set.sh @@ -205,12 +205,7 @@ yml_groups_set() set_group=0 set_proxy_provider=0 - if [ "$type" = "select" ] || [ "$type" = "relay" ]; then - config_list_foreach "$section" "other_group" set_other_groups #加入其他策略组 - else - config_list_foreach "$section" "other_group_dr" set_other_groups #仅加入direct/reject其他策略组 - fi - + config_list_foreach "$section" "other_group" set_other_groups #加入其他策略组 config_foreach yml_servers_add "servers" "$name" "$type" #加入服务器节点 if [ "$type" = "relay" ] && [ -s "/tmp/relay_server" ]; then diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_get.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_get.sh index 6d0891d2f0..8efbfc6bf9 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_get.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_get.sh @@ -190,7 +190,7 @@ do if '$provider_type' == 'http' then provider_path = '${uci_set}path=./proxy_provider/${provider_name}.yaml' else - provider_path = '${uci_set}path=' + Value['proxy-providers'].values[$provider_count]['path'].to_s + provider_path = '${uci_set}path=\"' + Value['proxy-providers'].values[$provider_count]['path'].to_s + '\"' end system(provider_path) end @@ -199,7 +199,7 @@ do Thread.new{ #gen_url if Value['proxy-providers'].values[$provider_count].key?('url') then - provider_gen_url = '${uci_set}provider_url=' + Value['proxy-providers'].values[$provider_count]['url'].to_s + provider_gen_url = '${uci_set}provider_url=\"' + Value['proxy-providers'].values[$provider_count]['url'].to_s + '\"' system(provider_gen_url) end }.join; @@ -226,7 +226,7 @@ do #che_url if Value['proxy-providers'].values[$provider_count].key?('health-check') then if Value['proxy-providers'].values[$provider_count]['health-check'].key?('url') then - provider_che_url = '${uci_set}health_check_url=' + Value['proxy-providers'].values[$provider_count]['health-check']['url'].to_s + provider_che_url = '${uci_set}health_check_url=\"' + Value['proxy-providers'].values[$provider_count]['health-check']['url'].to_s + '\"' system(provider_che_url) end end @@ -504,7 +504,7 @@ do Thread.new{ #server if Value['proxies'][$count].key?('server') then - server = '${uci_set}server=' + Value['proxies'][$count]['server'].to_s + server = '${uci_set}server=\"' + Value['proxies'][$count]['server'].to_s + '\"' system(server) end }.join; @@ -547,13 +547,13 @@ do end #host: if Value['proxies'][$count]['plugin-opts'].key?('host') then - host = '${uci_set}host=' + Value['proxies'][$count]['plugin-opts']['host'].to_s + host = '${uci_set}host=\"' + Value['proxies'][$count]['plugin-opts']['host'].to_s + '\"' system(host) end if Value['proxies'][$count]['plugin'].to_s == 'v2ray-plugin' then #path if Value['proxies'][$count]['plugin-opts'].key?('path') then - path = '${uci_set}path=' + Value['proxies'][$count]['plugin-opts']['path'].to_s + path = '${uci_set}path=\"' + Value['proxies'][$count]['plugin-opts']['path'].to_s + '\"' system(path) end #mux @@ -564,7 +564,7 @@ do #headers if Value['proxies'][$count]['plugin-opts'].key?('headers') then if Value['proxies'][$count]['plugin-opts']['headers'].key?('custom') then - custom = '${uci_set}custom=' + Value['proxies'][$count]['plugin-opts']['headers']['custom'].to_s + custom = '${uci_set}custom=\"' + Value['proxies'][$count]['plugin-opts']['headers']['custom'].to_s + '\"' system(custom) end end @@ -610,7 +610,7 @@ do Thread.new{ #obfs-param if Value['proxies'][$count].key?('obfs-param') then - obfs_param = '${uci_set}obfs_param=' + Value['proxies'][$count]['obfs-param'].to_s + obfs_param = '${uci_set}obfs_param=\"' + Value['proxies'][$count]['obfs-param'].to_s + '\"' system(obfs_param) end }.join @@ -618,7 +618,7 @@ do Thread.new{ #protocol-param if Value['proxies'][$count].key?('protocol-param') then - protocol_param = '${uci_set}protocol_param=' + Value['proxies'][$count]['protocol-param'].to_s + protocol_param = '${uci_set}protocol_param=\"' + Value['proxies'][$count]['protocol-param'].to_s + '\"' system(protocol_param) end }.join @@ -667,7 +667,7 @@ do Thread.new{ #servername if Value['proxies'][$count].key?('servername') then - servername = '${uci_set}servername=' + Value['proxies'][$count]['servername'].to_s + servername = '${uci_set}servername=\"' + Value['proxies'][$count]['servername'].to_s + '\"' system(servername) end }.join @@ -679,26 +679,26 @@ do system '${uci_set}obfs_vmess=websocket' #ws-path: if Value['proxies'][$count].key?('ws-path') then - path = '${uci_set}path=' + Value['proxies'][$count]['ws-path'].to_s + path = '${uci_set}path=\"' + Value['proxies'][$count]['ws-path'].to_s + '\"' system(path) end #Host: if Value['proxies'][$count].key?('ws-headers') then if Value['proxies'][$count]['ws-headers'].key?('Host') then - custom = '${uci_set}custom=' + Value['proxies'][$count]['ws-headers']['Host'].to_s + custom = '${uci_set}custom=\"' + Value['proxies'][$count]['ws-headers']['Host'].to_s + '\"' system(custom) end end - elsif Value['proxies'][$count]['network'].to_s == 'http' - system '${uci_set}obfs_vmess=http' - if Value['proxies'][$count].key?('http-opts') then - if Value['proxies'][$count]['http-opts'].key?('path') then - system '${uci_del}http_path >/dev/null 2>&1' - Value['proxies'][$count]['http-opts']['path'].each{ - |x| - http_path = '${uci_add}http_path=' + x.to_s - system(http_path) - } + elsif Value['proxies'][$count]['network'].to_s == 'http' + system '${uci_set}obfs_vmess=http' + if Value['proxies'][$count].key?('http-opts') then + if Value['proxies'][$count]['http-opts'].key?('path') then + system '${uci_del}http_path >/dev/null 2>&1' + Value['proxies'][$count]['http-opts']['path'].each{ + |x| + http_path = '${uci_add}http_path=\"' + x.to_s + '\"' + system(http_path) + } end if Value['proxies'][$count]['http-opts'].key?('headers') then if Value['proxies'][$count]['http-opts']['headers'].key?('Connection') then @@ -711,9 +711,25 @@ do end end end - else - system '${uci_set}obfs_vmess=none' - end + elsif Value['proxies'][$count]['network'].to_s == 'h2' + system '${uci_set}obfs_vmess=h2' + if Value['proxies'][$count].key?('h2-opts') then + if Value['proxies'][$count]['h2-opts'].key?('host') then + system '${uci_del}h2_host >/dev/null 2>&1' + Value['proxies'][$count]['h2-opts']['host'].each{ + |x| + h2_host = '${uci_add}h2_host=\"' + x.to_s + '\"' + system(h2_host) + } + end + if Value['proxies'][$count]['h2-opts'].key?('path') then + h2_path = '${uci_set}h2_path=\"' + Value['proxies'][$count]['h2-opts']['host'].to_s + '\"' + system(h2_path) + end + end + else + system '${uci_set}obfs_vmess=none' + end end }.join end; @@ -727,7 +743,7 @@ do system '${uci_set}obfs_snell=none' end if Value['proxies'][$count]['obfs-opts'].key?('host') then - host = '${uci_set}host=' + Value['proxies'][$count]['obfs-opts']['host'].to_s + host = '${uci_set}host=\"' + Value['proxies'][$count]['obfs-opts']['host'].to_s + '\"' system(host) end end @@ -781,7 +797,7 @@ do if '$server_type' == 'http' or '$server_type' == 'trojan' then Thread.new{ if Value['proxies'][$count].key?('sni') then - sni = '${uci_set}sni=' + Value['proxies'][$count]['sni'].to_s + sni = '${uci_set}sni=\"' + Value['proxies'][$count]['sni'].to_s + '\"' system(sni) end }.join @@ -793,7 +809,7 @@ do system '${uci_del}alpn >/dev/null 2>&1' Value['proxies'][$count]['alpn'].each{ |x| - alpn = '${uci_add}alpn=' + x.to_s + alpn = '${uci_add}alpn=\"' + x.to_s + '\"' system(alpn) } end diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh index 4a27cdd75d..bcf9149b44 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh @@ -37,6 +37,20 @@ if [ -z "$CONFIG_NAME" ]; then CONFIG_NAME="config.yaml" fi +yml_other_rules_del() +{ + local section="$1" + local enabled config + config_get_bool "enabled" "$section" "enabled" "1" + config_get "config" "$section" "config" "" + config_get "rule_name" "$section" "rule_name" "" + + if [ "$enabled" = "0" ] || [ "$config" != "$2" ] || [ "$rule_name" != "$3" ]; then + return + else + uci delete openclash."$section" 2>/dev/null + fi +} #写入代理集到配置文件 yml_proxy_provider_set() { @@ -135,6 +149,15 @@ cat >> "$SERVER_FILE" <<-EOF EOF } +set_h2_host() +{ + if [ -z "$1" ]; then + return + fi +cat >> "$SERVER_FILE" <<-EOF + - '$1' +EOF +} #写入服务器节点到配置文件 yml_servers_set() @@ -175,6 +198,8 @@ yml_servers_set() config_get "http_path" "$section" "http_path" "" config_get "keep_alive" "$section" "keep_alive" "" config_get "servername" "$section" "servername" "" + config_get "h2_path" "$section" "h2_path" "" + config_get "h2_host" "$section" "h2_host" "" if [ "$enabled" = "0" ]; then return @@ -245,6 +270,10 @@ yml_servers_set() obfs_vmess="network: http" fi + if [ "$obfs_vmess" = "h2" ]; then + obfs_vmess="network: h2" + fi + if [ ! -z "$custom" ] && [ "$type" = "vmess" ]; then custom="Host: $custom" fi @@ -402,6 +431,20 @@ cat >> "$SERVER_FILE" <<-EOF headers: Connection: - keep-alive +EOF + fi + + #h2 + if [ ! -z "$h2_host" ] && [ "$obfs_vmess" = "network: h2" ]; then +cat >> "$SERVER_FILE" <<-EOF + h2-opts: + host: +EOF + config_list_foreach "$section" "h2_host" set_h2_host + fi + if [ ! -z "$h2_path" ] && [ "$obfs_vmess" = "network: h2" ]; then +cat >> "$SERVER_FILE" <<-EOF + path: $h2_path EOF fi fi @@ -677,13 +720,21 @@ cat >> "$SERVER_FILE" <<-EOF EOF fi cat /tmp/Proxy_Provider >> $SERVER_FILE 2>/dev/null -${UCI_SET}rule_source="ConnersHua" -${UCI_SET}GlobalTV="GlobalTV" -${UCI_SET}AsianTV="AsianTV" -${UCI_SET}Proxy="Proxy" -${UCI_SET}AdBlock="AdBlock" -${UCI_SET}Domestic="Domestic" -${UCI_SET}Others="Others" +config_load "openclash" +config_foreach yml_other_rules_del "other_rules" "$CONFIG_NAME" "ConnersHua" +uci_name_tmp=$(uci add openclash other_rules) +uci_set="uci -q set openclash.$uci_name_tmp." +${UCI_SET}rule_source="1" +${uci_set}enable="1" +${uci_set}rule_name="ConnersHua" +${uci_set}config="$CONFIG_NAME" +${uci_set}GlobalTV="GlobalTV" +${uci_set}AsianTV="AsianTV" +${uci_set}Proxy="Proxy" +${uci_set}AdBlock="AdBlock" +${uci_set}Domestic="Domestic" +${uci_set}Others="Others" + [ "$config_auto_update" -eq 1 ] && [ "$new_servers_group_set" -eq 1 ] && { ${UCI_SET}servers_update="1" ${UCI_DEL_LIST}="Auto - UrlTest" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Auto - UrlTest" >/dev/null 2>&1 @@ -881,22 +932,30 @@ cat >> "$SERVER_FILE" <<-EOF EOF fi cat /tmp/Proxy_Provider >> $SERVER_FILE 2>/dev/null -${UCI_SET}rule_source="lhie1" -${UCI_SET}GlobalTV="GlobalTV" -${UCI_SET}AsianTV="AsianTV" -${UCI_SET}Proxy="Proxy" -${UCI_SET}Youtube="Youtube" -${UCI_SET}Apple="Apple" -${UCI_SET}Microsoft="Microsoft" -${UCI_SET}Netflix="Netflix" -${UCI_SET}Spotify="Spotify" -${UCI_SET}Steam="Steam" -${UCI_SET}AdBlock="AdBlock" -${UCI_SET}Speedtest="Speedtest" -${UCI_SET}Telegram="Telegram" -${UCI_SET}PayPal="PayPal" -${UCI_SET}Domestic="Domestic" -${UCI_SET}Others="Others" +config_load "openclash" +config_foreach yml_other_rules_del "other_rules" "$CONFIG_NAME" "lhie1" +uci_name_tmp=$(uci add openclash other_rules) +uci_set="uci -q set openclash.$uci_name_tmp." +${UCI_SET}rule_source="1" +${uci_set}enable="1" +${uci_set}rule_name="lhie1" +${uci_set}config="$CONFIG_NAME" +${uci_set}GlobalTV="GlobalTV" +${uci_set}AsianTV="AsianTV" +${uci_set}Proxy="Proxy" +${uci_set}Youtube="Youtube" +${uci_set}Apple="Apple" +${uci_set}Microsoft="Microsoft" +${uci_set}Netflix="Netflix" +${uci_set}Spotify="Spotify" +${uci_set}Steam="Steam" +${uci_set}AdBlock="AdBlock" +${uci_set}Speedtest="Speedtest" +${uci_set}Telegram="Telegram" +${uci_set}PayPal="PayPal" +${uci_set}Domestic="Domestic" +${uci_set}Others="Others" + [ "$config_auto_update" -eq 1 ] && [ "$new_servers_group_set" -eq 1 ] && { ${UCI_SET}servers_update="1" ${UCI_DEL_LIST}="Auto - UrlTest" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Auto - UrlTest" >/dev/null 2>&1 @@ -954,9 +1013,16 @@ cat >> "$SERVER_FILE" <<-EOF - Proxy - DIRECT EOF -${UCI_SET}rule_source="ConnersHua_return" -${UCI_SET}Proxy="Proxy" -${UCI_SET}Others="Others" +config_load "openclash" +config_foreach yml_other_rules_del "other_rules" "$CONFIG_NAME" "ConnersHua_return" +uci_name_tmp=$(uci add openclash other_rules) +uci_set="uci -q set openclash.$uci_name_tmp." +${UCI_SET}rule_source="1" +${uci_set}enable="1" +${uci_set}rule_name="ConnersHua_return" +${uci_set}config="$CONFIG_NAME" +${uci_set}Proxy="Proxy" +${uci_set}Others="Others" [ "$config_auto_update" -eq 1 ] && [ "$new_servers_group_set" -eq 1 ] && { ${UCI_SET}servers_update="1" ${UCI_DEL_LIST}="Auto - UrlTest" >/dev/null 2>&1 && ${UCI_ADD_LIST}="Auto - UrlTest" >/dev/null 2>&1 diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_rules_change.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_rules_change.sh index 66f3e71ea7..63d6715c0a 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_rules_change.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_rules_change.sh @@ -63,10 +63,8 @@ yml_other_set() puts '${LOGTIME} Set Custom Rules Error: ' + e.message end begin - if $7 == 1 and Value.has_key?('rules') then - ruby_add_index = Value['rules'].index(Value['rules'].grep(/(GEOIP|MATCH|FINAL)/).first) - ruby_add_index ||= -1 - Value['rules']=Value['rules'].to_a.insert(ruby_add_index, + if $5 == 1 then + Value['rules']=Value['rules'].to_a.insert(0, 'DOMAIN-KEYWORD,tracker,DIRECT', 'DOMAIN-KEYWORD,announce.php?passkey=,DIRECT', 'DOMAIN-KEYWORD,torrent,DIRECT', @@ -77,16 +75,37 @@ yml_other_set() 'DOMAIN-KEYWORD,BitTorrent,DIRECT', 'DOMAIN-KEYWORD,announce_peer,DIRECT' ) + begin + match_group=Value['rules'].grep(/(MATCH|FINAL)/)[0] + if not match_group.empty? and not match_group.nil? then + common_port_group=match_group.split(',')[2] or common_port_group=match_group.split(',')[1] + if not common_port_group.empty? and not common_port_group.nil? then + ruby_add_index = Value['rules'].index(Value['rules'].grep(/(MATCH|FINAL)/).first) + ruby_add_index ||= -1 + Value['rules']=Value['rules'].to_a.insert(ruby_add_index, + 'DST-PORT,80,' + common_port_group, + 'DST-PORT,443,' + common_port_group, + 'DST-PORT,22,' + common_port_group + ) + end + end + rescue Exception => e + puts '${LOGTIME} Set BT/P2P Common Port Rules Error: ' + e.message + end Value['rules'].to_a.collect!{|x|x.to_s.gsub(/(^MATCH.*|^FINAL.*)/, 'MATCH,DIRECT')} end; rescue Exception => e - puts '${LOGTIME} Set Bt DIRECT Rules Error: ' + e.message + puts '${LOGTIME} Set BT/P2P DIRECT Rules Error: ' + e.message end begin - if Value.has_key?('rules') and Value['rules'].to_a.grep(/(?=.*198.18)(?=.*REJECT)/).empty? then - ruby_add_index = Value['rules'].index(Value['rules'].grep(/(GEOIP|MATCH|FINAL)/).first) - ruby_add_index ||= -1 - Value['rules']=Value['rules'].to_a.insert(ruby_add_index,'IP-CIDR,198.18.0.1/16,REJECT,no-resolve') + if Value.has_key?('rules') and not Value['rules'].to_a.empty? then + if Value['rules'].to_a.grep(/(?=.*198.18)(?=.*REJECT)/).empty? then + ruby_add_index = Value['rules'].index(Value['rules'].grep(/(GEOIP|MATCH|FINAL)/).first) + ruby_add_index ||= -1 + Value['rules']=Value['rules'].to_a.insert(ruby_add_index,'IP-CIDR,198.18.0.1/16,REJECT,no-resolve') + end + else + Value['rules']=%w(IP-CIDR,198.18.0.1/16,REJECT,no-resolve) end; rescue Exception => e puts '${LOGTIME} Set 198.18.0.1/16 REJECT Rule Error: ' + e.message @@ -95,42 +114,66 @@ yml_other_set() end" 2>/dev/null >> $LOG_FILE } -if [ "$2" != 0 ]; then +yml_other_rules_get() +{ + local section="$1" + local enabled config + config_get_bool "enabled" "$section" "enabled" "1" + config_get "config" "$section" "config" "" + + if [ "$enabled" = "0" ] || [ "$config" != "$2" ]; then + return + fi + + if [ -n "$rule_name" ]; then + echo "${LOGTIME} Warrning: Multiple Other-Rules-Configurations Enabled, Ignore..." >> $LOG_FILE + return + fi + + config_get "rule_name" "$section" "rule_name" "" + config_get "GlobalTV" "$section" "GlobalTV" "" + config_get "AsianTV" "$section" "AsianTV" "" + config_get "Proxy" "$section" "Proxy" "" + config_get "Youtube" "$section" "Youtube" "" + config_get "Apple" "$section" "Apple" "" + config_get "Netflix" "$section" "Netflix" "" + config_get "Spotify" "$section" "Spotify" "" + config_get "Steam" "$section" "Steam" "" + config_get "AdBlock" "$section" "AdBlock" "" + config_get "Netease_Music" "$section" "Netease_Music" "" + config_get "Speedtest" "$section" "Speedtest" "" + config_get "Telegram" "$section" "Telegram" "" + config_get "Microsoft" "$section" "Microsoft" "" + config_get "PayPal" "$section" "PayPal" "" + config_get "Domestic" "$section" "Domestic" "" + config_get "Others" "$section" "Others" "" +} + +if [ "$2" != "0" ]; then + config_load "openclash" + config_foreach yml_other_rules_get "other_rules" "$6" + if [ -z "$rule_name" ]; then + yml_other_set "$1" "$2" "$3" "$4" "$5" + exit 0 #判断策略组是否存在 - GlobalTV=$(uci get openclash.config.GlobalTV 2>/dev/null) - AsianTV=$(uci get openclash.config.AsianTV 2>/dev/null) - Proxy=$(uci get openclash.config.Proxy 2>/dev/null) - Youtube=$(uci get openclash.config.Youtube 2>/dev/null) - Apple=$(uci get openclash.config.Apple 2>/dev/null) - Netflix=$(uci get openclash.config.Netflix 2>/dev/null) - Spotify=$(uci get openclash.config.Spotify 2>/dev/null) - Steam=$(uci get openclash.config.Steam 2>/dev/null) - AdBlock=$(uci get openclash.config.AdBlock 2>/dev/null) - Netease_Music=$(uci get openclash.config.Netease_Music 2>/dev/null) - Speedtest=$(uci get openclash.config.Speedtest 2>/dev/null) - Telegram=$(uci get openclash.config.Telegram 2>/dev/null) - Microsoft=$(uci get openclash.config.Microsoft 2>/dev/null) - PayPal=$(uci get openclash.config.PayPal 2>/dev/null) - Domestic=$(uci get openclash.config.Domestic 2>/dev/null) - Others=$(uci get openclash.config.Others 2>/dev/null) - if [ "$2" = "ConnersHua_return" ]; then + elif [ "$rule_name" = "ConnersHua_return" ]; then if [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ];then - echo "${1} Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" >>/tmp/openclash.log - yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" + echo "${1} Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" >> $LOG_FILE + yml_other_set "$1" "$2" "$3" "$4" "$5" exit 0 fi - elif [ "$2" = "ConnersHua" ]; then + elif [ "$rule_name" = "ConnersHua" ]; then if [ -z "$(grep "$GlobalTV" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$AsianTV" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then - echo "${1} Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" >>/tmp/openclash.log - yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" + echo "${1} Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" >> $LOG_FILE + yml_other_set "$1" "$2" "$3" "$4" "$5" exit 0 fi - elif [ "$2" = "lhie1" ]; then + elif [ "$rule_name" = "lhie1" ]; then if [ -z "$(grep -F "$GlobalTV" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$AsianTV" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\ @@ -146,14 +189,14 @@ if [ "$2" != 0 ]; then || [ -z "$(grep -F "$PayPal" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ]\ || [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then - echo "${1} Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" >>/tmp/openclash.log - yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" + echo "${1} Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!" >> $LOG_FILE + yml_other_set "$1" "$2" "$3" "$4" "$5" exit 0 fi fi - if [ "$Proxy" = "读取错误,配置文件异常!" ]; then - echo "${1} Warning: Can not Get The Porxy-Group's Name, Stop Setting The Other Rules!" >>/tmp/openclash.log - yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" + if [ -z "$Proxy" ]; then + echo "${1} Error: Missing Porxy-Group's Name, Stop Setting The Other Rules!" >> $LOG_FILE + yml_other_set "$1" "$2" "$3" "$4" "$5" exit 0 else #删除原有的部分,防止冲突 @@ -163,7 +206,7 @@ if [ "$2" != 0 ]; then if [ -n "$(ruby_read "$4" "['rules']")" ]; then ruby_edit "$4" "['rules'].clear" fi - if [ "$2" = "lhie1" ]; then + if [ "$rule_name" = "lhie1" ]; then ruby -ryaml -E UTF-8 -e " begin Value = YAML.load_file('$4'); @@ -216,7 +259,7 @@ if [ "$2" != 0 ]; then rescue Exception => e puts '${LOGTIME} Set lhie1 Rules Error: ' + e.message end" 2>/dev/null >> $LOG_FILE - elif [ "$2" = "ConnersHua" ]; then + elif [ "$rule_name" = "ConnersHua" ]; then ruby -ryaml -E UTF-8 -e " begin Value = YAML.load_file('$4'); @@ -241,7 +284,7 @@ if [ "$2" != 0 ]; then }; File.open('$4','w') {|f| YAML.dump(Value, f)}; rescue Exception => e - puts '${LOGTIME} Set lhie1 Rules Error: ' + e.message + puts '${LOGTIME} Set ConnersHua Rules Error: ' + e.message end" 2>/dev/null >> $LOG_FILE else ruby -ryaml -E UTF-8 -e " @@ -256,10 +299,10 @@ if [ "$2" != 0 ]; then }; File.open('$4','w') {|f| YAML.dump(Value, f)}; rescue Exception => e - puts '${LOGTIME} Set lhie1 Rules Error: ' + e.message + puts '${LOGTIME} Set ConnersHua Return Rules Error: ' + e.message end" 2>/dev/null >> $LOG_FILE fi fi fi -yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" +yml_other_set "$1" "$2" "$3" "$4" "$5"