diff --git a/package/ntlf9t/luci-app-clash/Makefile b/package/ntlf9t/luci-app-clash/Makefile index d81c4c36da..c98bd0c53a 100644 --- a/package/ntlf9t/luci-app-clash/Makefile +++ b/package/ntlf9t/luci-app-clash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-clash -PKG_VERSION:=1.5.5 +PKG_VERSION:=1.5.8 PKG_MAINTAINER:=frainzy1477 @@ -10,9 +10,9 @@ include $(INCLUDE_DIR)/package.mk define Package/luci-app-clash SECTION:=luci CATEGORY:=LuCI - SUBMENU:=3. Applications + SUBMENU:=2. Clash TITLE:=LuCI app for clash - DEPENDS:=+luci-base +luci-compat +wget +iptables +coreutils-base64 +coreutils +coreutils-nohup +bash +ipset +libustream-openssl +libopenssl +openssl-util +curl +jsonfilter +ca-certificates + DEPENDS:=+luci-compat +luci-base +wget +iptables +coreutils-base64 +coreutils +coreutils-nohup +bash +ipset +libustream-openssl +libopenssl +openssl-util +curl +jsonfilter +ca-certificates PKGARCH:=all MAINTAINER:=frainzy1477 endef @@ -68,6 +68,7 @@ if [ -z "$${IPKG_INSTROOT}" ]; then mv /usr/share/clash/config/sub/config.yaml /usr/share/clashbackup/config.bak1 2>/dev/null mv /usr/share/clash/config/upload/config.yaml /usr/share/clashbackup/config.bak2 2>/dev/null mv /usr/share/clash/config/custom/config.yaml /usr/share/clashbackup/config.bak3 2>/dev/null + fi exit 0 @@ -83,7 +84,7 @@ if [ -z "$${IPKG_INSTROOT}" ]; then mv /usr/share/clashbackup/config.bak2 /usr/share/clash/config/upload/config.yaml 2>/dev/null mv /usr/share/clashbackup/config.bak3 /usr/share/clash/config/custom/config.yaml 2>/dev/null /etc/init.d/clash disable 2>/dev/null - uci set clash.config.p_mode="Rule" && uci commit clash 2>/dev/null + uci set clash.config.p_mode="Rule" && uci set clash.config.auto_clear_log="1" && uci set clash.config.auto_update="1" && uci set clash.config.auto_update_time="12" && uci set clash.config.clear_time="12" && uci commit clash 2>/dev/null fi exit 0 @@ -105,8 +106,10 @@ define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/share/clash/dashboard $(INSTALL_DIR) $(1)/usr/share/clash/dashboard/img $(INSTALL_DIR) $(1)/usr/share/clash/dashboard/js + $(INSTALL_DIR) $(1)/usr/share/clash/yacd $(INSTALL_DIR) $(1)/etc/clash/clashtun $(INSTALL_DIR) $(1)/etc/clash/dtun + $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_DIR) $(1)/usr/share/clashbackup $(INSTALL_DIR) $(1)/etc/clash/provider $(INSTALL_DIR) $(1)/usr/share/clash/config @@ -138,10 +141,11 @@ define Package/$(PKG_NAME)/install $(INSTALL_BIN) ./root/usr/share/clash/clash.txt $(1)/usr/share/clash/ $(INSTALL_BIN) ./root/usr/share/clash/dashboard/index.html $(1)/usr/share/clash/dashboard/ - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.0bddb85299f970595cb5.css $(1)/usr/share/clash/dashboard/ + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.f302eae39f433a9c3fa1.css $(1)/usr/share/clash/dashboard/ $(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/33343e6117c37aaef8886179007ba6b5.png $(1)/usr/share/clash/dashboard/img/ - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js $(1)/usr/share/clash/dashboard/js/ - $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.0bddb85299f970595cb5.min.js $(1)/usr/share/clash/dashboard/js/ + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.f302eae39f433a9c3fa1.min.js $(1)/usr/share/clash/dashboard/js/ + $(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.f302eae39f433a9c3fa1.min.js $(1)/usr/share/clash/dashboard/js/ + $(INSTALL_BIN) ./root/usr/share/clash/yacd/* $(1)/usr/share/clash/yacd/ $(INSTALL_DATA) ./luasrc/clash.lua $(1)/usr/lib/lua/luci/ $(INSTALL_DATA) ./luasrc/controller/*.lua $(1)/usr/lib/lua/luci/controller/ diff --git a/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua b/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua index a0e06f442d..159994fafe 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/controller/clash.lua @@ -20,9 +20,9 @@ function index() entry({"admin", "services", "clash", "config"},cbi("clash/config"),_("Config"), 30).leaf = true entry({"admin", "services", "clash", "create"},cbi("clash/create"),_("Create Config"), 40).leaf = true - entry({"admin", "services", "clash", "servers"},cbi("clash/servers-config"), nil).leaf = true + entry({"admin", "services", "clash", "servers"},cbi("clash/servers-config"), nil).leaf = true entry({"admin", "services", "clash", "provider"},cbi("clash/provider-config"), nil).leaf = true - entry({"admin", "services", "clash", "groups"},cbi("clash/groups"), nil).leaf = true + entry({"admin", "services", "clash", "groups"},cbi("clash/groups"), nil).leaf = true entry({"admin", "services", "clash", "settings"}, firstchild(),_("Settings"), 50) entry({"admin", "services", "clash", "settings", "port"},cbi("clash/port"),_("Proxy Ports"), 60).leaf = true @@ -31,8 +31,11 @@ function index() entry({"admin", "services", "clash", "settings", "list"},cbi("clash/list"),_("Custom List"), 90).leaf = true entry({"admin", "services", "clash", "settings", "grules"},cbi("clash/game-settings"),_("Game Rules"), 91).dependent = false - entry({"admin", "services", "clash", "g-rules"},cbi("clash/game-rule"), nil).leaf = true - + entry({"admin", "services", "clash", "g-rules"},cbi("clash/game-rule"), nil).leaf = true + entry({"admin", "services", "clash", "settings", "other"},cbi("clash/other"),_("Other Settings"), 92).leaf = true + entry({"admin", "services", "clash", "ip-rules"},cbi("clash/ip-rules"), nil).leaf = true + + entry({"admin","services","clash","status"},call("action_status")).leaf=true entry({"admin", "services", "clash", "log"},cbi("clash/log"),_("Log"), 150).leaf = true entry({"admin", "services", "clash", "update"},cbi("clash/update"),_("Update"), 160).leaf = true diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua index 05c336f730..46d49ce5a2 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/client.lua @@ -36,6 +36,12 @@ o:value("1", translate("Enable")) o.description = translate("Set rules under Setting=>Game Rules, will take effect when client start") +o = s:option(ListValue, "append_rules", translate("Append Customs Rules")) +o.default = "0" +o:value("0", translate("Disable")) +o:value("1", translate("Enable")) +o.description = translate("Set custom rules under Setting=>Others , will take effect when client start") + o = s:option(Button, "Apply") o.title = translate("Save & Apply") o.inputtitle = translate("Save & Apply") diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/import.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/import.lua index d36edb9ef4..eec8827f2d 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/import.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/import.lua @@ -9,28 +9,7 @@ local fs = require "luci.clash" local http = luci.http local clash = "clash" -kk = Map(clash) -r = kk:section(TypedSection, "clash", translate("Auto Update Config")) -r.anonymous = true -kk.pageaction = false -o = r:option(Flag, "auto_update", translate("Auto Update")) -o.description = translate("Auto Update Server subscription") - -o = r:option(ListValue, "auto_update_time", translate("Update time (every day)")) -for t = 0,23 do -o:value(t, t..":00") -end -o.default=0 -o.description = translate("Daily Server subscription update time. Only update config in use") - -o = r:option(Button, "Apply") -o.title = translate("Save & Apply") -o.inputtitle = translate("Save & Apply") -o.inputstyle = "apply" -o.write = function() - kk.uci:commit("clash") -end kr = Map(clash) @@ -138,4 +117,4 @@ if luci.http.formvalue("upload") then end -return kr,kk,ko +return kr,ko diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/ip-rules.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/ip-rules.lua new file mode 100644 index 0000000000..3cc61692e4 --- /dev/null +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/ip-rules.lua @@ -0,0 +1,52 @@ +local m, s, o +local clash = "clash" +local uci = luci.model.uci.cursor() +local fs = require "nixio.fs" +local sys = require "luci.sys" +local sid = arg[1] + + +m = Map(clash, translate("Edit Custom Rule & Group")) +--m.pageaction = false +m.redirect = luci.dispatcher.build_url("admin/services/clash/settings/other") +if m.uci:get(clash, sid) ~= "addtype" then + luci.http.redirect(m.redirect) + return +end + + +s = m:section(NamedSection, sid, "addtype") +s.anonymous = true +s.addremove = false + + +o = s:option(ListValue, "type", translate("Rule Type")) +o.rmempty = false +o.description = translate("Choose Type") +o:value("DST-PORT", translate("DST-PORT")) +o:value("SRC-PORT", translate("SRC-PORT")) +o:value("SRC-IP-CIDR", translate("SRC-IP-CIDR")) +o:value("IP-CIDR", translate("IP-CIDR")) +o:value("DOMAIN", translate("DOMAIN")) +o:value("DOMAIN-KEYWORD", translate("DOMAIN-KEYWORD")) +o:value("DOMAIN-SUFFIX", translate("DOMAIN-SUFFIX")) + + +o = s:option(ListValue, "pgroup", translate("Select Proxy Group")) +uci:foreach("clash", "conf_groups", + function(s) + if s.name ~= "" and s.name ~= nil then + o:value(s.name) + end + end) +o:value("DIRECT") +o:value("REJECT") +o.rmempty = false +o.description = translate("Select a policy group to add rule") + + +o = s:option(Value, "ipaaddr", translate("IP/Domain/Address/Keyword/Port")) +o.rmempty = false + + +return m diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/other.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/other.lua new file mode 100644 index 0000000000..ea671200b2 --- /dev/null +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/other.lua @@ -0,0 +1,128 @@ + +local NXFS = require "nixio.fs" +local SYS = require "luci.sys" +local HTTP = require "luci.http" +local DISP = require "luci.dispatcher" +local UTIL = require "luci.util" +local uci = luci.model.uci.cursor() +local fs = require "luci.clash" +local http = luci.http +local clash = "clash" + +kk = Map(clash) +s = kk:section(TypedSection, "clash", translate("Auto Update Config")) +s.anonymous = true +kk.pageaction = false + +o = s:option(Flag, "auto_update", translate("Auto Update")) +o.description = translate("Auto Update Server subscription") + +o = s:option(ListValue, "auto_update_time", translate("Update time (every day)")) +o:value("1", translate("Every Hour")) +o:value("6", translate("Every 6 Hours")) +o:value("12", translate("Every 12 Hours")) +o:value("24", translate("Every 24 Hours")) +o.description = translate("Daily Server subscription update time. Only update config in use") + +o = s:option(Button, "Apply") +o.title = translate("Save & Apply") +o.inputtitle = translate("Save & Apply") +o.inputstyle = "apply" +o.write = function() + kk.uci:commit("clash") +end + + + + +m = Map("clash") +s = m:section(TypedSection, "clash" , translate("Clear Clash Log")) +s.anonymous = true + +o = s:option(Flag, "auto_clear_log", translate("Auto Clear Log")) +o.description = translate("Auto Clear Log") + + +o = s:option(ListValue, "clear_time", translate("Clear Time (Time of Day)")) +o:value("1", translate("Every Hour")) +o:value("6", translate("Every 6 Hours")) +o:value("12", translate("Every 12 Hours")) +o:value("24", translate("Every 24 Hours")) +o.description = translate("Clear Log Time") + +o=s:option(Button,"clear_clear") +o.inputtitle = translate("Save & Apply") +o.title = translate("Save & Apply") +o.inputstyle = "reload" +o.write = function() + m.uci:commit("clash") +end + + +y = Map("clash") +x = y:section(TypedSection, "addtype", translate("Custom Rules")) +x.anonymous = true +x.addremove = true +x.sortable = false +x.template = "cbi/tblsection" +x.extedit = luci.dispatcher.build_url("admin/services/clash/ip-rules/%s") +function x.create(...) + local sid = TypedSection.create(...) + if sid then + luci.http.redirect(x.extedit % sid) + return + end +end + +o = x:option(DummyValue, "type", translate("Rule Type")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or translate("None") +end + +o = x:option(DummyValue, "ipaaddr", translate("IP/Domain/Address/Keyword/Port")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or translate("None") +end + + +o = x:option(DummyValue, "pgroup", translate("Policy Groups")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or translate("None") +end + + + +local t = { + {Load,Apply} +} + +k = Form("apply") +k.reset = false +k.submit = false +s = k:section(Table, t) + + +o = s:option(Button, "Load") +o.inputtitle = translate("Load Groups") +o.inputstyle = "apply" +o.write = function() + m.uci:commit("clash") + luci.sys.call("bash /usr/share/clash/load_groups.sh >/dev/null 2>&1 &") + luci.sys.call("sleep 3") + HTTP.redirect(luci.dispatcher.build_url("admin", "services", "clash", "settings", "other")) +end + +o = s:option(Button, "Apply") +o.inputtitle = translate("Save & Apply") +o.inputstyle = "apply" +o.write = function() + m.uci:commit("clash") + if luci.sys.call("pidof clash >/dev/null") == 0 then + SYS.call("/etc/init.d/clash restart >/dev/null 2>&1 &") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "clash")) + else + HTTP.redirect(luci.dispatcher.build_url("admin", "services", "clash", "settings", "other")) + end +end + +return kk, m,y,k diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/servers-config.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/servers-config.lua index 9be494b353..1139cf610f 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/servers-config.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/servers-config.lua @@ -257,6 +257,7 @@ o:depends("obfs", "websocket") o:depends("type", "vmess") o:depends("type", "socks5") o:depends("type", "http") +o:depends("obfs_vmess", "none") -- [[ TLS ]]-- o = s:option(ListValue, "tls", translate("TLS")) @@ -267,6 +268,7 @@ o:value("false") o:depends("type", "vmess") o:depends("type", "socks5") o:depends("type", "http") +o:depends("obfs_vmess", "none") local apply = luci.http.formvalue("cbi.apply") if apply then diff --git a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update.lua b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update.lua index 9f173f75f0..5d33ce9152 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update.lua +++ b/package/ntlf9t/luci-app-clash/luasrc/model/cbi/clash/update.lua @@ -7,6 +7,7 @@ local uci = require("luci.model.uci").cursor() local m , r, k local http = luci.http +font_red = [[]] font_green = [[]] font_off = [[]] bold_on = [[]] @@ -17,24 +18,50 @@ bold_off = [[]] ko = Map("clash") ko.reset = false ko.submit = false -sul =ko:section(TypedSection, "clash","") +sul =ko:section(TypedSection, "clash",translate("Manual Upload")) sul.anonymous = true sul.addremove=false o = sul:option(FileUpload, "") -o.description = translate("NB: Upload only Dreamacro clash tun core - (https://github.com/Dreamacro/clash/releases/tag/TUN)") +o.description =''..font_red..bold_on..translate("Manually download, unzip and rename clash core from links below and upload")..bold_off..font_off..' ' +.."
" +..translate("Dreamacro clash tun core (dtun) - (https://github.com/Dreamacro/clash/releases/tag/TUN)") +.."
" +..translate("comzyh clash tun core (ctun) - (https://github.com/comzyh/clash/releases)") +.."
" +..translate("Dreamacro clash core - (https://github.com/Dreamacro/clash/releases)") +.."
" +..translate("Frainzy1477 clashr core - (https://github.com/frainzy1477/clashrdev/releases)") +.."
" +..translate("Frainzy1477 clash core - (https://github.com/frainzy1477/clash_dev/releases)") +.."
" +..translate("Frainzy1477 clash(ctun) core - (https://github.com/frainzy1477/clashtun/releases)") + o.title = translate(" ") -o.template = "clash/clash_upload" +o.template = "clash/upload_core" um = sul:option(DummyValue, "", nil) um.template = "clash/clash_dvalue" -local dir, fd -dir = "/etc/clash/dtun/" +local dir, fd,dtun,ctun,cssr +dir = "/etc/clash/" +cssr="/usr/bin/" +dtun="/etc/clash/dtun/" +ctun="/etc/clash/clashtun/" + http.setfilehandler( function(meta, chunk, eof) + local fp = HTTP.formvalue("file_type") if not fd then if not meta then return end - - if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end + + if fp == "clash" then + if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end + elseif fp == "clashr" then + if meta and chunk then fd = nixio.open(cssr .. meta.file, "w") end + elseif fp == "clashctun" then + if meta and chunk then fd = nixio.open(ctun .. meta.file, "w") end + elseif fp == "clashdtun" then + if meta and chunk then fd = nixio.open(dtun .. meta.file, "w") end + end if not fd then um.value = translate("upload file error.") @@ -47,8 +74,21 @@ http.setfilehandler( if eof and fd then fd:close() fd = nil - SYS.exec("chmod 755 /etc/clash/dtun/clash 2>&1 &") - um.value = translate("File saved to") .. ' "/etc/clash/dtun/"' + + if fp == "clash" then + SYS.exec("chmod 755 /etc/clash/clash 2>&1 &") + um.value = translate("File saved to") .. ' "/etc/clash/'..meta.file..'"' + elseif fp == "clashr" then + SYS.exec("chmod 755 /usr/bin/clash 2>&1 &") + um.value = translate("File saved to") .. ' "/usr/bin/'..meta.file..'"' + elseif fp == "clashctun" then + SYS.exec("chmod 755 /etc/clash/clashtun/clash 2>&1 &") + um.value = translate("File saved to") .. ' "/etc/clash/clashtun/'..meta.file..'"' + elseif fp == "clashdtun" then + SYS.exec("chmod 755 /etc/clash/dtun/clash 2>&1 &") + um.value = translate("File saved to") .. ' "/etc/clash/dtun/'..meta.file..'"' + end + end end @@ -68,7 +108,7 @@ m:section(SimpleSection).template = "clash/update" m.pageaction = false k = Map("clash") -s = k:section(TypedSection, "clash") +s = k:section(TypedSection, "clash",translate("Download Online")) s.anonymous = true o = s:option(ListValue, "dcore", translate("Core Type")) o.default = "clashcore" diff --git a/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm b/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm index 2c38a2921b..6fdf276f23 100644 --- a/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm +++ b/package/ntlf9t/luci-app-clash/luasrc/view/clash/status.htm @@ -13,6 +13,7 @@ <%:Clash Config%><%:Collecting data...%> <%:Config Type%><%:Collecting data...%> <%:Clash Dashboard%> <%:Collecting data...%> + <%:Yacd Dashboard%> <%:Collecting data...%> @@ -74,7 +75,7 @@ let IP = { }, getIpipnetIP: () => { - IP.get(`https://myip.ipip.net/?z=${random}`, 'text') + IP.get(`http://myip.ipip.net/?z=${random}`, 'text') .then((resp) => { let data = resp.data.replace('当前 IP:', '').split(' 来自于:'); document.getElementById('d-ip').innerHTML = `${data[0]} ${data[1]}`; @@ -130,7 +131,7 @@ var HTTP = { var tbip = document.getElementsByTagName('HEAD').item(0); var tbipScript= document.createElement("script"); tbipScript.async = "async"; - tbipScript.src='https://myip.ipip.net/?z=${random}'; + tbipScript.src='http://myip.ipip.net/?z=${random}'; tbip.appendChild( tbipScript); var sbip = document.getElementsByTagName('HEAD').item(0); @@ -143,9 +144,10 @@ var HTTP = { const $$ = document; random = parseInt(Math.random() * 100000000); - setTimeout("Load()",1000*8); + setTimeout("Load()",1000*8); } var web = document.getElementById('_web'); + var webb = document.getElementById('_webb'); var clash = document.getElementById('_clash'); var ip = document.getElementById('_ip'); var port = document.getElementById('_port'); @@ -159,6 +161,7 @@ var HTTP = { XHR.poll(1, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) { if ( x && x.status == 200 ) { web.innerHTML = status.clash ? '<%:DASHBOARD%>' : '<%:NOT RUNNING%>'; + webb.innerHTML = status.clash ? '<%:DASHBOARD%>' : '<%:NOT RUNNING%>'; clash.innerHTML = status.clash ? '<%:RUNNING%> ' : '<%:NOT RUNNING%>'; ip.innerHTML = status.localip ? ''+status.localip+' ' : '<%:NOT SET%>'; port.innerHTML = status.dash_port ? ''+status.dash_port+' ' : '<%:NOT SET%>'; diff --git a/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm b/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm new file mode 100644 index 0000000000..bff2304b7e --- /dev/null +++ b/package/ntlf9t/luci-app-clash/luasrc/view/clash/upload_core.htm @@ -0,0 +1,12 @@ +<%+cbi/valueheader%> + + + + +<%+cbi/valuefooter%> + diff --git a/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po b/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po index dda29073a1..75487142be 100644 --- a/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po +++ b/package/ntlf9t/luci-app-clash/po/zh_Hans/clash.po @@ -269,10 +269,7 @@ msgid "DASHBOARD" msgstr "外部控制" msgid "Clash Dashboard" -msgstr "Clash外部控制" - -msgid "Yac Dashboard" -msgstr "Yacd外部控制" +msgstr "Clash控制面板" msgid "Client" msgstr "客户端" @@ -964,3 +961,63 @@ msgstr "读取代理集" msgid "Enable to read Proxy Provider" msgstr "启用读取代理集" + +msgid "Every Hour" +msgstr "每个小时" + +msgid "Every 6 Hours" +msgstr "每个6小时" + +msgid "Every 12 Hours" +msgstr "每个12小时" + +msgid "Every 24 Hours" +msgstr "每个24小时" + +msgid "Clear Clash Log" +msgstr "清除日志" + +msgid "Auto Clear Log" +msgstr "自动清除日志" + +msgid "Clear Time (Time of Day)" +msgstr "清除时间(一天中的时间)" + +msgid "Clear Log Time" +msgstr "清除日志时间" + +msgid "Other Settings" +msgstr "其他设置" + +msgid "Rule Type" +msgstr "规则类型" + +msgid "Choose Type" +msgstr "选择类型" + +msgid "Set custom rules under Setting=>Others , will take effect when client start" +msgstr "在“设置”=>“其他”下设置自定义规则,将在客户端启动时生效" + +msgid "Append Customs Rules" +msgstr "附加自定义规则" + +msgid "Edit Custom Rule & Group" +msgstr "编辑自定义规则组" + +msgid "Custom Rules" +msgstr "自定义规则" + +msgid "IP/Domain/Address/Keyword/Port" +msgstr "IP/域/地址/关键字/端口" + +msgid "Manually download, unzip and rename clash core from links below and upload" +msgstr "从下面的链接手动下载、解压和重命名到clash然后上载" + +msgid "Manual Upload" +msgstr "手动上载" + +msgid "Download Online" +msgstr "在线下载" + +msgid "Yacd Dashboard" +msgstr "Yacd控制面板" \ No newline at end of file diff --git a/package/ntlf9t/luci-app-clash/root/etc/config/clash b/package/ntlf9t/luci-app-clash/root/etc/config/clash index 757c37d28c..586652edd2 100644 --- a/package/ntlf9t/luci-app-clash/root/etc/config/clash +++ b/package/ntlf9t/luci-app-clash/root/etc/config/clash @@ -23,6 +23,12 @@ config clash 'config' option dnscache '0' option config_type '1' option p_mode 'Rule' + option auto_clear_log '1' + option auto_update '1' + option auto_update_time '12' + option clear_time '12' + option append_rules '0' + config groups option old_name '❌AdBlock' @@ -51,4 +57,27 @@ config groups option name '🔑Proxy' list other_group 'ALL' +config addtype + option type 'SRC-IP-CIDR' + option pgroup 'DIRECT' + list ipaaddr '192.168.1.4/30' +config addtype + option type 'SRC-IP-CIDR' + option pgroup 'DIRECT' + option ipaaddr '192.168.1.2/31' + +config addtype + option type 'DOMAIN-KEYWORD' + option pgroup 'DIRECT' + option ipaaddr 'baidu' + +config addtype + option type 'SRC-PORT' + option pgroup 'DIRECT' + option ipaaddr '22' + +config addtype + option type 'DST-PORT' + option pgroup 'DIRECT' + option ipaaddr '443' diff --git a/package/ntlf9t/luci-app-clash/root/etc/init.d/clash b/package/ntlf9t/luci-app-clash/root/etc/init.d/clash old mode 100755 new mode 100644 index e72fa45adf..9c045ee67b --- a/package/ntlf9t/luci-app-clash/root/etc/init.d/clash +++ b/package/ntlf9t/luci-app-clash/root/etc/init.d/clash @@ -34,13 +34,17 @@ add_cron(){ config_type=$(uci get clash.config.config_type 2>/dev/null) #=========================================================================================================================== sed -i '/clash.txt/d' $CRON_FILE - echo '0 0 * * 0 echo "" >> /usr/share/clash/clash.txt' >> $CRON_FILE - [ -n "$(grep -w "/usr/share/clash/clash.sh" $CRON_FILE)" ] && sed -i '/\/usr\/share\/clash\/clash.sh/d' $CRON_FILE - [ -n "$(grep -w "/usr/share/clash/v2ssr.sh" $CRON_FILE)" ] && sed -i '/\/usr\/share\/clash\/v2ssr.sh/d' $CRON_FILE + + clear=$(uci get clash.config.auto_clear_log 2>/dev/null) + if [ "${clear}" -eq 1 ]; then + [ -z "$(grep -w "/usr/share/clash/clash.txt" $CRON_FILE)" ] && echo "0 */$(uci get clash.config.clear_time 2>/dev/null) * * * echo '' >/usr/share/clash/clash.txt" >> $CRON_FILE + fi + auto=$(uci get clash.config.auto_update 2>/dev/null) if [ "${auto}" -eq 1 ]; then - [ -z "$(grep -w "/usr/share/clash/update_all.sh" $CRON_FILE)" ] && echo "0 $(uci get clash.config.auto_update_time 2>/dev/null) * * * /usr/share/clash/update_all.sh" >> $CRON_FILE + [ -z "$(grep -w "/usr/share/clash/update_all.sh" $CRON_FILE)" ] && echo "0 */$(uci get clash.config.auto_update_time 2>/dev/null) * * * /usr/share/clash/update_all.sh" >> $CRON_FILE fi + auto_geoip=$(uci get clash.config.auto_update_geoip 2>/dev/null) if [ "${auto_geoip}" -eq 1 ]; then day=$(uci get clash.config.geoip_update_day 2>/dev/null) @@ -126,6 +130,12 @@ game_rules() { #=========================================================================================================================== } +ip_rules() { +#=========================================================================================================================== + sh /usr/share/clash/iprules.sh 2>/dev/null +#=========================================================================================================================== +} + yml_dns_change(){ #=========================================================================================================================== @@ -221,7 +231,7 @@ rules(){ iptables -t nat -A clash -d "${lan_ip}" -j RETURN if [ ! -z "${wan}" ]; then iptables -t nat -A clash -d "${wan}" -j RETURN - fi + fi iptables -t nat -A clash -p tcp -j REDIRECT --to-ports "${redir_port}" iptables -t nat -A PREROUTING -p tcp -j clash @@ -263,8 +273,8 @@ rules(){ ipset add localnetwork 172.16.0.0/12 ipset add localnetwork "${lan_ip}" if [ ! -z "${wan}" ]; then - ipset add localnetwork "${wan}" - fi + ipset add localnetwork "${wan}" + fi if [ "${core}" -eq 3 ];then ip tuntap add user root mode tun $TUN_DEVICE_NAME ip link set $TUN_DEVICE_NAME up @@ -274,16 +284,15 @@ rules(){ ip route replace default dev utun table "$PROXY_ROUTE_TABLE" fi - ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" + ip rule add fwmark "$PROXY_FWMARK" table "$PROXY_ROUTE_TABLE" - iptables -t mangle -N clash - iptables -t mangle -F clash - iptables -t mangle -A clash -d 198.18.0.0/16 -j MARK --set-mark "$PROXY_FWMARK" - iptables -t mangle -A clash -m set --match-set localnetwork dst -j RETURN - iptables -t mangle -I OUTPUT -j clash - iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" + iptables -t mangle -N clash + iptables -t mangle -F clash + iptables -t mangle -A clash -d 198.18.0.0/16 -j MARK --set-mark "$PROXY_FWMARK" + iptables -t mangle -A clash -m set --match-set localnetwork dst -j RETURN + iptables -t mangle -I OUTPUT -j clash + iptables -t mangle -I PREROUTING -m set ! --match-set localnetwork dst -j MARK --set-mark "$PROXY_FWMARK" - if [ -f /usr/sbin/ip6tables ] && [ "${ipv6}" -eq 1 ]; then ip6tables -t mangle -I PREROUTING -j MARK --set-mark "$PROXY_FWMARK" fi @@ -412,8 +421,12 @@ if [ -f $CONFIG_YAML ] && [ "$(ls -l $CONFIG_YAML|awk '{print int($5/1024)}')" sleep 2 game_rules >/dev/null 2>&1 - - if [ "${core}" -eq 1 ];then + + sleep 1 + + ip_rules >/dev/null 2>&1 + + if [ "${core}" -eq 1 ];then nohup $CLASH -d "$CLASH_CONFIG" > /usr/share/clash/clash.txt 2>&1 & if [ "${lang}" == "en" ] || [ $lang == "auto" ];then @@ -448,7 +461,7 @@ if [ -f $CONFIG_YAML ] && [ "$(ls -l $CONFIG_YAML|awk '{print int($5/1024)}')" fi fi - + ln -s /usr/share/clash/yacd /www/luci-static/yacd 2>/dev/null sleep 2 @@ -615,6 +628,7 @@ stop(){ fi iptables -t nat -F clash >/dev/null 2>&1 && iptables -t nat -X clash >/dev/null 2>&1 + nat_indexs=$(iptables -nvL PREROUTING -t nat | sed 1,2d | sed -n '/clash/=' | sort -r) for nat_index in $nat_indexs; do iptables -t nat -D PREROUTING $nat_index >/dev/null 2>&1 @@ -622,14 +636,14 @@ stop(){ fake=$(iptables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/198.18.0.0\/16/=' |sort -r) - for fake in $fake; do + for fake in $fake; do iptables -t nat -D OUTPUT $fake >/dev/null 2>&1 - done + done fake2=$(iptables -nvL OUTPUT -t nat |sed 1,2d |sed -n '/198.18.0.1\/16/=' |sort -r) - for fake2 in $fake2; do + for fake2 in $fake2; do iptables -t nat -D OUTPUT $fake2 >/dev/null 2>&1 - done + done remove_mark >/dev/null 2>&1 @@ -644,7 +658,7 @@ stop(){ fi kill -9 `pidof clash|sed "s/$//g"` 2>/dev/null - + rm -rf /www/luci-static/yacd 2>/dev/null sleep 1 if [ ! -z "${delandns}" ];then @@ -663,7 +677,7 @@ stop(){ fi del_cron >/dev/null 2>&1 - sleep 1 + sleep 1 if [ "${lang}" == "en" ] || [ $lang == "auto" ];then echo "Restarting Dnsmasq " >$REAL_LOG @@ -672,7 +686,7 @@ stop(){ fi revert_dns >/dev/null 2>&1 - sleep 1 + sleep 1 echo "" >/usr/share/clash/clash.txt >/dev/null 2>&1 @@ -705,7 +719,7 @@ restart(){ stop >/dev/null 2>&1 start >/dev/null 2>&1 else - start >/dev/null 2>&1 + start >/dev/null 2>&1 fi #=========================================================================================================================== } diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/clash-watchdog.sh b/package/ntlf9t/luci-app-clash/root/usr/share/clash/clash-watchdog.sh index c9ae2d8830..249bf647b9 100755 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/clash-watchdog.sh +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/clash-watchdog.sh @@ -1,49 +1,32 @@ -#!/bin/sh +#!/bin/sh /etc/rc.common -sleeptime=300 -logfile="/tmp/clash.log" -CLASH="/etc/clash/clash" -CLASH_CONFIG="/etc/clash" +sleeptime=150 enable=$(uci get clash.config.enable 2>/dev/null) -clean_log(){ - logrow=$(grep -c "" ${logfile}) - logrow1=$(grep -c "" ${logfile1}) - if [ $logrow -ge 1000 ];then - cat /dev/null > ${logfile} - echo "$curtime Logs exceeded limit,cleaning logs now..!" >> ${logfile} - fi - - -} - - if [ -f /usr/share/clashbackup/history ];then + HISTORY_PATH="/usr/share/clashbackup/history" SECRET=$(uci get clash.config.dash_pass 2>/dev/null) LAN_IP=$(uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null) PORT=$(uci get clash.config.dash_port 2>/dev/null) -if [ ! -z "$(grep "#*#" "$HISTORY_PATH")" ]; then - cat $HISTORY_PATH |while read line - do - GORUP_NAME=$(echo $line |awk -F '#*#' '{print $1}') - NOW_NAME=$(echo $line |awk -F '#*#' '{print $3}') - curl -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X PUT -d '{"name":"'"$NOW_NAME"'"}' http://"$LAN_IP":"$PORT"/proxies/"$GORUP_NAME" >/dev/null 2>&1 - done +cat $HISTORY_PATH |while read line +do + if [ -z "$(echo $line |grep "#*#")" ]; then + continue + else + GORUP_NAME=$(echo $line |awk -F '#*#' '{print $1}') + NOW_NAME=$(echo $line |awk -F '#*#' '{print $3}') + curl -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X PUT -d '{"name":"'"$NOW_NAME"'"}' http://"$LAN_IP":"$PORT"/proxies/"$GORUP_NAME" >/dev/null 2>&1 + fi +done >/dev/null 2>&1 + fi -fi - while [ $enable -eq 1 ]; do - curtime=`date "+%H:%M:%S"` - if pidof clash>/dev/null; then - clean_log - fi if ! pidof clash>/dev/null; then /etc/init.d/clash restart 2>&1 & - echo "$curtime Clash Is Restarting!" >> ${logfile} fi sleep ${sleeptime} diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh b/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh index 7c031ccf7b..fdb3a2d0c8 100755 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/core_download.sh @@ -82,19 +82,19 @@ fi fi if [ -f /usr/share/clash/core_version ];then -VER=$(sed -n 1p /usr/share/clash/core_version 2>/dev/null) +VER=$(rm -rf /usr/share/clash/core_version 2>/dev/null && /etc/clash/clash -v | awk -F ' ' '{print $2}' >> /usr/share/clash/core_version 2>/dev/null | sed -n 1p /usr/share/clash/core_version) else VER=0 fi if [ -f /usr/share/clash/corer_version ];then -VERR=$(sed -n 1p /usr/share/clash/corer_version 2>/dev/null) +VERR=$(rm -rf /usr/share/clash/corer_version 2>/dev/null && /usr/bin/clash -v | awk -F ' ' '{print $2}' >> /usr/share/clash/corer_version 2>/dev/null | sed -n 1p /usr/share/clash/corer_version) else VERR=0 fi if [ -f /usr/share/clash/tun_version ];then -VERS=$(sed -n 1p /usr/share/clash/tun_version 2>/dev/null) +VERS=$(rm -rf /usr/share/clash/tun_version 2>/dev/null && /etc/clash/clashtun/clash -v | awk -F ' ' '{print $2}' >> /usr/share/clash/tun_version | sed -n 1p /usr/share/clash/tun_version) else VERS=0 fi diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html index 8931dcbf21..ad630255e7 100644 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html +++ b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/index.html @@ -4,9 +4,9 @@ - Clash Dashboard - + Clash +
- + diff --git a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js b/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js deleted file mode 100644 index 7bc830d892..0000000000 --- a/package/ntlf9t/luci-app-clash/root/usr/share/clash/dashboard/js/1.bundle.0bddb85299f970595cb5.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1.bundle.0bddb85299f970595cb5.min.js.LICENSE */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(e,t,n){"use strict";e.exports=n(51)},function(e,t,n){e.exports=n(55)()},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}n.d(t,"a",(function(){return r}))},,,,function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(52)},function(e,t,n){var r=n(42)(Object,"create");e.exports=r},function(e,t,n){var r=n(110);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(116);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},function(e,t,n){"use strict";var r=Array.isArray,o=Object.keys,i=Object.prototype.hasOwnProperty;e.exports=function e(t,n){if(t===n)return!0;if(t&&n&&"object"==typeof t&&"object"==typeof n){var a,u,l,c=r(t),s=r(n);if(c&&s){if((u=t.length)!=n.length)return!1;for(a=u;0!=a--;)if(!e(t[a],n[a]))return!1;return!0}if(c!=s)return!1;var f=t instanceof Date,d=n instanceof Date;if(f!=d)return!1;if(f&&d)return t.getTime()==n.getTime();var p=t instanceof RegExp,h=n instanceof RegExp;if(p!=h)return!1;if(p&&h)return t.toString()==n.toString();var m=o(t);if((u=m.length)!==o(n).length)return!1;for(a=u;0!=a--;)if(!i.call(n,m[a]))return!1;for(a=u;0!=a--;)if(!e(t[l=m[a]],n[l]))return!1;return!0}return t!=t&&n!=n}},,function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(41),o=n(89),i="[object Symbol]";e.exports=function(e){return"symbol"==typeof e||o(e)&&r(e)==i}},function(e,t,n){var r=n(23).Symbol;e.exports=r},function(e,t,n){var r=n(86),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t,n){e.exports=function(){"use strict";var e="millisecond",t="second",n="minute",r="hour",o="day",i="week",a="month",u="quarter",l="year",c=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,s=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,f=function(e,t,n){var r=String(e);return!r||r.length>=t?e:""+Array(t+1-r.length).join(n)+e},d={s:f,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),o=n%60;return(t<=0?"+":"-")+f(r,2,"0")+":"+f(o,2,"0")},m:function(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(n,a),o=t-r<0,i=e.clone().add(n+(o?-1:1),a);return Number(-(n+(t-r)/(o?r-i:i-r))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(c){return{M:a,y:l,w:i,d:o,h:r,m:n,s:t,ms:e,Q:u}[c]||String(c||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},h="en",m={};m[h]=p;var v=function(e){return e instanceof w},g=function(e,t,n){var r;if(!e)return h;if("string"==typeof e)m[e]&&(r=e),t&&(m[e]=t,r=e);else{var o=e.name;m[o]=e,r=o}return n||(h=r),r},y=function(e,t,n){if(v(e))return e.clone();var r=t?"string"==typeof t?{format:t,pl:n}:t:{};return r.date=e,new w(r)},b=d;b.l=g,b.i=v,b.w=function(e,t){return y(e,{locale:t.$L,utc:t.$u,$offset:t.$offset})};var w=function(){function f(e){this.$L=this.$L||g(e.locale,null,!0),this.parse(e)}var d=f.prototype;return d.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(b.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var r=t.match(c);if(r)return n?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(t)}(e),this.init()},d.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},d.$utils=function(){return b},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(e,t){var n=y(e);return this.startOf(t)<=n&&n<=this.endOf(t)},d.isAfter=function(e,t){return y(e)=0;d--){var p=o[d];"."===p?s(o,d):".."===p?(s(o,d),f++):f&&(s(o,d),f--)}if(!u)for(;f--;f)o.unshift("..");!u||""===o[0]||o[0]&&c(o[0])||o.unshift("");var h=o.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};function d(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var p=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=d(t),o=d(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1},h=!0,m="Invariant failed";var v=function(e,t){if(!e)throw h?new Error(m):new Error(m+": "+(t||""))};function g(e){return"/"===e.charAt(0)?e:"/"+e}function y(e){return"/"===e.charAt(0)?e.substr(1):e}function b(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function w(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function x(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function S(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(o=Object(l.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=f(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function E(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof r?r(i,o):o(!0):o(!1!==i)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,r):n.push(r),f({action:"PUSH",location:r,index:t,entries:n})}}))},replace:function(e,t){var r=S(e,t,d(),g.location);s.confirmTransitionTo(r,"REPLACE",n,(function(e){e&&(g.entries[g.index]=r,f({action:"REPLACE",location:r}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=g.index+e;return t>=0&&t=0;t--){var n=e[t][a];n.modified||(Array.isArray(n.base)?K(n)&&A(n):w(n.base)?Q(n)&&A(n):S(n.base)?X(n)&&A(n):G(n)&&A(n))}}function G(e){for(var t=e.base,n=e.draft,r=Object.keys(n),o=r.length-1;o>=0;o--){var i=r[o],u=t[i];if(void 0===u&&!m(t,i))return!0;var l=n[i],c=l&&l[a];if(c?c.base!==u:!g(l,u))return!0}return r.length!==Object.keys(t).length}function K(e){var t=e.draft;if(t.length!==e.base.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);return!(!n||n.get)}function Q(e){var t=e.base,n=e.draft;if(t.size!==n.size)return!0;var r=!1;return n.forEach((function(e,n){r||(r=l(e)?e.modified:e!==t.get(n))})),r}function X(e){var t=e.base,n=e.draft;if(t.size!==n.size)return!0;var r=!1;return n.forEach((function(e,n){r||(r=l(e)?e.modified:!t.has(n))})),r}var J,Z,ee=Object.freeze({__proto__:null,willFinalize:function(e,t,n){e.drafts.forEach((function(e){e[a].finalizing=!0})),n?u(t)&&t[a].scope===e&&Y(e.drafts):(e.patches&&function e(t){if(!t||"object"!=typeof t)return;var n=t[a];if(!n)return;var r=n.base,o=n.draft,i=n.assigned;if(Array.isArray(t)){if(K(n)){if(A(n),i.length=!0,o.lengths&&a[f-1]===u[f+c-1];)--f;for(var d=s;d=f;--d){p=t.concat([d]);n[h+d-f]={op:"add",path:p,value:u[d]},r.push({op:"remove",path:p})}}function he(e,t,n,r){var o=e.base,i=e.copy;p(e.assigned,(function(e,a){var u=v(o,e),l=v(i,e),c=a?m(o,e)?"replace":"add":"remove";if(u!==l||"replace"!==c){var s=t.concat(e);n.push("remove"===c?{op:c,path:s}:{op:c,path:s,value:l}),r.push("add"===c?{op:"remove",path:s}:"remove"===c?{op:"add",path:s,value:u}:{op:"replace",path:s,value:u})}}))}function me(e,t,n,r){var o=e.base,i=e.copy,a=0;o.forEach((function(e){if(!i.has(e)){var o=t.concat([a]);n.push({op:"remove",path:o,value:e}),r.unshift({op:"add",path:o,value:e})}a++})),a=0,i.forEach((function(e){if(!o.has(e)){var i=t.concat([a]);n.push({op:"add",path:i,value:e}),r.unshift({op:"remove",path:i,value:e})}a++}))}function ve(e,t){return t.forEach((function(t){var n=t.path,r=t.op;if(!n.length)throw new Error("Illegal state");for(var o=e,i=0;i=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}return u(e)?ve(e,t):this.produce(e,(function(e){return ve(e,t.slice(n+1))}))},e.prototype.processResult=function(e,t){var n=t.drafts[0],r=void 0!==e&&e!==n;if(this.willFinalize(t,e,r),r){if(n[a].modified)throw t.revoke(),new Error("An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.");l(e)&&(e=this.finalize(e,null,t),this.maybeFreeze(e)),t.patches&&(t.patches.push({op:"replace",path:[],value:e}),t.inversePatches.push({op:"replace",path:[],value:n[a].base}))}else e=this.finalize(n,[],t);return t.revoke(),t.patches&&t.patchListener(t.patches,t.inversePatches),e!==o?e:void 0},e.prototype.finalize=function(e,t,n){var r=this,o=e[a];if(!o)return Object.isFrozen(e)?e:this.finalizeTree(e,null,n);if(o.scope!==n)return e;if(!o.modified)return this.maybeFreeze(o.base,!0),o.base;if(!o.finalized){if(o.finalized=!0,this.finalizeTree(o.draft,t,n),this.onDelete&&!S(o.base))if(this.useProxies){p(o.assigned,(function(e,t){var n,i;t||null===(i=(n=r).onDelete)||void 0===i||i.call(n,o,e)}))}else{var i=o.base,u=o.copy;p(i,(function(e){var t,n;m(u,e)||null===(n=(t=r).onDelete)||void 0===n||n.call(t,o,e)}))}this.onCopy&&this.onCopy(o),this.autoFreeze&&n.canAutoFreeze&&P(o.copy,!1),t&&n.patches&&function(e,t,n,r){(Array.isArray(e.base)?pe:S(e.base)?me:he)(e,t,n,r)}(o,t,n.patches,n.inversePatches)}return o.copy},e.prototype.finalizeTree=function(e,t,n){var r=this,o=e[a];o&&(this.useProxies||(o.copy=d(o.draft,!0)),e=o.copy);var i=!!t&&!!n.patches,c=function(a,s,f){if(s===f)throw Error("Immer forbids circular references");var d=!!o&&f===e,y=S(f);if(u(s)){var b=d&&i&&!y&&!m(o.assigned,a)?t.concat(a):null;if(function(e,t,n){w(e)?e.set(t,n):S(e)?(e.delete(t),e.add(n)):Array.isArray(e)||h(e,t)?e[t]=n:Object.defineProperty(e,t,{value:n,writable:!0,configurable:!0})}(f,a,s=r.finalize(s,b,n)),u(s)&&(n.canAutoFreeze=!1),d&&s===v(o.base,a))return}else{if(d&&g(s,v(o.base,a)))return;l(s)&&!Object.isFrozen(s)&&(p(s,c),r.maybeFreeze(s))}d&&r.onAssign&&!y&&r.onAssign(o,a,s)};return p(e,c),e},e.prototype.maybeFreeze=function(e,t){void 0===t&&(t=!1),this.autoFreeze&&!u(e)&&P(e,t)},e}()),be=ye.produce;ye.produceWithPatches.bind(ye),ye.setAutoFreeze.bind(ye),ye.setUseProxies.bind(ye),ye.applyPatches.bind(ye),ye.createDraft.bind(ye),ye.finishDraft.bind(ye);t.a=be}).call(this,n(35))},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,t){for(var n,u,l=a(e),c=1;c=200&&e<300}};l.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(i)})),e.exports=l}).call(this,n(35))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var l,c=[],s=!1,f=-1;function d(){s&&l&&(s=!1,l.length?c=l.concat(c):f=-1,c.length&&p())}function p(){if(!s){var e=u(d);s=!0;for(var t=c.length;t;){for(l=c,c=[];++f1)for(var n=1;nM.length&&M.push(e)}function j(e,t,n){return null==e?0:function e(t,n,r,o){var u=typeof t;"undefined"!==u&&"boolean"!==u||(t=null);var l=!1;if(null===t)l=!0;else switch(u){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+N(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;c