Merge pull request #1920 from dibdot/lxc_fix
authorDirk Brenken <dev@brenken.org>
Sat, 30 Jun 2018 21:08:16 +0000 (23:08 +0200)
committerGitHub <noreply@github.com>
Sat, 30 Jun 2018 21:08:16 +0000 (23:08 +0200)
luci-app-lxc: small fixes & cosmetics

204 files changed:
applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm
applications/luci-app-adblock/luasrc/view/adblock/query.htm
applications/luci-app-adblock/po/it/adblock.po
applications/luci-app-adblock/po/ja/adblock.po
applications/luci-app-adblock/po/pt-br/adblock.po
applications/luci-app-adblock/po/ru/adblock.po
applications/luci-app-adblock/po/sv/adblock.po
applications/luci-app-adblock/po/templates/adblock.pot
applications/luci-app-adblock/po/zh-cn/adblock.po
applications/luci-app-adblock/po/zh-tw/adblock.po
applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm
applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
applications/luci-app-bcp38/luasrc/model/cbi/bcp38.lua
applications/luci-app-ddns/Makefile
applications/luci-app-ddns/luasrc/controller/ddns.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
applications/luci-app-ddns/luasrc/tools/ddns.lua
applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua
applications/luci-app-firewall/luasrc/tools/firewall.lua
applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm
applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm
applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm
applications/luci-app-firewall/po/ca/firewall.po
applications/luci-app-firewall/po/cs/firewall.po
applications/luci-app-firewall/po/de/firewall.po
applications/luci-app-firewall/po/el/firewall.po
applications/luci-app-firewall/po/en/firewall.po
applications/luci-app-firewall/po/es/firewall.po
applications/luci-app-firewall/po/fr/firewall.po
applications/luci-app-firewall/po/he/firewall.po
applications/luci-app-firewall/po/hu/firewall.po
applications/luci-app-firewall/po/it/firewall.po
applications/luci-app-firewall/po/ja/firewall.po
applications/luci-app-firewall/po/ko/firewall.po
applications/luci-app-firewall/po/ms/firewall.po
applications/luci-app-firewall/po/no/firewall.po
applications/luci-app-firewall/po/pl/firewall.po
applications/luci-app-firewall/po/pt-br/firewall.po
applications/luci-app-firewall/po/pt/firewall.po
applications/luci-app-firewall/po/ro/firewall.po
applications/luci-app-firewall/po/ru/firewall.po
applications/luci-app-firewall/po/sk/firewall.po
applications/luci-app-firewall/po/sv/firewall.po
applications/luci-app-firewall/po/templates/firewall.pot
applications/luci-app-firewall/po/tr/firewall.po
applications/luci-app-firewall/po/uk/firewall.po
applications/luci-app-firewall/po/vi/firewall.po
applications/luci-app-firewall/po/zh-cn/firewall.po
applications/luci-app-firewall/po/zh-tw/firewall.po
applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
applications/luci-app-mwan3/po/ja/mwan3.po
applications/luci-app-mwan3/po/ru/mwan3.po
applications/luci-app-mwan3/po/templates/mwan3.pot
applications/luci-app-mwan3/po/zh-cn/mwan3.po
applications/luci-app-mwan3/po/zh-tw/mwan3.po
applications/luci-app-noddos/luasrc/view/noddos/clients.htm
applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua
applications/luci-app-rp-pppoe-server/Makefile
applications/luci-app-shadowsocks-libev/luasrc/model/shadowsocks-libev.lua
applications/luci-app-shadowsocks-libev/luasrc/view/shadowsocks-libev/add_instance.htm
applications/luci-app-splash/luasrc/view/admin_status/splash.htm
applications/luci-app-transmission/root/etc/uci-defaults/40_luci-transmission
applications/luci-app-travelmate/luasrc/view/travelmate/logread.htm
applications/luci-app-travelmate/luasrc/view/travelmate/stations.htm
applications/luci-app-travelmate/luasrc/view/travelmate/wifi_scan.htm
applications/luci-app-travelmate/po/ja/travelmate.po
applications/luci-app-travelmate/po/pt-br/travelmate.po
applications/luci-app-travelmate/po/ru/travelmate.po
applications/luci-app-travelmate/po/templates/travelmate.pot
applications/luci-app-unbound/luasrc/model/cbi/unbound/configure.lua
applications/luci-app-upnp/luasrc/view/upnp_status.htm
applications/luci-app-upnp/po/uk/upnp.po
applications/luci-app-wireguard/luasrc/view/wireguard.htm
collections/luci-nginx/Makefile [new file with mode: 0644]
collections/luci-ssl-nginx/Makefile [new file with mode: 0644]
collections/luci-ssl-openssl-nginx/Makefile [new file with mode: 0644]
collections/luci/Makefile
luci.mk
modules/luci-base/Makefile
modules/luci-base/htdocs/luci-static/resources/cbi.js
modules/luci-base/htdocs/luci-static/resources/xhr.js
modules/luci-base/luasrc/cbi.lua
modules/luci-base/luasrc/dispatcher.lua
modules/luci-base/luasrc/model/uci.lua
modules/luci-base/luasrc/tools/status.lua
modules/luci-base/luasrc/util.lua
modules/luci-base/luasrc/view/cbi/apply_widget.htm
modules/luci-base/luasrc/view/cbi/button.htm
modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm
modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
modules/luci-base/luasrc/view/cbi/dropdown.htm [new file with mode: 0644]
modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
modules/luci-base/luasrc/view/cbi/footer.htm
modules/luci-base/luasrc/view/cbi/full_valuefooter.htm
modules/luci-base/luasrc/view/cbi/map.htm
modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
modules/luci-base/luasrc/view/cbi/network_netlist.htm
modules/luci-base/luasrc/view/cbi/nsection.htm
modules/luci-base/luasrc/view/cbi/nullsection.htm
modules/luci-base/luasrc/view/cbi/simpleform.htm
modules/luci-base/luasrc/view/cbi/tblsection.htm
modules/luci-base/luasrc/view/cbi/tsection.htm
modules/luci-base/luasrc/view/cbi/upload.htm
modules/luci-base/luasrc/view/sysauth.htm
modules/luci-base/po/ca/base.po
modules/luci-base/po/cs/base.po
modules/luci-base/po/de/base.po
modules/luci-base/po/el/base.po
modules/luci-base/po/en/base.po
modules/luci-base/po/es/base.po
modules/luci-base/po/fr/base.po
modules/luci-base/po/he/base.po
modules/luci-base/po/hu/base.po
modules/luci-base/po/it/base.po
modules/luci-base/po/ja/base.po
modules/luci-base/po/ko/base.po
modules/luci-base/po/ms/base.po
modules/luci-base/po/no/base.po
modules/luci-base/po/pl/base.po
modules/luci-base/po/pt-br/base.po
modules/luci-base/po/pt/base.po
modules/luci-base/po/ro/base.po
modules/luci-base/po/ru/base.po
modules/luci-base/po/sk/base.po
modules/luci-base/po/sv/base.po
modules/luci-base/po/templates/base.pot
modules/luci-base/po/tr/base.po
modules/luci-base/po/uk/base.po
modules/luci-base/po/vi/base.po
modules/luci-base/po/zh-cn/base.po
modules/luci-base/po/zh-tw/base.po
modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua
modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_assoclist.htm [new file with mode: 0644]
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
protocols/luci-proto-3g/luasrc/model/network/proto_3g.lua [new file with mode: 0644]
protocols/luci-proto-ipv6/Makefile
protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua [deleted file]
protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua [deleted file]
protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua
themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js [deleted file]
themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg [deleted file]
themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css
themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css [deleted file]
themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm
themes/luci-theme-material/htdocs/luci-static/material/css/style.css
themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
themes/luci-theme-material/luasrc/view/themes/material/header.htm
themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css [deleted file]
themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css [deleted file]
themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css [deleted file]
themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm

index 3f39622920a3e6013d63f34b9785302f3e89d341..da783e3361b68858df353a1eb52ba6bc680c8881 100644 (file)
@@ -183,7 +183,7 @@ end
 
 des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
 
-cat = bl:option(DynamicList, "adb_src_cat", translate("Categories"))
+cat = bl:option(DynamicList, "adb_src_cat", translate("Archive Categories"))
 cat.datatype = "uciname"
 cat.optional = true
 
index b4b62db5f42da51a6495f4726f6429eac8a56b9d..81622e9bc6dc7e7dbd0cbfb986409eb54d29d303 100644 (file)
@@ -22,25 +22,35 @@ end
 -%>
 
 <style type="text/css">
-table.cbi-section-table th,
-table.cbi-section-table td,
+.table.cbi-section-table .th,
+.table.cbi-section-table .td,
 .cbi-section-table-cell,
-.cbi-section-table-row,
-.cbi-input-text
+.cbi-section-table-row
 {
        text-align:left;
        vertical-align:top;
        margin-right:auto;
        margin-left:0px;
+       padding-left:2px;
+       line-height:20px;
+       height:20px;
+}
+.table.cbi-section-table .th
+{
+       white-space:nowrap;
+}
+.table.cbi-section-table input
+{
+       width:7em;
 }
 .cbi-input-text
 {
+       text-align:left;
+       padding-left:2px;
        outline:none;
        box-shadow:none;
        background:transparent;
-       padding-left:2px;
-       line-height:25px;
-       height:25px;
+       height:20px;
        width:10em;
 }
 </style>
@@ -51,37 +61,37 @@ table.cbi-section-table td,
        <%- end %>
        <div class="cbi-section-descr"><%=self.description%></div>
        <div class="cbi-section-node">
-               <table class="cbi-section-table">
-                       <tr class="cbi-section-table-titles">
+               <div class="table cbi-section-table">
+                       <div class="tr cbi-section-table-titles">
                        <%- if self.sectionhead then -%>
-                               <th class="cbi-section-table-cell"><%=self.sectionhead%></th>
+                               <div class="th cbi-section-table-cell"><%=self.sectionhead%></div>
                        <%- else -%>
-                               <th>&#160;</th>
+                               <div class="th">&#160;</div>
                        <%- end -%>
                        <%- for i, k in pairs(self.children) do -%>
-                               <th class="cbi-section-table-cell"<%=width(k)%>>
+                               <div class="th cbi-section-table-cell"<%=width(k)%>>
                                        <%-=k.title-%>
-                               </th>
+                               </div>
                        <%- end -%>
-                       </tr>
+                       </div>
                        <%- local isempty = true
                                for i, k in ipairs(self:cfgsections()) do
                                        section = k
                                        isempty = false
                                        scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
                        -%>
-                       <tr class="cbi-section-table-row" id="cbi-<%=self.config%>-<%=section%>">
-                               <th><%=k%></th>
+                       <div class="tr cbi-section-table-row" id="cbi-<%=self.config%>-<%=section%>">
+                               <div class="th"><%=k%></div>
                                <%-
                                        for k, node in ipairs(self.children) do
                                                node:render(section, scope or {})
                                        end
                                        if not scope.cbid:match("adb_src_cat") then
                                -%>
-                                       <td class="cbi-value-field">&#160;</td>
+                                       <div class="td cbi-value-field">&#160;</div>
                                <%- end -%>
-                       </tr>
+                       </div>
                        <%- end -%>
-               </table>
+               </div>
        </div>
 </fieldset>
index 8bbc92664d14e7309e776d242fdccebc6527d36e..8bbed3a53ee93db7063c1715ae72d9c1436cda61 100644 (file)
@@ -35,7 +35,7 @@ This is free software, licensed under the Apache License, Version 2.0
                                        else
                                        {
                                                input.style.display = 'none';
-                                               output.innerHTML = '<span class="error"><%:Invalid domain specified!%></span>';
+                                               output.innerHTML = '<span class="error"><%:Blocklist not found!%></span>';
                                        }
                                }
                        );
index 0a1b65ac36bb7c54863d3cba0d5df53bfad946b7..c2db36effca6424ccf42d6891c2d42de0cf22d0d 100644 (file)
@@ -17,6 +17,11 @@ msgstr ""
 msgid "-------"
 msgstr ""
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
 msgid "Adblock"
 msgstr "Adblock"
 
@@ -35,8 +40,8 @@ msgstr "Tempo addizionale in secondi di attesa prima che adblock si avvii."
 msgid "Advanced"
 msgstr "Avanzato"
 
-msgid "Available blocklist sources."
-msgstr "Fonti lista di blocco disponibili."
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "Directory del Backup"
@@ -47,14 +52,12 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "Fonti lista di Blocco"
 
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
 msgstr ""
 
 msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
 msgstr ""
 
 msgid ""
@@ -100,12 +103,6 @@ msgstr ""
 msgid "Download Utility (SSL Library)"
 msgstr ""
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
 msgid "Edit Blacklist"
 msgstr "Modifica Lista Nera"
 
@@ -175,19 +172,9 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr "File di input non trovato, per favore controlla la tua configurazione."
 
-msgid "Invalid domain specified!"
-msgstr "Dominio invalido specificato!"
-
 msgid "Last Run"
 msgstr "Ultimo Avvio"
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-"Le selezioni degli URL delle liste e categorie Shallalist sono configurabili "
-"nella sezione 'Avanzato'.<br />"
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -239,9 +226,6 @@ msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
 msgid "Query"
 msgstr "Interrogazione"
 
@@ -296,10 +280,8 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr "Directory per la lista di blocco generata 'adb_list.overall'."
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
 msgstr ""
-"La grandezza del file è troppo grande per modificarla online in LuCI (&gt; "
-"512 KB)."
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -336,9 +318,6 @@ msgstr ""
 "Questo form mostra l'output del registro, prefiltrato per messaggi relativi "
 "solo ad adblock."
 
-msgid "This section contains no values yet"
-msgstr ""
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -392,6 +371,24 @@ msgstr "in pausa"
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Dominio invalido specificato!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Fonti lista di blocco disponibili."
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr ""
+#~ "Le selezioni degli URL delle liste e categorie Shallalist sono "
+#~ "configurabili nella sezione 'Avanzato'.<br />"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "La grandezza del file è troppo grande per modificarla online in LuCI "
+#~ "(&gt; 512 KB)."
+
 #~ msgid ""
 #~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
 #~ "'libustream-ssl' or the wget 'built-in'."
index dfd72cbf6cf8032ce8f83b3fe56a7c29def08876..cddedacd4301915b49fa5d1c6e580744b7d55cda 100644 (file)
@@ -8,7 +8,7 @@ msgstr ""
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.0.7\n"
 "Language: ja\n"
 
 msgid "'Jail' Blocklist Creation"
@@ -17,6 +17,13 @@ msgstr "'Jail' ブロックリストの作成"
 msgid "-------"
 msgstr "(利用不可)"
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+"<b>警告:</b> RAM の空き容量が 64MB に満たないメモリー容量の小さいデバイスで"
+"は、 OutOfMemory (OOM) 例外を防ぐために少数のみを選択してください。"
+
 msgid "Adblock"
 msgstr "Adblock"
 
@@ -35,8 +42,8 @@ msgstr "Adblock の処理が開始されるまでの、追加の遅延時間(
 msgid "Advanced"
 msgstr "詳細設定"
 
-msgid "Available blocklist sources."
-msgstr "利用可能なブロックリスト提供元です。"
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "バックアップ先 ディレクトリ"
@@ -47,6 +54,9 @@ msgstr "バックアップ モード"
 msgid "Blocklist Sources"
 msgstr "ブロックリスト提供元"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
@@ -54,14 +64,6 @@ msgstr ""
 "ホワイトリストに存在しない全ドメインへのアクセスをブロックするために、追加で "
 "'Jail' リスト (/tmp/adb_list.jail) を作成します。<br />"
 
-msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
-msgstr ""
-"警告: RAM の空き容量が 64MB に満たないメモリー容量の小さいデバイスでは、 "
-"OutOfMemory (OOM) 例外を防ぐために、5個よりも多くのリストを選択しないようにし"
-"てください。"
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -109,15 +111,6 @@ msgstr "ダウンロード ユーティリティ"
 msgid "Download Utility (SSL Library)"
 msgstr "ダウンロード ユーティリティ(SSL ライブラリ)"
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-"opkg でパッケージをインストールする際に '--force-maintainer' オプションを使用"
-"して既存の設定ファイルを上書きするか、 <a href=\"%s\" target=\"_blank\">ここ"
-"</a> からデフォルトの設定ファイルをダウンロードしてください。"
-
 msgid "Edit Blacklist"
 msgstr "ブラックリストの編集"
 
@@ -195,19 +188,9 @@ msgstr "ホワイトリスト ファイルへのフルパスです。"
 msgid "Input file not found, please check your configuration."
 msgstr "入力ファイルが見つかりません。設定を確認してください。"
 
-msgid "Invalid domain specified!"
-msgstr "無効なドメインが指定されています!"
-
 msgid "Last Run"
 msgstr "最終実行"
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-"リストの URL 及び \"Shalla\" リストのカテゴリー設定は、'詳細設定' セクション"
-"で設定することができます。<br />"
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -260,11 +243,6 @@ msgid ""
 msgstr ""
 "注意: これには、追加で 'msmtp' のインストールとセットアップが必要です。"
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-"このパッケージを使用するには、既存の Adblock 設定ファイルを更新してください。"
-"<br />"
-
 msgid "Query"
 msgstr "検索"
 
@@ -326,10 +304,10 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr "生成されたブロックリスト 'adb_list.overall' の保存先ディレクトリです。"
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
 msgstr ""
-"ファイル サイズが大きすぎる(512 KB超)ため、 LuCI 上でオンライン編集できませ"
-"。"
+"LuCI上でのオンライン編集を行うには、ファイルサイズが大きすぎます (&ge; 100 "
+"KB)。"
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -366,9 +344,6 @@ msgstr ""
 "このフォームには、システムログ内の Adblock に関連するメッセージのみが表示され"
 "ます。"
 
-msgid "This section contains no values yet"
-msgstr "このセクションには、まだ値がありません"
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -424,3 +399,9 @@ msgstr "一時停止"
 
 msgid "running"
 msgstr "実行中"
+
+#~ msgid "Categories"
+#~ msgstr "カテゴリー"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "無効なドメインが指定されています!"
index c0d9d816db23755f47ecb15404e0afccb4e22e24..07d0f9a8d294b8c15dd36960e945f95bfb28f9b0 100644 (file)
@@ -18,6 +18,11 @@ msgstr ""
 msgid "-------"
 msgstr ""
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
 msgid "Adblock"
 msgstr "Adblock"
 
@@ -38,8 +43,8 @@ msgstr ""
 msgid "Advanced"
 msgstr "Avançado"
 
-msgid "Available blocklist sources."
-msgstr "Fontes de listas de bloqueio disponíveis."
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "Diretório da cópia de segurança"
@@ -50,14 +55,12 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "Fontes de listas de bloqueio"
 
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
 msgstr ""
 
 msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
 msgstr ""
 
 msgid ""
@@ -101,12 +104,6 @@ msgstr ""
 msgid "Download Utility (SSL Library)"
 msgstr "Utilitário de Download (Biblioteca SSL)"
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
 msgid "Edit Blacklist"
 msgstr "Editar Lista de Bloqueio"
 
@@ -175,17 +172,9 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr "Arquivo de entrada não encontrado, por favor cheque sua configuração."
 
-msgid "Invalid domain specified!"
-msgstr "Domínio especificado inválido!"
-
 msgid "Last Run"
 msgstr ""
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -232,9 +221,6 @@ msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
 msgid "Query"
 msgstr "Consulta"
 
@@ -288,9 +274,8 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr ""
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
 msgstr ""
-"O tamanho do arquivo é muito grande para edição online no LuCI (&gt; 512 KB)."
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -327,9 +312,6 @@ msgstr ""
 "Esse formulário mostra a saída do syslog, pré-filtrado para mensagens do "
 "adblock  apenas."
 
-msgid "This section contains no values yet"
-msgstr ""
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -381,6 +363,17 @@ msgstr ""
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Domínio especificado inválido!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Fontes de listas de bloqueio disponíveis."
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "O tamanho do arquivo é muito grande para edição online no LuCI (&gt; 512 "
+#~ "KB)."
+
 #~ msgid ""
 #~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
 #~ "'libustream-ssl' or the wget 'built-in'."
index 17f39fdd87e69ef5205b225057cac26d1914fe5d..c1193d38e11cccb1bb77ed6c9a2d06150c8e0541 100644 (file)
@@ -21,6 +21,11 @@ msgstr "Создание Черного<br />списка 'Jail'"
 msgid "-------"
 msgstr "-------"
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
 msgid "Adblock"
 msgstr "AdBlock"
 
@@ -39,8 +44,8 @@ msgstr "Дополнительная задержка в секундах до 
 msgid "Advanced"
 msgstr "Дополнительно"
 
-msgid "Available blocklist sources."
-msgstr "Источники списков блокировки. "
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "Папка для бэкапа"
@@ -51,6 +56,9 @@ msgstr "Режим сохранения бекапа"
 msgid "Blocklist Sources"
 msgstr "Источники списков блокировки"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
@@ -59,14 +67,6 @@ msgstr ""
 "заблокировать доступ ко всем доменам, кроме тех что перечислены в файле "
 "Белого списка.<br />"
 
-msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
-msgstr ""
-"ВНИМАНИЕ: Для предотвращения возможного программного сбоя и перезагрузки, на "
-"устройствах с объемом оперативной памяти менее 64MB, не выбирайте больше 5 "
-"списков."
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -113,15 +113,6 @@ msgstr "Скачать утилиту"
 msgid "Download Utility (SSL Library)"
 msgstr "Загрузить утилиту (библиотека SSL)"
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-"Устанавливая пакет с помощью opkg, используйте '--force-maintainer', чтобы "
-"перезаписать существующий config файл или загрузить новый дефолтный config "
-"файл <a href=\"%s\" target=\"_blank\">здесь</a>"
-
 msgid "Edit Blacklist"
 msgstr "Редактировать Черный список"
 
@@ -198,19 +189,9 @@ msgstr "Полный путь к файлу Белого списка."
 msgid "Input file not found, please check your configuration."
 msgstr "Config файл не найден, настройте config файл."
 
-msgid "Invalid domain specified!"
-msgstr "Задан недопустимый домен!"
-
 msgid "Last Run"
 msgstr "Последнее время запуска"
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-"Список URL-адресов и настройка списка использования, настраиваются на "
-"странице 'Дополнительно'.<br />"
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -263,9 +244,6 @@ msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr "Внимание: это потребует дополнительной установки пакета 'msmtp'."
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr "Обновите config файл Adblock, чтобы использовать этот пакет.<br />"
-
 msgid "Query"
 msgstr "Запрос"
 
@@ -328,9 +306,8 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr "Назначить папку для создания списка блокировки 'adb_list.overall'."
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
 msgstr ""
-"Размер файла слишком большой, для онлайн редактирования в LuCI (&gt; 512 KB)."
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -363,9 +340,6 @@ msgid ""
 "only."
 msgstr "Страница системного журнала. Только сообщения связанные с Adblock."
 
-msgid "This section contains no values yet"
-msgstr "Здесь не содержатся необходимые значения"
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -422,3 +396,44 @@ msgstr "остановлено"
 
 msgid "running"
 msgstr "работает"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Задан недопустимый домен!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Источники списков блокировки. "
+
+#~ msgid ""
+#~ "Caution: To prevent OOM exceptions on low memory devices with less than "
+#~ "64 MB free RAM, please do not select more than five blocklist sources!"
+#~ msgstr ""
+#~ "ВНИМАНИЕ: Для предотвращения возможного программного сбоя и перезагрузки, "
+#~ "на устройствах с объемом оперативной памяти менее 64MB, не выбирайте "
+#~ "больше 5 списков."
+
+#~ msgid ""
+#~ "During opkg package installation use the '--force-maintainer' option to "
+#~ "overwrite the pre-existing config file or download a fresh default config "
+#~ "from <a href=\"%s\" target=\"_blank\">here</a>"
+#~ msgstr ""
+#~ "Устанавливая пакет с помощью opkg, используйте '--force-maintainer', "
+#~ "чтобы перезаписать существующий config файл или загрузить новый дефолтный "
+#~ "config файл <a href=\"%s\" target=\"_blank\">здесь</a>"
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr ""
+#~ "Список URL-адресов и настройка списка использования, настраиваются на "
+#~ "странице 'Дополнительно'.<br />"
+
+#~ msgid "Please update your adblock config file to use this package.<br />"
+#~ msgstr "Обновите config файл Adblock, чтобы использовать этот пакет.<br />"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "Размер файла слишком большой, для онлайн редактирования в LuCI (&gt; 512 "
+#~ "KB)."
+
+#~ msgid "This section contains no values yet"
+#~ msgstr "Здесь не содержатся необходимые значения"
index d875a69f964f749ac2cc61ed0081b00051be6a4e..4a7ca4b738594e0cc2f148ed6e247654ddf60a7a 100644 (file)
@@ -7,6 +7,11 @@ msgstr ""
 msgid "-------"
 msgstr "-------"
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
 msgid "Adblock"
 msgstr "Adblock"
 
@@ -25,8 +30,8 @@ msgstr ""
 msgid "Advanced"
 msgstr "Avancerat"
 
-msgid "Available blocklist sources."
-msgstr "Tillgängliga källor för blockeringslistor"
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "Säkerhetskopiera mapp"
@@ -37,14 +42,12 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "Källor för blockeringslistor"
 
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
 msgstr ""
 
 msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
 msgstr ""
 
 msgid ""
@@ -91,12 +94,6 @@ msgstr ""
 msgid "Download Utility (SSL Library)"
 msgstr "Nerladdningsprogram (SSL-bibliotek)"
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
 msgid "Edit Blacklist"
 msgstr "Redigera svartlista"
 
@@ -166,17 +163,9 @@ msgid "Input file not found, please check your configuration."
 msgstr ""
 "Inmatningsfilen kunde inte hittas, var vänlig kontrollera din konfiguration."
 
-msgid "Invalid domain specified!"
-msgstr "Ogiltig domän angiven!"
-
 msgid "Last Run"
 msgstr "Kördes senast"
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -221,9 +210,6 @@ msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
 msgid "Query"
 msgstr "Fråga"
 
@@ -256,8 +242,8 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Size of the download queue to handle downloads &amp; list processing in parallel "
-"(default '4').<br />"
+"Size of the download queue to handle downloads &amp; list processing in "
+"parallel (default '4').<br />"
 msgstr ""
 
 msgid "Startup Trigger"
@@ -277,8 +263,8 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr ""
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
-msgstr "Filstorleken är för stor för online-redigering i LuCi (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
+msgstr ""
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -311,9 +297,6 @@ msgid ""
 "only."
 msgstr ""
 
-msgid "This section contains no values yet"
-msgstr ""
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -365,6 +348,16 @@ msgstr "pausad"
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Ogiltig domän angiven!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "Tillgängliga källor för blockeringslistor"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr ""
+#~ "Filstorleken är för stor för online-redigering i LuCi (&gt; 512 KB)."
+
 #~ msgid ""
 #~ "Caution: Please don't select big lists or many lists at once on low "
 #~ "memory devices to prevent OOM exceptions!"
index 6fbaa652ae2bb8c154b3e71c503716b97a0a7722..a375d0edb61c821354b3a0670da289f45ed0d7f7 100644 (file)
@@ -7,6 +7,11 @@ msgstr ""
 msgid "-------"
 msgstr ""
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
 msgid "Adblock"
 msgstr ""
 
@@ -25,7 +30,7 @@ msgstr ""
 msgid "Advanced"
 msgstr ""
 
-msgid "Available blocklist sources."
+msgid "Archive Categories"
 msgstr ""
 
 msgid "Backup Directory"
@@ -37,14 +42,12 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr ""
 
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
 msgstr ""
 
 msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
 msgstr ""
 
 msgid ""
@@ -84,12 +87,6 @@ msgstr ""
 msgid "Download Utility (SSL Library)"
 msgstr ""
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
 msgid "Edit Blacklist"
 msgstr ""
 
@@ -158,17 +155,9 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr ""
 
-msgid "Invalid domain specified!"
-msgstr ""
-
 msgid "Last Run"
 msgstr ""
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr ""
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -213,9 +202,6 @@ msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
 msgid "Query"
 msgstr ""
 
@@ -269,7 +255,7 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr ""
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
 msgstr ""
 
 msgid ""
@@ -297,9 +283,6 @@ msgid ""
 "only."
 msgstr ""
 
-msgid "This section contains no values yet"
-msgstr ""
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
index e26c44c4dacf01a8e89b119fc36ca667de40df13..408d04055cbf21e7bf5cc874c1baf9d65aaa0ef0 100644 (file)
@@ -16,11 +16,17 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 msgid "'Jail' Blocklist Creation"
-msgstr ""
+msgstr "“Jail” 拦截名单创建"
 
 msgid "-------"
 msgstr "-------"
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+"<b>注意:</b>为防止在小于 64M 空闲内存的设备上出现内存不足异常,请只选择其中的几个!"
+
 msgid "Adblock"
 msgstr "Adblock"
 
@@ -39,26 +45,24 @@ msgstr "触发 Adblock 开始处理前的额外延迟(以秒为单位)。"
 msgid "Advanced"
 msgstr "高级"
 
-msgid "Available blocklist sources."
-msgstr "可用的 blocklist 来源。"
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "备份目录"
 
 msgid "Backup Mode"
-msgstr ""
+msgstr "备份模式"
 
 msgid "Blocklist Sources"
 msgstr "拦截列表来源"
 
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
 msgstr ""
 
 msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
 msgstr ""
 
 msgid ""
@@ -79,6 +83,7 @@ msgid ""
 "Create compressed blocklist backups, they will be used in case of download "
 "errors or during startup in backup mode."
 msgstr ""
+"创建压缩的拦截列表备份,它们将在下载错误或备份模式启动期间使用。"
 
 msgid "DNS Backend (DNS Directory)"
 msgstr "DNS 后端(DNS 目录)"
@@ -95,17 +100,11 @@ msgid ""
 msgstr "启动期间不要自动更新 blocklists,改用 blocklists 的备份。"
 
 msgid "Download Utility"
-msgstr ""
+msgstr "下载工具"
 
 msgid "Download Utility (SSL Library)"
 msgstr "下载实用程序(SSL 库)"
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
 msgid "Edit Blacklist"
 msgstr "编辑黑名单"
 
@@ -116,10 +115,10 @@ msgid "Edit Whitelist"
 msgstr "编辑白名单"
 
 msgid "Email Notification"
-msgstr ""
+msgstr "Email 提醒"
 
 msgid "Email Notification Count"
-msgstr ""
+msgstr "Email 提醒计数"
 
 msgid "Enable Adblock"
 msgstr "启用 Adblock"
@@ -131,6 +130,7 @@ msgid ""
 "Enable memory intense overall sort / duplicate removal on low memory devices "
 "(&lt; 64 MB free RAM)"
 msgstr ""
+"在低内存设备上启用积极的内存整体排序/重复移除(&lt; 64 MB 空闲内存)"
 
 msgid "Enable verbose debug logging in case of any processing error."
 msgstr "在出现任何处理错误的情况下启用详细调试日志记录。"
@@ -142,25 +142,29 @@ msgid "Extra Options"
 msgstr "额外选项"
 
 msgid "Flush DNS Cache"
-msgstr ""
+msgstr "清空 DNS 缓存"
 
 msgid "Flush DNS Cache after adblock processing."
-msgstr ""
+msgstr "在 adblock 进程启动后清空 DNS 缓存。"
 
 msgid ""
 "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
 "'libustream-ssl' or 'built-in'."
 msgstr ""
+"对受 SSL 保护的拦截列表源,您需要一个合适的 SSL 库,如 “libustream-ssl” 或 "
+"“built-in”。"
 
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">check the online "
 "documentation</a>"
 msgstr ""
+"进一步信息<a href=\"%s\" target=\"_blank\">请访问在线文档"
 
 msgid ""
 "For further performance improvements you can raise this value, e.g. '8' or "
 "'16' should be safe."
 msgstr ""
+"为了进一步提高性能,您可以提高此值,例如:8 或 16 应该是安全的。"
 
 msgid "Force Local DNS"
 msgstr "强制本地 DNS"
@@ -169,26 +173,19 @@ msgid "Force Overall Sort"
 msgstr "强制整体排序"
 
 msgid "Full path to the whitelist file."
-msgstr ""
+msgstr "白名单文件的全路径。"
 
 msgid "Input file not found, please check your configuration."
 msgstr "输入文件未找到,请检查您的配置。"
 
-msgid "Invalid domain specified!"
-msgstr "无效域名!"
-
 msgid "Last Run"
 msgstr "最后运行"
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr "列表 URL 和 Shallalist 类别选择可在“高级”选项卡中配置。<br />"
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
 msgstr ""
+"可用网络接口列表。通常启动将由 “wan” 接口触发。<br />"
 
 msgid ""
 "List of supported DNS backends with their default list export directory.<br /"
@@ -196,13 +193,13 @@ msgid ""
 msgstr "支持的 DNS 后端列表及其默认列表导出目录。<br />"
 
 msgid "List of supported and fully pre-configured download utilities."
-msgstr ""
+msgstr "支持和完全预配置的下载工具列表。"
 
 msgid "Loading"
 msgstr "加载中"
 
 msgid "Max. Download Queue"
-msgstr ""
+msgstr "最大下载队列"
 
 msgid "No"
 msgstr "否"
@@ -212,7 +209,7 @@ msgid ""
 msgstr "在默认设置并不适合您时的额外选项。"
 
 msgid "Overall Domains"
-msgstr ""
+msgstr "域名总览"
 
 msgid "Overview"
 msgstr "总览"
@@ -230,9 +227,7 @@ msgstr "请在终端会话中直接编辑此文件。"
 msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
-
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
+"请注意:这需要额外的 “msmtp” 软件包安装和设置。"
 
 msgid "Query"
 msgstr "查询"
@@ -244,6 +239,7 @@ msgid ""
 "Raise the minimum email notification count, to get emails if the overall "
 "count is less or equal to the given limit (default 0),<br />"
 msgstr ""
+"如果总数小于或等于给定限制(默认为 0),请提高最小电子邮件通知数,以获取电子邮件。"
 
 msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
 msgstr "将所有 DNS 查询从“lan”区域重定向到本地解析器。"
@@ -264,11 +260,13 @@ msgid ""
 "Send notification emails in case of a processing error or if domain count is "
 "&le; 0.<br />"
 msgstr ""
+"如果发生错误或域计数 &le; 0,发送通知电子邮件。<br />"
 
 msgid ""
-"Size of the download queue to handle downloads &amp; list processing in parallel "
-"(default '4').<br />"
+"Size of the download queue to handle downloads &amp; list processing in "
+"parallel (default '4').<br />"
 msgstr ""
+"处理下载队列的大小 &amp; 并行处理列表(默认 “4”)。<br />"
 
 msgid "Startup Trigger"
 msgstr "启动触发器"
@@ -283,12 +281,14 @@ msgid ""
 "Target directory for adblock backups. Please use only non-volatile disks, e."
 "g. an external usb stick."
 msgstr ""
+"adblock 备份的目标目录。 请仅使用非易失性磁盘,例如:一个外置 U 盘。"
 
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr "生成的 blocklist 'adb_list.overall'的目标目录。"
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
-msgstr "文件大小太大,无法在 LuCI(&gt; 512 KB)中进行在线编辑。"
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
+msgstr ""
+"文件过大,无法使用 LuCI 的在线编辑(&ge; 100 KB)。"
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -315,9 +315,6 @@ msgid ""
 "only."
 msgstr "此表单显示系统日志输出,仅针对 adblock 相关的消息进行了预筛选。"
 
-msgid "This section contains no values yet"
-msgstr ""
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -336,7 +333,7 @@ msgid "Waiting for command to complete..."
 msgstr "正在执行命令..."
 
 msgid "Whitelist File"
-msgstr ""
+msgstr "白名单文件"
 
 msgid "Yes"
 msgstr "是"
@@ -345,6 +342,7 @@ msgid ""
 "You can use this restrictive blocklist manually e.g. for guest wifi or "
 "kidsafe configurations."
 msgstr ""
+"您可以手动使用此限制性拦截列表,例如:为客人提供 wifi 或 kidsafe 配置。"
 
 msgid "disabled"
 msgstr "已禁用"
@@ -352,7 +350,7 @@ msgstr "已禁用"
 msgid ""
 "e.g. to receive an email notification with every adblock update set this "
 "value to 150000."
-msgstr ""
+msgstr "例如:要接收每个 adblock 更新的电子邮件通知时将此值设置为150000。"
 
 msgid "enabled"
 msgstr "已启用"
@@ -367,5 +365,18 @@ msgid "paused"
 msgstr "已暂停"
 
 msgid "running"
-msgstr ""
+msgstr "运行中"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "无效域名!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "可用的 blocklist 来源。"
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr "列表 URL 和 Shallalist 类别选择可在“高级”选项卡中配置。<br />"
 
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr "文件大小太大,无法在 LuCI(&gt; 512 KB)中进行在线编辑。"
index 417fc6bcc3564c47c335edeb65458f69031a3b63..45b19cdc80f75cf5139c432d638342ccfce7ba26 100644 (file)
@@ -21,6 +21,11 @@ msgstr ""
 msgid "-------"
 msgstr "-------"
 
+msgid ""
+"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
+"than 64 MB free RAM, please only select a few of them!"
+msgstr ""
+
 msgid "Adblock"
 msgstr "Adblock"
 
@@ -39,8 +44,8 @@ msgstr "觸發 Adblock 開始處理前的額外延遲(以秒為單位)。"
 msgid "Advanced"
 msgstr "高階"
 
-msgid "Available blocklist sources."
-msgstr "可用的 blocklist 來源。"
+msgid "Archive Categories"
+msgstr ""
 
 msgid "Backup Directory"
 msgstr "備份目錄"
@@ -51,14 +56,12 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "攔截列表來源"
 
-msgid ""
-"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
-"domains except those listed in the whitelist file.<br />"
+msgid "Blocklist not found!"
 msgstr ""
 
 msgid ""
-"Caution: To prevent OOM exceptions on low memory devices with less than 64 "
-"MB free RAM, please do not select more than five blocklist sources!"
+"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
+"domains except those listed in the whitelist file.<br />"
 msgstr ""
 
 msgid ""
@@ -100,12 +103,6 @@ msgstr ""
 msgid "Download Utility (SSL Library)"
 msgstr "下載實用程式(SSL 庫)"
 
-msgid ""
-"During opkg package installation use the '--force-maintainer' option to "
-"overwrite the pre-existing config file or download a fresh default config "
-"from <a href=\"%s\" target=\"_blank\">here</a>"
-msgstr ""
-
 msgid "Edit Blacklist"
 msgstr "編輯黑名單"
 
@@ -174,17 +171,9 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr "輸入檔案未找到,請檢查您的配置。"
 
-msgid "Invalid domain specified!"
-msgstr "無效域名!"
-
 msgid "Last Run"
 msgstr "最後執行"
 
-msgid ""
-"List URLs and Shallalist category selections are configurable in the "
-"'Advanced' section.<br />"
-msgstr "列表 URL 和 Shallalist 類別選擇可在“高階”選項卡中配置。<br />"
-
 msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
@@ -231,9 +220,6 @@ msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
 
-msgid "Please update your adblock config file to use this package.<br />"
-msgstr ""
-
 msgid "Query"
 msgstr "查詢"
 
@@ -266,8 +252,8 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Size of the download queue to handle downloads &amp; list processing in parallel "
-"(default '4').<br />"
+"Size of the download queue to handle downloads &amp; list processing in "
+"parallel (default '4').<br />"
 msgstr ""
 
 msgid "Startup Trigger"
@@ -287,8 +273,8 @@ msgstr ""
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr "生成的 blocklist 'adb_list.overall'的目標目錄。"
 
-msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
-msgstr "檔案大小太大,無法在 LuCI(&gt; 512 KB)中進行線上編輯。"
+msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
+msgstr ""
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -315,9 +301,6 @@ msgid ""
 "only."
 msgstr "此表單顯示系統日誌輸出,僅針對 adblock 相關的訊息進行了預篩選。"
 
-msgid "This section contains no values yet"
-msgstr ""
-
 msgid ""
 "To overwrite the default path use the 'DNS Directory' option in the extra "
 "section below."
@@ -369,3 +352,16 @@ msgstr "已暫停"
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "無效域名!"
+
+#~ msgid "Available blocklist sources."
+#~ msgstr "可用的 blocklist 來源。"
+
+#~ msgid ""
+#~ "List URLs and Shallalist category selections are configurable in the "
+#~ "'Advanced' section.<br />"
+#~ msgstr "列表 URL 和 Shallalist 類別選擇可在“高階”選項卡中配置。<br />"
+
+#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
+#~ msgstr "檔案大小太大,無法在 LuCI(&gt; 512 KB)中進行線上編輯。"
index 0629c84b363c0443083de562bf5bbb0b5cb50386..5f7429dfd17f73c59619b82b4617d7ec72c53aaa 100644 (file)
 <%- if device_name then -%>
 <fieldset class="cbi-section">
   <legend><%=device_name%><%: Partitions%></legend>
-  <table class="cbi-section-table" id="partitions">
-    <tr class="cbi-section-table-titles">
-      <th class="cbi-section-table-cell"><%:Partition%></th>
-      <th class="cbi-section-table-cell"><%:Status%></th>
-      <th class="cbi-section-table-cell"><%:Firmware/OS (Kernel)%></th>
-      <th class="cbi-section-table-cell"><%:Action%></th>
-    </tr>
-    <tr class="cbi-section-table-row">
-      <td>
+  <div class="table cbi-section-table" id="partitions">
+    <div class="tr cbi-section-table-titles">
+      <div class="th cbi-section-table-cell"><%:Partition%></div>
+      <div class="th cbi-section-table-cell"><%:Status%></div>
+      <div class="th cbi-section-table-cell"><%:Firmware/OS (Kernel)%></div>
+      <div class="th cbi-section-table-cell"><%:Action%></div>
+    </div>
+    <div class="tr cbi-section-table-row">
+      <div class="td">
         <%=string.format("%X", boot_envvar1_partition_one)%>
-      </td>
-      <td>
+      </div>
+      <div class="td">
         <%- if boot_envvar1_partition_one == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
-      </td>
-      <td>
+      </div>
+      <div class="td">
         <%=partition_one_os%>
-      </td>
-      <td>
+      </div>
+      <div class="td">
         <%- if boot_envvar1_partition_one == current_partition then -%>
         <form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
           <input type="hidden" name="token" value="<%=token%>" />
         <input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
       </form>
         <%- end -%>
-      </td>
-    </tr>
-    <tr class="cbi-section-table-row">
-      <td>
+      </div>
+    </div>
+    <div class="tr cbi-section-table-row">
+      <div class="td">
         <%=string.format("%X", boot_envvar1_partition_two)%>
-      </td>
-      <td>
+      </div>
+      <div class="td">
         <%- if boot_envvar1_partition_two == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
-      </td>
-      <td>
+      </div>
+      <div class="td">
         <%=partition_two_os%>
-      </td>
-      <td>
+      </div>
+      <div class="td">
         <%- if boot_envvar1_partition_two == current_partition then -%>
           <form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
                <input type="hidden" name="token" value="<%=token%>" />
@@ -74,9 +74,9 @@
           <input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
         </form>
         <%- end -%>
-      </td>
-    </tr>
-  </table>
+      </div>
+    </div>
+  </div>
 </fieldset>
 <%- else -%>
   <p class="alert-message warning"><%:Warning: This system does not have two partitions!%></p>
index 946828953e0677c1b086ecf21eaf188657dcc781..ab25f862b8b3583fbd10027f077adccea6abb702 100644 (file)
@@ -7,29 +7,21 @@
                        if (st && tb && tx)
                        {
                                /* clear all rows */
-                               while( tb.rows.length > 1 )
-                                       tb.deleteRow(1);
+                               while (tb.firstElementChild !== tb.lastElementChild)
+                                       tb.removeChild(tb.lastElementChild);
 
-                               for( var i = 0; i < st.leases.length; i++ )
+                               for (var i = 0; i < st.leases.length; i++)
                                {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                       tr.insertCell(-1).innerHTML = st.leases[i].addr;
-                                       tr.insertCell(-1).innerHTML = String.format('%t', st.leases[i].age);
+                                       tb.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format((i % 2) + 1), [
+                                               E('<div class="td">', st.leases[i].addr),
+                                               E('<div class="td">', '%t'.format(st.leases[i].age))
+                                       ]));
                                }
 
-                               if( tb.rows.length == 1 )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 2;
-                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
-                               }
+                               if (tb.firstElementChild === tb.lastElementChild)
+                                       tb.appendChild(E('<div class="tr cbi-section-table-row"><div class="td"><em><br /><%:There are no active leases.%></em></div></div>'));
 
-                               if( st.uid == '00:00:00:00:00:00:00:00' )
+                               if (st.uid == '00:00:00:00:00:00:00:00')
                                        tx.innerHTML = '<%:The AHCP Service is not running.%>';
                                else
                                        tx.innerHTML = String.format('<%:The AHCP Service is running with ID %s.%>', st.uid);
 <fieldset class="cbi-section">
        <legend><%:Active AHCP Leases%></legend>
        <p id="ahcpd_status_text"></p>
-       <table class="cbi-section-table" id="ahcpd_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Address%></th>
-                       <th class="cbi-section-table-cell"><%:Age%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
+       <div class="table cbi-section-table" id="ahcpd_status_table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:Address%></div>
+                       <div class="th cbi-section-table-cell"><%:Age%></div>
+               </div>
+               <div class="tr cbi-section-table-row">
+                       <div class="td" colspan="5"><em><br /><%:Collecting data...%></em></div>
+               </div>
+       </div>
 </fieldset>
index 9f644ba0748618594c5fff4c97aec5a1a88cb4c5..fb40335f9967eafb6144628f199a16feadbabbda 100644 (file)
 
                <% for i, plan in pairs(ast.dialplan.plans()) do %>
                <div class="cbi-section-node">
-                       <table class="cbi-section-table">
-                               <tr class="cbi-section-table-titles">
-                                       <th style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+                       <div class="table cbi-section-table">
+                               <div class="tr cbi-section-table-titles">
+                                       <div style="text-align: left; padding: 3px" class="th cbi-section-table-cell">
                                                <big>Dialplan <em><%=plan.name%></em></big>
-                                       </th>
-                                       <td>
+                                       </div>
+                                       <div class="td">
                                                <a href="<%=url('admin/asterisk/dialplans')%>?delplan=<%=plan.name%>">
                                                        <img style="border:none" alt="Remove this dialplan" title="Remove this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
 
                                <!-- dialzones -->
                                <% local zones_used = { }; local row = 0 %>
                                <% for i, zone in ipairs(plan.zones) do zones_used[zone.name] = true %>
-                               <tr class="cbi-section-table-row <%=rowstyle(row)%>">
-                                       <td style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+                               <div class="tr cbi-section-table-row <%=rowstyle(row)%>">
+                                       <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
                                                <strong>&#x2514; Dialzone <em><%=zone.name%></em></strong> (<%=zone.description%>)
                                                <p style="padding-left: 1em; margin-bottom:0">
                                                        Lines:
                                                        Matches:
                                                        <%=format_matches(zone)%>
                                                </p>
-                                       </td>
-                                       <td style="width:5%" class="cbi-value-field">
+                                       </div>
+                                       <div style="width:5%" class="td cbi-value-field">
                                                <a href="<%=url('admin/asterisk/dialplans/out', zone.name)%>">
                                                        <img style="border:none" alt="Edit dialzone" title="Edit dialzone" src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
                                                <a href="<%=url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
                                                        <img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
                                <% row = row + 1; end %>
                                <!-- /dialzones -->
 
                                <!-- voicemail -->
                                <% local boxes_used = { } %>
                                <% for ext, box in luci.util.kspairs(plan.voicemailboxes) do boxes_used[box.id] = true %>
-                               <tr class="cbi-section-table-row <%=rowstyle(row)%>">
-                                       <td style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+                               <div class="tr cbi-section-table-row <%=rowstyle(row)%>">
+                                       <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
                                                <strong>&#x2514; Voicemailbox <em><%=box.id%></em></strong> (<%=box.name%>)
                                                <p style="padding-left: 1em; margin-bottom:0">
                                                        Owner: <%=box.name%> |
                                                        Pager: <%=#box.page  > 0 and box.page  or 'n/a'%><br />
                                                        Matches: <%=format_matches(ext)%>
                                                </p>
-                                       </td>
-                                       <td style="width:5%" class="cbi-value-field">
+                                       </div>
+                                       <div style="width:5%" class="td cbi-value-field">
                                                <a href="<%=url('admin/asterisk/voicemail/mailboxes')%>">
                                                        <img style="border:none" alt="Manage mailboxes ..." title="Manage mailboxes ..." src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
                                                <a href="<%=url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
                                                        <img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
                                <% row = row + 1; end %>
                                <!-- /voicemail -->
 
                                <!-- meetme -->
                                <% local rooms_used = { } %>
                                <% for ext, room in luci.util.kspairs(plan.meetmerooms) do rooms_used[room.room] = true %>
-                               <tr class="cbi-section-table-row <%=rowstyle(row)%>">
-                                       <td style="text-align: left; padding: 3px" class="cbi-section-table-cell">
+                               <div class="tr cbi-section-table-row <%=rowstyle(row)%>">
+                                       <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
                                                <strong>&#x2514; MeetMe Room <em><%=room.room%></em></strong>
                                                <% if room.description and #room.description > 0 then %> (<%=room.description%>)<% end %>
                                                <p style="padding-left: 1em; margin-bottom:0">
                                                        Matches: <%=format_matches(ext)%>
                                                </p>
-                                       </td>
-                                       <td style="width:5%" class="cbi-value-field">
+                                       </div>
+                                       <div style="width:5%" class="td cbi-value-field">
                                                <a href="<%=url('admin/asterisk/meetme/rooms')%>">
                                                        <img style="border:none" alt="Manage conferences ..." title="Manage conferences ..." src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
                                                <a href="<%=url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
                                                        <img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
                                <% row = row + 1; end %>
                                <!-- /meetme -->
 
-                               <tr class="cbi-section-table-row">
-                                       <td style="text-align: left; padding: 3px" class="cbi-section-table-cell" colspan="2">
+                               <div class="tr cbi-section-table-row">
+                                       <div style="text-align: left; padding: 3px" class="td cbi-section-table-cell" colspan="2">
                                                <hr style="margin-bottom:0.5em; border-width:0 0 1px 0" />
 
                                                Add Dialzone:<br />
                                                <br /><br />
 
                                                <input type="submit" class="cbi-button cbi-button-add" value="Add item &raquo;" title="Add item ..."/>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
 
-                       </table>
+                       </div>
 
                        <div class="cbi-section-create cbi-tblsection-create"></div>
                </div>
index ffdbbcf359bbc13d06703368a7471e6d556d6de1..e48da608a672cbdaa25fca27fae09392da5a848c 100644 (file)
        <!-- tblsection -->
        <fieldset class="cbi-section" id="cbi-asterisk-sip">
                <div class="cbi-section-node">
-                       <table class="cbi-section-table">
-                               <tr class="cbi-section-table-titles">
-                                       <th style="text-align: left; padding: 3px" class="cbi-section-table-cell" colspan="6">
+                       <div class="table cbi-section-table">
+                               <div class="tr cbi-section-table-titles">
+                                       <div style="text-align: left; padding: 3px" class="th cbi-section-table-cell" colspan="6">
                                                <h3>Dialzone Overview</h3>
-                                       </th>
-                               </tr>
-
-                               <tr class="cbi-section-table-descr">
-                                       <th style="width: 5%; text-align:right" class="cbi-section-table-cell">Name</th>
-                                       <th style="width: 5%; text-align:right" class="cbi-section-table-cell">Prepend</th>
-                                       <th style="width: 20%; text-align:left" class="cbi-section-table-cell">- Match</th>
-                                       <th style="text-align:left" class="cbi-section-table-cell">Trunk</th>
-                                       <th style="width: 35%; text-align:left" class="cbi-section-table-cell">Description</th>
-                                       <th style="width: 4%; text-align:left" class="cbi-section-table-cell"></th>
-                               </tr>
+                                       </div>
+                               </div>
+
+                               <div class="tr cbi-section-table-descr">
+                                       <div style="width: 5%; text-align:right" class="th cbi-section-table-cell">Name</div>
+                                       <div style="width: 5%; text-align:right" class="th cbi-section-table-cell">Prepend</div>
+                                       <div style="width: 20%; text-align:left" class="th cbi-section-table-cell">- Match</div>
+                                       <div style="text-align:left" class="th cbi-section-table-cell">Trunk</div>
+                                       <div style="width: 35%; text-align:left" class="th cbi-section-table-cell">Description</div>
+                                       <div style="width: 4%; text-align:left" class="th cbi-section-table-cell"></div>
+                               </div>
 
                                <% for i, rule in pairs(ast.dialzone.zones()) do %>
-                               <tr class="cbi-section-table-row <%=rowstyle(i)%>">
-                                       <td style="text-align:right" class="cbi-value-field">
+                               <div class="tr cbi-section-table-row <%=rowstyle(i)%>">
+                                       <div style="text-align:right" class="td cbi-value-field">
                                                <%=rule.name%>
-                                       </td>
-                                       <td style="text-align:right" class="cbi-value-field">
+                                       </div>
+                                       <div style="text-align:right" class="td cbi-value-field">
                                                <% for _ in ipairs(rule.matches) do %>
                                                        <%=rule.addprefix and digit_pattern(rule.addprefix)%>&#160;<br />
                                                <% end %>
-                                       </td>
-                                       <td style="text-align:left" class="cbi-value-field">
+                                       </div>
+                                       <div style="text-align:left" class="td cbi-value-field">
                                                <% for _, m in ipairs(rule.matches) do %>
                                                        <%=rule.localprefix and "%s " % digit_pattern(rule.localprefix)%>
                                                        <%=digit_pattern(m)%><br />
                                                <% end %>
-                                       </td>
-                                       <td style="text-align:left" class="cbi-value-field">
+                                       </div>
+                                       <div style="text-align:left" class="td cbi-value-field">
                                                <%=ast.tools.hyperlinks(
                                                        rule.trunks, function(v)
                                                                return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower()
                                                        end
                                                )%>
-                                       </td>
-                                       <td style="text-align:left" class="cbi-value-field">
+                                       </div>
+                                       <div style="text-align:left" class="td cbi-value-field">
                                                <%=rule.description or rule.name%>
-                                       </td>
-                                       <td style="text-align:left" class="cbi-value-field">
+                                       </div>
+                                       <div style="text-align:left" class="td cbi-value-field">
                                                <a href="<%=url('admin/asterisk/dialplans/out', rule.name)%>">
                                                        <img style="border:none" alt="Edit entry" title="Edit entry" src="/luci-static/resources/cbi/edit.gif" />
                                                </a>
                                                <a href="<%=url('admin/asterisk/dialplans/zones')%>?delzone=<%=rule.name%>">
                                                        <img style="border:none" alt="Delete entry" title="Delete entry" src="/luci-static/resources/cbi/remove.gif" />
                                                </a>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
                                <% end %>
-                       </table>
+                       </div>
                        <div class="cbi-section-create cbi-tblsection-create"></div>
                </div>
                <br />
                                        <br /><span style="color:red">Invalid name given!</span><br />
                                <% end -%>
 
-                               <table>
-                                       <tr>
-                                               <td style="padding:3px">
+                               <div class="table">
+                                       <div class="tr">
+                                               <div class="td" style="padding:3px">
                                                        <label for="create1">1) Name</label><br />
                                                        <input type="text" class="cbi-section-create-name" id="create1" name="newzone_name" style="width:200px" />
                                                        <br /><br />
 
                                                        <label for="create2">2) Number Match</label><br />
                                                        <input type="text" class="cbi-section-create-name" id="create2" name="newzone_match" style="width:200px" />
-                                               </td>
-                                               <td style="padding:3px">
+                                               </div>
+                                               <div class="td" style="padding:3px">
                                                        <label for="create3">3) Trunks</label><br />
                                                        <select class="cbi-input-select" multiple="multiple" id="create3" name="newzone_uses" size="4"  style="width:200px">
                                                                <% for i, t in ipairs(find_trunks()) do %>
                                                                        <option value="<%=t[1]%>"><%=t[2]%></option>
                                                                <% end %>
                                                        </select>
-                                               </td>
-                                       </tr>
-                               </table>
+                                               </div>
+                                       </div>
+                               </div>
                                <br />
 
                                <input type="submit" class="cbi-button cbi-button-add" name="newzone" value="Add entry" title="Add entry"/>
index 632074a56f4805bbe1463d28af336d967c2e2aff..731c3350eb7c2bc0a901bc01377f6b457dda239a 100644 (file)
@@ -14,7 +14,8 @@ $Id$
 
 local wa = require "luci.tools.webadmin"
 local net = require "luci.model.network".init()
-local ifaces = net:get_interfaces()
+local sys = require "luci.sys"
+local ifaces = sys.net:devices()
 
 m = Map("bcp38", translate("BCP38"),
        translate("This function blocks packets with private address destinations " ..
@@ -37,10 +38,17 @@ a.rmempty = false
 
 n = s:option(ListValue, "interface", translate("Interface name"), translate("Interface to apply the blocking to " ..
                                                        "(should be the upstream WAN interface)."))
+
 for _, iface in ipairs(ifaces) do
-     if iface:is_up() then
-       n:value(iface:name())
-     end
+       if not (iface == "lo" or iface:match("^ifb.*")) then
+               local nets = net:get_interface(iface)
+               nets = nets and nets:get_networks() or {}
+               for k, v in pairs(nets) do
+                       nets[k] = nets[k].sid
+               end
+               nets = table.concat(nets, ",")
+               n:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
+       end
 end
 n.rmempty = false
 
index bd6ddeb1b354c4f260b3d87e303c6f3da9ecd72e..72951895187a83e39b37e7688bc6da8bf5ec11c3 100644 (file)
@@ -16,10 +16,11 @@ PKG_VERSION:=2.4.9
 
 # Release == build
 # increase on changes of translation files
-PKG_RELEASE:=3
+PKG_RELEASE:=5
 
 PKG_LICENSE:=Apache-2.0
-PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
+PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>, \
+                               Ansuel Smith <ansuelsmth@gmail.com>
 
 # LuCI specific settings
 LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
index 5f4a5118c387443d91f9c9fa5f4462c707fed177..e152bb0d9844b24ce90db7309fed4d590793271a 100755 (executable)
@@ -21,7 +21,6 @@ luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh"
 
 local srv_name    = "ddns-scripts"
 local srv_ver_min = "2.7.7"                    -- minimum version of service required
-local srv_ver_cmd = luci_helper .. [[ -V | awk {'print $2'}]]
 local app_name    = "luci-app-ddns"
 local app_title   = "Dynamic DNS"
 local app_version = "2.4.9-1"
@@ -29,7 +28,6 @@ local app_version = "2.4.9-1"
 function index()
        local nxfs      = require "nixio.fs"            -- global definitions not available
        local sys       = require "luci.sys"            -- in function index()
-       local ddns      = require "luci.tools.ddns"     -- ddns multiused functions
        local muci      = require "luci.model.uci"
 
        -- no config create an empty one
@@ -81,33 +79,40 @@ end
 
 -- Standardized application/service functions
 function app_title_main()
-       return  [[<a href="javascript:alert(']]
-                       .. I18N.translate("Version Information")
-                       .. [[\n\n]] .. app_name
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
-                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
-                               .. srv_ver_min .. [[ ]] .. I18N.translate("or higher")
-                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
-                               .. (service_version() or I18N.translate("NOT installed"))
-                       .. [[\n\n]]
-               .. [[')">]]
-               .. I18N.translate(app_title)
-               .. [[</a>]]
+       tmp = {}
+       tmp[#tmp+1] =   [[<a href="javascript:alert(']]
+       tmp[#tmp+1] =            I18N.translate("Version Information")
+       tmp[#tmp+1] =            [[\n\n]] .. app_name
+       tmp[#tmp+1] =            [[\n]] .. I18N.translate("Version") .. [[: ]] .. app_version
+       tmp[#tmp+1] =            [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
+       tmp[#tmp+1] =            [[\n]] .. I18N.translate("Version") .. [[: ]]
+       tmp[#tmp+1] =                    srv_ver_min .. [[ ]] .. I18N.translate("or higher")
+       tmp[#tmp+1] =            [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
+       tmp[#tmp+1] =            [[\n]] .. I18N.translate("Version") .. [[: ]]
+       tmp[#tmp+1] =                    (service_version() or I18N.translate("NOT installed"))
+       tmp[#tmp+1] =            [[\n\n]]
+       tmp[#tmp+1] =    [[')">]]
+       tmp[#tmp+1] =    I18N.translate(app_title)
+       tmp[#tmp+1] =    [[</a>]]
+               
+       return table.concat(tmp)
 end
-function service_version()
-       local ver = nil
-
-       ver = UTIL.exec(srv_ver_cmd)
-       if #ver > 0 then return ver end
 
-       IPKG.list_installed(srv_name, function(n, v, d)
-                       if v and (#v > 0) then ver = v end
-               end
-       )
-       return  ver
+function service_version()
+       
+       local srv_ver_cmd = luci_helper .. " -V | awk {'print $2'} "
+       local ver
+       
+       if IPKG then
+               ver = IPKG.info(srv_name)[srv_name].Version
+       else
+               ver = UTIL.exec(srv_ver_cmd)
+       end
+       
+       if ver and #ver > 0 then return ver or nil end
+       
 end
+
 function service_ok()
        return  IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
 end
index 977dbe34b1f52537e00a9cabde5cc11a988da0ae..eb2159076ef230c1c34545e191f7a9dec8f5f848 100644 (file)
@@ -172,7 +172,7 @@ local function _option_used(option, urlscript)
 end
 
 -- function to verify if option is valid
-local function _option_validate(self, value)
+local function _option_validate(self, value, optional)
        -- section is globally defined here be calling agrument (see above)
        local fusev6 = usev6:formvalue(section) or "0"
        local fsvc4  = svc4:formvalue(section) or "-"
@@ -204,6 +204,7 @@ local function _option_validate(self, value)
        if used < 1 then return "" end
        -- needed but no data then return error
        if not value or (#value == 0) then
+               if optional then return nil end                                          
                return nil, err_tab_basic(self) .. translate("missing / required")
        end
        return value
@@ -292,6 +293,10 @@ function luh.parse(self, section, novld)
 end
 
 -- use_ipv6 -- ################################################################
+
+--We call it globally as it's called 11 times even outside specific function, saves 11 os.execute slow command!
+local has_ipv6 = DDNS.env_info("has_ipv6") 
+
 usev6 = ns:taboption("basic", ListValue, "use_ipv6",
        translate("IP address version"),
        translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") )
@@ -300,16 +305,16 @@ usev6.default = "0"
 usev6:value("0", translate("IPv4-Address") )
 function usev6.cfgvalue(self, section)
        local value = AbstractValue.cfgvalue(self, section) or "0"
-       if DDNS.has_ipv6 or (value == "1" and not DDNS.has_ipv6) then
+       if has_ipv6 or (value == "1" and not has_ipv6) then
                self:value("1", translate("IPv6-Address") )
        end
-       if value == "1" and not DDNS.has_ipv6 then
+       if value == "1" and not has_ipv6 then
                self.description = err_ipv6_basic
        end
        return value
 end
 function usev6.validate(self, value)
-       if (value == "1" and DDNS.has_ipv6) or value == "0" then
+       if (value == "1" and has_ipv6) or value == "0" then
                return value
        end
        return nil, err_tab_basic(self) .. err_ipv6_plain
@@ -360,7 +365,7 @@ svc6 = ns:taboption("basic", ListValue, "ipv6_service_name",
        translate("DDNS Service provider") .. " [IPv6]" )
 svc6.default   = "-"
 svc6:depends("use_ipv6", "1")  -- only show on IPv6
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        svc6.description = err_ipv6_basic
 end
 function svc6.cfgvalue(self, section)
@@ -374,7 +379,7 @@ function svc6.cfgvalue(self, section)
 end
 function svc6.validate(self, value)
        if usev6:formvalue(section) == "1" then -- do only on IPv6
-               if DDNS.has_ipv6 then return value end
+               if has_ipv6 then return value end
                return nil, err_tab_basic(self) .. err_ipv6_plain
        else
                return ""       -- suppress validate error
@@ -509,18 +514,18 @@ pe = ns:taboption("basic", Value, "param_enc",
                translate("Optional Encoded Parameter"),
                translate("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)") )
 function pe.validate(self, value)
-       return _option_validate(self, value)
+       return _option_validate(self, value, true)
 end
 function pe.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
 end
 
--- IPv4/IPv6 - param_enc -- ###################################################
+-- IPv4/IPv6 - param_opt -- ###################################################
 po = ns:taboption("basic", Value, "param_opt",
                translate("Optional Parameter"),
                translate("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)") )
 function po.validate(self, value)
-       return _option_validate(self, value)
+       return _option_validate(self, value, true)
 end
 function po.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
@@ -586,13 +591,17 @@ end
 svc6:value("-", translate("-- custom --") )
 
 -- IPv4/IPv6 - use_https -- ###################################################
-if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
+
+--We call it globally as it's called 4 times outside specific function.
+local has_ssl = DDNS.env_info("has_ssl")
+
+if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
        https = ns:taboption("basic", Flag, "use_https",
                translate("Use HTTP Secure") )
        https.orientation = "horizontal"
        function https.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_ssl and value == "1" then
+               if not has_ssl and value == "1" then
                        self.description = bold_on .. font_red ..
                                translate("HTTPS not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -602,7 +611,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
                return value
        end
        function https.validate(self, value)
-               if (value == "1" and DDNS.has_ssl ) or value == "0" then return value end
+               if (value == "1" and has_ssl ) or value == "0" then return value end
                return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !"
        end
        function https.write(self, section, value)
@@ -616,7 +625,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
 end
 
 -- IPv4/IPv6 - cacert -- ######################################################
-if DDNS.has_ssl then
+if has_ssl then
        cert = ns:taboption("basic", Value, "cacert",
                translate("Path to CA-Certificate"),
                translate("directory or path/file") .. "<br />" ..
@@ -706,7 +715,7 @@ src6:value("network", translate("Network"))
 src6:value("web", translate("URL"))
 src6:value("interface", translate("Interface"))
 src6:value("script", translate("Script"))
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        src6.description = err_ipv6_other
 end
 function src6.cfgvalue(self, section)
@@ -715,7 +724,7 @@ end
 function src6.validate(self, value)
        if usev6:formvalue(section) ~= "1" then
                return ""       -- ignore on IPv4 selected
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        elseif not _verify_ip_source() then
                return nil, err_tab_adv(self) ..
@@ -794,7 +803,7 @@ ipn6 = ns:taboption("advanced", ListValue, "ipv6_network",
 ipn6:depends("ipv6_source", "network")
 ipn6.default = "wan6"
 WADM.cbi_add_networks(ipn6)
-if DDNS.has_ipv6 then
+if has_ipv6 then
        ipn6.description = translate("Defines the network to read systems IPv6-Address from")
 else
        ipn6.description = err_ipv6_other
@@ -808,7 +817,7 @@ function ipn6.validate(self, value)
                -- ignore if IPv4 selected OR
                -- ignore everything except "network"
                return ""
-       elseif DDNS.has_ipv6 then
+       elseif has_ipv6 then
                return value
        else
                return nil, err_tab_adv(self) .. err_ipv6_plain
@@ -881,7 +890,7 @@ iurl6 = ns:taboption("advanced", Value, "ipv6_url",
        translate("URL to detect") .. " [IPv6]" )
 iurl6:depends("ipv6_source", "web")
 iurl6.default = "http://checkipv6.dyndns.com"
-if DDNS.has_ipv6 then
+if has_ipv6 then
        iurl6.description = translate("Defines the Web page to read systems IPv6-Address from")
 else
        iurl6.description = err_ipv6_other
@@ -895,7 +904,7 @@ function iurl6.validate(self, value)
                -- ignore if IPv4 selected OR
                -- ignore everything except "web"
                return ""
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        elseif not value or #value == 0 then
                return nil, err_tab_adv(self) .. translate("missing / required")
@@ -1051,7 +1060,7 @@ eif6:depends("ipv6_source", "web")
 eif6:depends("ipv6_source", "script")
 eif6.default = "wan6"
 WADM.cbi_add_networks(eif6)
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        eif6.description = err_ipv6_other
 else
        eif6.description = translate("Network on which the ddns-updater scripts will be started")
@@ -1065,7 +1074,7 @@ function eif6.validate(self, value)
         or fsrc6 == "network"
         or fsrc6 == "interface" then
                return ""       -- ignore IPv4, network, interface
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        else
                return value
@@ -1084,10 +1093,13 @@ function eif6.write(self, section, value)
 end
 function eif6.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
-end
+end 
 
 -- IPv4/IPv6 - bind_network -- ################################################
-if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
+
+local has_bindnet = DDNS.env_info("has_bindnet")
+
+if has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        bnet = ns:taboption("advanced", ListValue, "bind_network",
                translate("Bind Network") )
        bnet:depends("ipv4_source", "web")
@@ -1097,7 +1109,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        WADM.cbi_add_networks(bnet)
        function bnet.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_bindnet and value ~= "" then
+               if not has_bindnet and value ~= "" then
                        self.description = bold_on .. font_red ..
                                translate("Binding to a specific network not supported") .. font_off .. "<br />" ..
                                translate("please set to 'default'") .. " !" .. bold_off
@@ -1108,7 +1120,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
                return value
        end
        function bnet.validate(self, value)
-               if ( (value ~= "") and DDNS.has_bindnet ) or (value == "") then return value end
+               if ( (value ~= "") and has_bindnet ) or (value == "") then return value end
                return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !"
        end
        function bnet.parse(self, section, novld)
@@ -1119,13 +1131,16 @@ end
 -- IPv4 + IPv6 - force_ipversion -- ###########################################
 -- optional to force wget/curl and host to use only selected IP version
 -- command parameter "-4" or "-6"
-if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
+
+local has_forceip = DDNS.env_info("has_forceip")
+
+if has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
        fipv = ns:taboption("advanced", Flag, "force_ipversion",
                translate("Force IP Version") )
        fipv.orientation = "horizontal"
        function fipv.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_forceip and value ~= "0" then
+               if not has_forceip and value ~= "0" then
                        self.description = bold_on .. font_red ..
                                translate("Force IP Version not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -1135,14 +1150,17 @@ if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) t
                return value
        end
        function fipv.validate(self, value)
-               if (value == "1" and DDNS.has_forceip) or value == "0" then return value end
+               if (value == "1" and has_forceip) or value == "0" then return value end
                return nil, err_tab_adv(self) .. translate("Force IP Version not supported")
        end
 end
 
 -- IPv4 + IPv6 - dns_server -- ################################################
 -- optional DNS Server to use resolving my IP
-if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
+
+local has_dnsserver = DDNS.env_info("has_dnsserver")
+
+if has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
        dns = ns:taboption("advanced", Value, "dns_server",
                translate("DNS-Server"),
                translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "<br />" ..
@@ -1152,7 +1170,7 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
                -- if .datatype is set, then it is checked before calling this function
                if not value or (#value == 0) then
                        return ""       -- ignore on empty
-               elseif not DDNS.has_dnsserver then
+               elseif not has_dnsserver then
                        return nil, err_tab_adv(self) .. translate("Specifying a DNS-Server is not supported")
                elseif not DTYP.host(value) then
                        return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address")
@@ -1179,13 +1197,16 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
 end
 
 -- IPv4 + IPv6 - force_dnstcp -- ##############################################
-if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
+
+local has_bindhost = DDNS.env_info("has_bindhost")
+
+if has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
        tcp = ns:taboption("advanced", Flag, "force_dnstcp",
                translate("Force TCP on DNS") )
        tcp.orientation = "horizontal"
        function tcp.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_bindhost and value ~= "0" then
+               if not has_bindhost and value ~= "0" then
                        self.description = bold_on .. font_red ..
                                translate("DNS requests via TCP not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -1195,7 +1216,7 @@ if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) the
                return value
        end
        function tcp.validate(self, value)
-               if (value == "1" and DDNS.has_bindhost ) or value == "0" then
+               if (value == "1" and has_bindhost ) or value == "0" then
                        return value
                end
                return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported")
@@ -1204,13 +1225,16 @@ end
 
 -- IPv4 + IPv6 - proxy -- #####################################################
 -- optional Proxy to use for http/https requests  [user:password@]proxyhost[:port]
-if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
+
+local has_proxy = DDNS.env_info("has_proxy")
+
+if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
        pxy = ns:taboption("advanced", Value, "proxy",
                translate("PROXY-Server") )
        pxy.placeholder="user:password@myproxy.lan:8080"
        function pxy.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_proxy and value ~= "" then
+               if not has_proxy and value ~= "" then
                        self.description = bold_on .. font_red ..
                                translate("PROXY-Server not supported") .. font_off .. "<br />" ..
                                translate("please remove entry") .. "!" .. bold_off
@@ -1226,7 +1250,7 @@ if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
                -- if .datatype is set, then it is checked before calling this function
                if not value or (#value == 0) then
                        return ""       -- ignore on empty
-               elseif DDNS.has_proxy then
+               elseif has_proxy then
                        local ipv6  = usev6:formvalue(section) or "0"
                        local force = fipv:formvalue(section) or "0"
                        local command = CTRL.luci_helper .. [[ -]]
index df39a3a7e583ce29ede849ffce2681cb674fed10..419201548b5c372bb139f2f0b934476eea5ae297 100644 (file)
@@ -48,7 +48,7 @@ if not SYS.init.enabled("ddns") then
 end
 
 -- No IPv6 support
-if not DDNS.has_ipv6 then
+if not DDNS.env_info("has_ipv6") then
        local v6 = s:option(DummyValue, "_no_ipv6")
        v6.titleref = 'http://www.openwrt.org" target="_blank'
        v6.rawhtml  = true
@@ -60,7 +60,7 @@ if not DDNS.has_ipv6 then
 end
 
 -- No HTTPS support
-if not DDNS.has_ssl then
+if not DDNS.env_info("has_ssl") then
        local sl = s:option(DummyValue, "_no_https")
        sl.titleref = DISP.build_url("admin", "system", "packages")
        sl.rawhtml  = true
@@ -74,7 +74,7 @@ if not DDNS.has_ssl then
 end
 
 -- No bind_network
-if not DDNS.has_bindnet then
+if not DDNS.env_info("has_bindnet") then
        local bn = s:option(DummyValue, "_no_bind_network")
        bn.titleref = DISP.build_url("admin", "system", "packages")
        bn.rawhtml  = true
@@ -90,7 +90,7 @@ if not DDNS.has_bindnet then
 end
 
 -- currently only cURL possibly without proxy support
-if not DDNS.has_proxy then
+if not DDNS.env_info("has_proxy") then
        local px = s:option(DummyValue, "_no_proxy")
        px.titleref = DISP.build_url("admin", "system", "packages")
        px.rawhtml  = true
@@ -104,7 +104,7 @@ if not DDNS.has_proxy then
 end
 
 -- "Force IP Version not supported"
-if not DDNS.has_forceip then
+if not DDNS.env_info("has_forceip") then
        local fi = s:option(DummyValue, "_no_force_ip")
        fi.titleref = DISP.build_url("admin", "system", "packages")
        fi.rawhtml  = true
@@ -112,11 +112,11 @@ if not DDNS.has_forceip then
                translate("Force IP Version not supported") .. bold_off
        local value = translate("BusyBox's nslookup and Wget do not support to specify " ..
                                "the IP version to use for communication with DDNS Provider!")
-       if not (DDNS.has_wgetssl or DDNS.has_curl or DDNS.has_fetch) then
+       if not (DDNS.env_info("has_wgetssl") or DDNS.env_info("has_curl") or DDNS.env_info("has_fetch")) then
                value = value .. "<br />- " ..
                        translate("You should install 'wget' or 'curl' or 'uclient-fetch' package.")
        end
-       if not DDNS.has_bindhost then
+       if not DDNS.env_info("has_bindhost") then
                value = value .. "<br />- " ..
                        translate("You should install 'bind-host' or 'knot-host' or 'drill' package for DNS requests.")
        end
@@ -124,7 +124,7 @@ if not DDNS.has_forceip then
 end
 
 -- "DNS requests via TCP not supported"
-if not DDNS.has_bindhost then
+if not DDNS.env_info("has_bindhost") then
        local dt = s:option(DummyValue, "_no_dnstcp")
        dt.titleref = DISP.build_url("admin", "system", "packages")
        dt.rawhtml  = true
@@ -137,7 +137,7 @@ if not DDNS.has_bindhost then
 end
 
 -- nslookup compiled with musl produce problems when using
-if not DDNS.has_dnsserver then
+if not DDNS.env_info("has_dnsserver") then
        local ds = s:option(DummyValue, "_no_dnsserver")
        ds.titleref = DISP.build_url("admin", "system", "packages")
        ds.rawhtml  = true
@@ -151,7 +151,7 @@ if not DDNS.has_dnsserver then
 end
 
 -- certificates installed
-if DDNS.has_ssl and not DDNS.has_cacerts then
+if DDNS.env_info("has_ssl") and not DDNS.env_info("has_cacerts") then
        local ca = s:option(DummyValue, "_no_certs")
        ca.titleref = DISP.build_url("admin", "system", "packages")
        ca.rawhtml  = true
index 114f831c170f16a9a2b870c818b0bc9e7ec2842d..11f73800ea7156454a979632e4ac1fbb693378b6 100644 (file)
@@ -1,21 +1,20 @@
 -- Copyright 2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 -- Licensed to the public under the Apache License 2.0.
 
-local NXFS = require "nixio.fs"
 local DISP = require "luci.dispatcher"
 local HTTP = require "luci.http"
 local SYS  = require "luci.sys"
 local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
-local show_hints = not (DDNS.has_ipv6          -- IPv6 support
-                   and DDNS.has_ssl            -- HTTPS support
-                   and DDNS.has_proxy          -- Proxy support
-                   and DDNS.has_bindhost       -- DNS TCP support
-                   and DDNS.has_forceip        -- Force IP version
-                   and DDNS.has_dnsserver      -- DNS server support
-                   and DDNS.has_bindnet        -- Bind to network/interface
-                   and DDNS.has_cacerts        -- certificates installed at /etc/ssl/certs
+local show_hints = not (DDNS.env_info("has_ipv6")              -- IPv6 support
+                                  and  DDNS.env_info("has_ssl")                -- HTTPS support
+                                  and  DDNS.env_info("has_proxy")              -- Proxy support
+                                  and  DDNS.env_info("has_bindhost")   -- DNS TCP support
+                                  and  DDNS.env_info("has_forceip")    -- Force IP version
+                                  and  DDNS.env_info("has_dnsserver")  -- DNS server support
+                                  and  DDNS.env_info("has_bindnet")    -- Bind to network/interface
+                                  and  DDNS.env_info("has_cacerts")    -- certificates installed at /etc/ssl/certs
                )
 local not_enabled = not SYS.init.enabled("ddns")
 local need_update = not CTRL.service_ok()
index 690b9b30ceb57d62a1ef3bce90917326e229d5ac..57913a51fe529f1022ea3dade30f5e8d05fa2e05 100755 (executable)
@@ -5,36 +5,134 @@ module("luci.tools.ddns", package.seeall)
 
 local NX   = require "nixio"
 local NXFS = require "nixio.fs"
-local OPKG = require "luci.model.ipkg"
 local UCI  = require "luci.model.uci"
 local SYS  = require "luci.sys"
-local UTIL = require "luci.util"
 
-local function _check_certs()
-       local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
-       if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
-       return (v > 0)
-end
+function env_info(type)
+
+       if ( type == "has_ssl" ) or ( type == "has_proxy" ) or ( type == "has_forceip" ) 
+           or ( type == "has_bindnet" ) or ( type == "has_fetch" ) 
+               or ( type == "has_wgetssl" ) or ( type == "has_curl" ) 
+               or ( type == "has_curlssl" ) or ( type == "has_curlpxy" ) 
+               or ( type == "has_fetchssl" ) or ( type == "has_bbwget" ) then 
+               
+               local function has_wgetssl() 
+                       return (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0)    -- and true or nil
+               end
+               
+               local function has_curlssl() 
+                       return (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
+               end
+               
+               local function has_fetch()
+                       return (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_fetchssl()
+                       return NXFS.access("/lib/libustream-ssl.so")
+               end
+               
+               local function has_curl()
+                       return (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_curlpxy()
+                       return (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_bbwget()
+                       return (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
+               end
+               
+               if type == "has_wgetssl" then
+                       return has_wgetssl()
+               
+               elseif type == "has_curl" then
+                       return has_curl()
+                       
+               elseif type == "has_curlssl" then
+                       return has_curlssl()
+                       
+               elseif type == "has_curlpxy" then
+                       return has_curlpxy()
+                       
+               elseif type == "has_fetch" then
+                       return has_fetch()
+                       
+               elseif type == "has_fetchssl" then
+                       return has_fetchssl()
+                       
+               elseif type == "has_bbwget" then
+                       return has_bbwget()
+               
+               elseif type == "has_ssl" then
+                       if has_wgetssl() then return true end
+                       if has_curlssl() then return true end
+                       if (has_fetch() and has_fetchssl()) then return true end
+                       return false
+                       
+               elseif type == "has_proxy" then
+                       if has_wgetssl() then return true end
+                       if has_curlpxy() then return true end
+                       if has_fetch() then return true end
+                       if has_bbwget() then return true end
+                       return false
+                       
+               elseif type == "has_forceip" then
+                       if has_wgetssl() then return true end
+                       if has_curl() then return true end
+                       if has_fetch() then return true end -- only really needed for transfer
+                       return false
+                       
+               elseif type == "has_bindnet" then
+                       if has_curl() then return true end
+                       if has_wgetssl() then return true end
+                       return false
+               end
+       
+       elseif ( type == "has_dnsserver" ) or ( type == "has_bindhost" ) or ( type == "has_hostip" ) or ( type == "has_nslookup" ) then
+               local function has_bindhost() 
+                       if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0) then return true end
+                       return false
+               end
+               
+               local function has_hostip()
+                       return (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_nslookup()
+                       return (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
+               end
+               
+               if type == "has_bindhost" then
+                       return has_bindhost()
+               elseif type == "has_hostip" then
+                       return has_hostip()
+               elseif type == "has_nslookup" then
+                       return has_nslookup()
+               elseif tyep == "has_dnsserver" then
+                       if has_bindhost() then return true end
+                       if has_hostip() then return true end
+                       if has_nslookup() then return true end
+                       return false
+               end
+               
+       elseif type == "has_ipv6" then
+               return (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
+               
+       elseif type == "has_cacerts" then
+               --old _check_certs() local function 
+               local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
+               if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
+               return (v > 0)
+       else
+               return
+       end
 
-has_wgetssl    = (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil
-has_curl       = (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
-has_curlssl    = (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
-has_curlpxy    = (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
-has_fetch      = (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
-has_fetchssl   = NXFS.access("/lib/libustream-ssl.so")
-has_bbwget     = (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
-has_bindhost   = (SYS.call( [[which host >/dev/null 2>&1]] ) == 0)
-               or (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0)
-               or (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0)
-has_hostip     = (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
-has_nslookup   = (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
-has_ipv6       = (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
-has_ssl                = (has_wgetssl or has_curlssl or (has_fetch and has_fetchssl))
-has_proxy      = (has_wgetssl or has_curlpxy or has_fetch or has_bbwget)
-has_forceip    = (has_wgetssl or has_curl or has_fetch) -- only really needed for transfer
-has_dnsserver  = (has_bindhost or has_hostip or has_nslookup)
-has_bindnet    = (has_wgetssl or has_curl)
-has_cacerts    = _check_certs()
+end
 
 -- function to calculate seconds from given interval and unit
 function calc_seconds(interval, unit)
index 5bdcb03e736bd56ef74e18441b881faa2d54acc9..7fcb882a15dfb95b4b219ce81af2f59b2b31409d 100644 (file)
@@ -1,4 +1,3 @@
-
 <!-- ++ BEGIN ++ Dynamic DNS ++ system_status.htm ++ -->
 <script type="text/javascript">//<![CDATA[
        // helper to move status data to the relevant
@@ -10,8 +9,8 @@
                if ( !(tbl) ) { return; }
 
                // clear all rows
-               while (tbl.rows.length > 1)
-                       tbl.deleteRow(1);
+               while (tbl.firstElementChild !== tbl.lastElementChild)
+                       tbl.removeChild(tbl.lastElementChild);
 
                // variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1)
                var i = -1;
                if (data[0].enabled == 0) {
                        var txt = '<strong><font color="red"><%:DDNS Autostart disabled%></font>' ;
                        var url = '<a href="' + data[0].url_up + '"><%:enable here%></a></strong>' ;
-                       var tr = tbl.insertRow(-1);
-                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1);
-                       var td = tr.insertCell(-1);
-                       td.colSpan = 2 ;
-                       td.innerHTML = txt + " - " + url
-                       tr.insertCell(-1).colSpan = 3 ;
+                       tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [
+                                       E('<div class="td">', [ txt," - ", url ])
+                                       ]));
                        i++ ;
                }
 
+               var configuration;
+               var next_update;
+               var lookup;
+               var registered_ip;
+               var network;
+
                for( j = 1; j < data.length; j++ )
                {
-                       var tr = tbl.insertRow(-1);
-                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1) ;
-
                        // configuration
-                       tr.insertCell(-1).innerHTML = '<strong>' + data[j].section + '</strong>' ;
+                       configuration = data[j].section;
 
                        // pid
                        // data[j].pid ignored here
                        // next update
                        switch (data[j].datenext) {
                                case "_empty_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Unknown error%></em>' ;
+                                       next_update = '<em><%:Unknown error%></em>';
                                        break;
                                case "_stopped_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Stopped%></em>' ;
+                                       next_update = '<em><%:Stopped%></em>';
                                        break;
                                case "_disabled_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Disabled%></em>' ;
+                                       next_update = '<em><%:Disabled%></em>';
                                        break;
                                case "_noupdate_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Update error%></em>' ;
+                                       next_update = '<em><%:Update error%></em>';
                                        break;
                                case "_runonce_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Run once%></em>' ;
+                                       next_update = '<em><%:Run once%></em>';
                                        break;
                                case "_verify_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Verify%></em>';
+                                       next_update = '<em><%:Verify%></em>';
                                        break;
                                default:
-                                       tr.insertCell(-1).innerHTML = data[j].datenext ;
+                                       next_update = data[j].datenext;
                                        break;
                        }
 
                        // lookup
                        if (data[j].lookup == "_nolookup_")
-                               tr.insertCell(-1).innerHTML = '<em><%:config error%></em>';
+                               lookup = '<em><%:config error%></em>';
                        else
-                               tr.insertCell(-1).innerHTML = data[j].lookup;
+                               lookup = data[j].lookup;
 
                        // registered IP
                        switch (data[j].reg_ip) {
                                case "_nolookup_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
+                                       registered_ip = '<em><%:config error%></em>';
                                        break;
                                case "_nodata_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:No data%></em>';
+                                       registered_ip = '<em><%:No data%></em>';
                                        break;
                                case "_noipv6_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:IPv6 not supported%></em>';
+                                       registered_ip = '<em><%:IPv6 not supported%></em>';
                                        break;
                                default:
-                                       tr.insertCell(-1).innerHTML = data[j].reg_ip;
+                                       registered_ip = data[j].reg_ip;
                                        break;
                        }
 
                        // monitored interface
                        if (data[j].iface == "_nonet_")
-                               tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
+                               network = '<em><%:Config error%></em>';
                        else
-                               tr.insertCell(-1).innerHTML = data[j].iface;
+                               network = data[j].iface;
+
+                       tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [
+                                       E('<div class="td">', [ E('<strong>', configuration) ]),
+                                       E('<div class="td">', next_update),
+                                       E('<div class="td">', lookup),
+                                       E('<div class="td">', registered_ip),
+                                       E('<div class="td">', network)
+                                       ]));
                }
 
-               if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) {
+               if (tbl.firstElementChild === tbl.lastElementChild || (data[0].enabled == 0 && tbl.childNodes.length == 2) ) {
                        var br = '<br />';
-                       if (tbl.rows.length > 1)
+                       var msg = '<%:There is no service configured.%>';
+                       if (tbl.firstElementChild !== tbl.lastElementChild)
                                br = '';
-                       var tr = tbl.insertRow(-1);
-                       tr.className = "cbi-section-table-row";
-                       var td = tr.insertCell(-1);
-                       td.colSpan = 5;
-                       td.innerHTML = '<em>' + br + '<%:There is no service configured.%></em>' ;
+                       msg = br + msg;
+                       tbl.appendChild(E('<div class="tr cbi-section-table-row">', [
+                                       E('<div class="td">', [ E('<em>', msg) ])
+                                       ]));
                }
        }
 
 <fieldset class="cbi-section" id="ddns_status_section">
        <legend><a href="<%=url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
 
-       <table class="cbi-section-table" id="ddns_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Configuration%></th>
-                       <th class="cbi-section-table-cell"><%:Next Update%></th>
-                       <th class="cbi-section-table-cell"><%:Lookup Hostname%></th>
-                       <th class="cbi-section-table-cell"><%:Registered IP%></th>
-                       <th class="cbi-section-table-cell"><%:Network%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
+       <div class="table cbi-section-table" id="ddns_status_table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:Configuration%></div>
+                       <div class="th cbi-section-table-cell"><%:Next Update%></div>
+                       <div class="th cbi-section-table-cell"><%:Lookup Hostname%></div>
+                       <div class="th cbi-section-table-cell"><%:Registered IP%></div>
+                       <div class="th cbi-section-table-cell"><%:Network%></div>
+               </div>
+               <div class="tr cbi-section-table-row">
+                       <div class="td"><em><br /><%:Collecting data...%></em></div>
+               </div>
+       </div>
 </fieldset>
 <!-- ++ END ++ Dynamic DNS ++ system_status.htm ++ -->
index 17a49483d77115fed13c2fdcf2e0b0eced594b42..d51f8fb79b4a9ca759477ec4fd8019478543c831 100644 (file)
@@ -55,6 +55,7 @@ o = s:option(Value, "src", translate("Source zone"))
 o.nocreate = true
 o.default = "wan"
 o.template = "cbi/firewall_zonelist"
+o.rmempty = false
 
 
 o = s:option(DynamicList, "src_mac",
@@ -88,6 +89,10 @@ o.rmempty = true
 o.datatype = "neg(portrange)"
 o.placeholder = translate("any")
 
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
 
 o = s:option(Value, "src_dip",
        translate("External IP address"),
@@ -108,7 +113,10 @@ o = s:option(Value, "src_dport", translate("External port"),
                "destination port or port range on this host"))
 o.datatype = "neg(portrange)"
 
-
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
 
 o = s:option(Value, "dest", translate("Internal zone"))
 o.nocreate = true
@@ -133,6 +141,10 @@ o = s:option(Value, "dest_port",
 o.placeholder = translate("any")
 o.datatype = "portrange"
 
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
 
 o = s:option(Flag, "reflection", translate("Enable NAT Loopback"))
 o.rmempty = true
index e61ce73cdd6662a998ac03d34db537f62e688b45..5d1ffe09132549f5d6f1eecce8faa8c3f43a70b8 100644 (file)
@@ -54,7 +54,7 @@ function s.parse(self, ...)
        if created then
                m.uci:save("firewall")
                luci.http.redirect(ds.build_url(
-                       "admin/network/firewall/redirect", created
+                       "admin/network/firewall/forwards", created
                ))
        end
 end
@@ -63,8 +63,9 @@ function s.filter(self, sid)
        return (self.map:get(sid, "target") ~= "SNAT")
 end
 
-
-ft.opt_name(s, DummyValue, translate("Name"))
+function s.sectiontitle(self, sid)
+       return (self.map:get(sid, "name") or translate("Unnamed forward"))
+end
 
 
 local function forward_proto_txt(self, s)
@@ -103,7 +104,6 @@ end
 
 match = s:option(DummyValue, "match", translate("Match"))
 match.rawhtml = true
-match.width   = "50%"
 function match.cfgvalue(self, s)
        return "<small>%s<br />%s<br />%s</small>" % {
                forward_proto_txt(self, s),
@@ -115,7 +115,6 @@ end
 
 dest = s:option(DummyValue, "dest", translate("Forward to"))
 dest.rawhtml = true
-dest.width   = "40%"
 function dest.cfgvalue(self, s)
        local z = ft.fmt_zone(self.map:get(s, "dest"), translate("any zone"))
        local a = ft.fmt_ip(self.map:get(s, "dest_ip"), translate("any host"))
@@ -129,6 +128,6 @@ function dest.cfgvalue(self, s)
        end
 end
 
-ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
+ft.opt_enabled(s, Flag, translate("Enable"))
 
 return m
index 1c838888f10e282da9c99191b99b61f74f686233..a4763d5dc4f8cdb58bc6d42c2a3f8238b43179cb 100644 (file)
@@ -115,6 +115,10 @@ elseif rule_type == "redirect" then
        o.datatype = "neg(portrange)"
        o.placeholder = translate("any")
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        o = s:option(Value, "dest", translate("Destination zone"))
        o.nocreate = true
@@ -139,6 +143,10 @@ elseif rule_type == "redirect" then
        o.placeholder = translate("any")
        o.datatype = "neg(portrange)"
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        o = s:option(Value, "src_dip",
                translate("SNAT IP address"),
@@ -163,6 +171,10 @@ elseif rule_type == "redirect" then
        o.rmempty = true
        o.placeholder = translate('Do not rewrite')
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        s:option(Value, "extra",
                translate("Extra arguments"),
@@ -212,7 +224,13 @@ else
        end
 
 
-       o = s:option(DynamicList, "icmp_type", translate("Match ICMP type"))
+       o = s:option(DropDown, "icmp_type", translate("Match ICMP type"))
+       o.multiple = true
+       o.display = 10
+       o.dropdown = 10
+       o.custom = true
+       o.cast = "table"
+
        o:value("", "any")
        o:value("echo-reply")
        o:value("destination-unreachable")
@@ -251,11 +269,13 @@ else
        o:value("address-mask-request")
        o:value("address-mask-reply")
 
+       o:depends("proto", "icmp")
+
 
        o = s:option(Value, "src", translate("Source zone"))
        o.nocreate = true
        o.allowany = true
-       o.default = "wan"
+       o.allowlocal = "src"
        o.template = "cbi/firewall_zonelist"
 
 
@@ -269,7 +289,7 @@ else
 
 
        o = s:option(Value, "src_ip", translate("Source address"))
-       o.datatype = "neg(ipmask)"
+       o.datatype = "list(neg(ipmask))"
        o.placeholder = translate("any")
 
        luci.sys.net.ipv4_hints(function(ip, name)
@@ -281,16 +301,29 @@ else
        o.datatype = "list(neg(portrange))"
        o.placeholder = translate("any")
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
-       o = s:option(Value, "dest", translate("Destination zone"))
+       o = s:option(Value, "dest_local", translate("Output zone"))
+       o.nocreate = true
+       o.allowany = true
+       o.template = "cbi/firewall_zonelist"
+       o.alias = "dest"
+       o:depends("src", "")
+
+       o = s:option(Value, "dest_remote", translate("Destination zone"))
        o.nocreate = true
        o.allowany = true
        o.allowlocal = true
        o.template = "cbi/firewall_zonelist"
+       o.alias = "dest"
+       o:depends({["src"] = "", ["!reverse"] = true})
 
 
        o = s:option(Value, "dest_ip", translate("Destination address"))
-       o.datatype = "neg(ipmask)"
+       o.datatype = "list(neg(ipmask))"
        o.placeholder = translate("any")
 
        luci.sys.net.ipv4_hints(function(ip, name)
@@ -302,6 +335,10 @@ else
        o.datatype = "list(neg(portrange))"
        o.placeholder = translate("any")
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        o = s:option(ListValue, "target", translate("Action"))
        o.default = "ACCEPT"
@@ -316,9 +353,9 @@ else
                translate("Passes additional arguments to iptables. Use with care!"))
 end
 
-o = s:option(MultiValue, "weekdays", translate("Week Days"))
-o.oneline = true
-o.widget = "checkbox"
+o = s:option(DropDown, "weekdays", translate("Week Days"))
+o.multiple = true
+o.display = 5
 o:value("Sun", translate("Sunday"))
 o:value("Mon", translate("Monday"))
 o:value("Tue", translate("Tuesday"))
@@ -327,9 +364,9 @@ o:value("Thu", translate("Thursday"))
 o:value("Fri", translate("Friday"))
 o:value("Sat", translate("Saturday"))
 
-o = s:option(MultiValue, "monthdays", translate("Month Days"))
-o.oneline = true
-o.widget = "checkbox"
+o = s:option(DropDown, "monthdays", translate("Month Days"))
+o.multiple = true
+o.display = 15
 for i = 1,31 do
        o:value(translate(i))
 end
index c533491977c05bd0f13f5f01dccdf9f02e2cdd0a..f4b6b2a928f6d5e281e944da83e744c11186bac9 100644 (file)
@@ -72,7 +72,9 @@ function s.parse(self, ...)
        end
 end
 
-ft.opt_name(s, DummyValue, translate("Name"))
+function s.sectiontitle(self, sid)
+       return (self.map:get(sid, "name") or translate("Unnamed rule"))
+end
 
 local function rule_proto_txt(self, s)
        local f = self.map:get(s, "family")
@@ -89,17 +91,31 @@ local function rule_proto_txt(self, s)
 end
 
 local function rule_src_txt(self, s)
-       local z = ft.fmt_zone(self.map:get(s, "src"), translate("any zone"))
-       local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host"))
+       local z = ft.fmt_zone(self.map:get(s, "src"))
        local p = ft.fmt_port(self.map:get(s, "src_port"))
        local m = ft.fmt_mac(self.map:get(s, "src_mac"))
 
-       if p and m then
-               return translatef("From %s in %s with source %s and %s", a, z, p, m)
-       elseif p or m then
-               return translatef("From %s in %s with source %s", a, z, p or m)
+       -- Forward/Input
+       if z and #z > 0 then
+               local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host"))
+               if p and m then
+                       return translatef("From %s in %s with source %s and %s", a, z, p, m)
+               elseif p or m then
+                       return translatef("From %s in %s with source %s", a, z, p or m)
+               else
+                       return translatef("From %s in %s", a, z)
+               end
+
+       -- Output
        else
-               return translatef("From %s in %s", a, z)
+               local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any router IP"))
+               if p and m then
+                       return translatef("From %s on <var>this device</var> with source %s and %s", a, p, m)
+               elseif p or m then
+                       return translatef("From %s on <var>this device</var> with source %s", a, p or m)
+               else
+                       return translatef("From %s on <var>this device</var>", a)
+               end
        end
 end
 
@@ -145,7 +161,6 @@ end
 
 match = s:option(DummyValue, "match", translate("Match"))
 match.rawhtml = true
-match.width   = "70%"
 function match.cfgvalue(self, s)
        return "<small>%s<br />%s<br />%s</small>" % {
                rule_proto_txt(self, s),
@@ -156,9 +171,8 @@ end
 
 target = s:option(DummyValue, "target", translate("Action"))
 target.rawhtml = true
-target.width   = "20%"
 function target.cfgvalue(self, s)
-       local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "dest"))
+       local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "src"), self.map:get(s, "dest"))
        local l = ft.fmt_limit(self.map:get(s, "limit"),
                self.map:get(s, "limit_burst"))
 
@@ -169,7 +183,7 @@ function target.cfgvalue(self, s)
        end
 end
 
-ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
+ft.opt_enabled(s, Flag, translate("Enable"))
 
 
 --
@@ -226,11 +240,12 @@ function s.filter(self, sid)
        return (self.map:get(sid, "target") == "SNAT")
 end
 
-ft.opt_name(s, DummyValue, translate("Name"))
+function s.sectiontitle(self, sid)
+       return (self.map:get(sid, "name") or translate("Unnamed SNAT"))
+end
 
 match = s:option(DummyValue, "match", translate("Match"))
 match.rawhtml = true
-match.width   = "70%"
 function match.cfgvalue(self, s)
        return "<small>%s<br />%s<br />%s</small>" % {
                rule_proto_txt(self, s),
@@ -241,7 +256,6 @@ end
 
 snat = s:option(DummyValue, "via", translate("Action"))
 snat.rawhtml = true
-snat.width   = "20%"
 function snat.cfgvalue(self, s)
        local a = ft.fmt_ip(self.map:get(s, "src_dip"))
        local p = ft.fmt_port(self.map:get(s, "src_dport"))
@@ -253,7 +267,7 @@ function snat.cfgvalue(self, s)
        end
 end
 
-ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
+ft.opt_enabled(s, Flag, translate("Enable"))
 
 
 return m
index a42c1499f09f59a138ebd47d2b4d24998e3b3ffa..e168c3c6054341273b7207662aba2c82acc4f234 100644 (file)
@@ -101,9 +101,12 @@ end
 function net.write(self, section, value)
        zone:clear_networks()
 
-       local n
-       for n in ut.imatch(value) do
-               zone:add_network(n)
+       local net
+       for net in ut.imatch(value) do
+               local n = nw:get_network(net) or nw:add_network(net, { proto = "none" })
+               if n then
+                       zone:add_network(n:name())
+               end
        end
 end
 
index 500e5078f42c2f0c5b0d6cb88a16e8db2f5efd9f..46402a8fc19bc6ad29c2fbc8351fee7bc5bf6257 100644 (file)
@@ -3,6 +3,7 @@
 
 local ds = require "luci.dispatcher"
 local fw = require "luci.model.firewall"
+local fs = require "nixio.fs"
 
 local m, s, o, p, i, v
 
@@ -32,6 +33,28 @@ for i, v in ipairs(p) do
        v:value("ACCEPT", translate("accept"))
 end
 
+-- Netfilter flow offload support
+
+local offload = fs.access("/sys/module/xt_FLOWOFFLOAD/refcnt")
+
+if offload then
+       s:option(DummyValue, "offload_advice",
+               translate("Routing/NAT Offloading"),
+               translate("Experimental feature. Not fully compatible with QoS/SQM."))
+
+       o = s:option(Flag, "flow_offloading",
+               translate("Software flow offloading"),
+               translate("Software based offloading for routing/NAT"))
+       o.optional = true
+
+       o = s:option(Flag, "flow_offloading_hw",
+               translate("Hardware flow offloading"),
+               translate("Requires hardware NAT support. Implemented at least for mt7621"))
+       o.optional = true
+       o:depends( "flow_offloading", 1)
+end
+
+-- Firewall zones
 
 s = m:section(TypedSection, "zone", translate("Zones"))
 s.template = "cbi/tblsection"
@@ -39,6 +62,11 @@ s.anonymous = true
 s.addremove = true
 s.extedit   = ds.build_url("admin", "network", "firewall", "zones", "%s")
 
+function s.sectiontitle(self, sid)
+       local z = fw:get_zone(sid)
+       return z:name()
+end
+
 function s.create(self)
        local z = fw:new_zone()
        if z then
index 2d89bfa2a6e6792f1f47215531568853d1ff27b4..055342bfb376af4bba8c373653cf7c64ca96953c 100644 (file)
@@ -198,8 +198,18 @@ function fmt_limit(limit, burst)
        end
 end
 
-function fmt_target(x, dest)
-       if dest and #dest > 0 then
+function fmt_target(x, src, dest)
+       if not src or #src == 0 then
+               if x == "ACCEPT" then
+                       return _("Accept output")
+               elseif x == "REJECT" then
+                       return _("Refuse output")
+               elseif x == "NOTRACK" then
+                       return _("Do not track output")
+               else --if x == "DROP" then
+                       return _("Discard output")
+               end
+       elseif dest and #dest > 0 then
                if x == "ACCEPT" then
                        return _("Accept forward")
                elseif x == "REJECT" then
index b3079f3a4812adc0fcaec4a5791f542da1a2b1a9..f48599b505fb8295ba644d8a840771fce3338ff2 100644 (file)
                vals[#vals+1] = '%s (%s)' %{ ip, name }
        end)
 -%>
-<div class="cbi-section-create cbi-tblsection-create">
-       <br />
-       <table class="cbi-section-table" style="width:810px; margin-left:5px">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell" colspan="8"><%:New port forward%>:</th>
-               </tr>
-               <tr class="cbi-section-table-descr">
-                       <th class="cbi-section-table-cell"><%:Name%></th>
-                       <th class="cbi-section-table-cell"><%:Protocol%></th>
-                       <th class="cbi-section-table-cell"><%:External zone%></th>
-                       <th class="cbi-section-table-cell"><%:External port%></th>
-                       <th class="cbi-section-table-cell"><%:Internal zone%></th>
-                       <th class="cbi-section-table-cell"><%:Internal IP address%></th>
-                       <th class="cbi-section-table-cell"><%:Internal port%></th>
-                       <th class="cbi-section-table-cell"></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td class="cbi-section-table-cell">
-                               <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New port forward%>" />
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:110px">
-                               <select class="cbi-input-select" id="_newfwd.proto" name="_newfwd.proto">
-                                       <option value="tcp udp">TCP+UDP</option>
-                                       <option value="tcp">TCP</option>
-                                       <option value="udp">UDP</option>
-                                       <option value="other"><%:Other...%></option>
-                               </select>
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:55px">
-                               <select class="cbi-input-select" id="_newfwd.extzone" name="_newfwd.extzone">
-                                       <% for _, z in ipairs(ezl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
-                               </select>
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:110px">
-                               <input type="text" class="cbi-input-text" id="_newfwd.extport" name="_newfwd.extport" data-type="portrange" data-optional="true" />
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:55px">
-                               <select class="cbi-input-select" id="_newfwd.intzone" name="_newfwd.intzone">
-                                       <% for _, z in ipairs(izl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
-                               </select>
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:110px">
-                               <input type="text" class="cbi-input-text" id="_newfwd.intaddr" name="_newfwd.intaddr" data-type="host" data-optional="true"<%=
-                                       ifattr(#keys > 0, "data-choices", {keys, vals})
-                               %>/>
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:110px">
-                               <input type="text" class="cbi-input-text" id="_newfwd.intport" name="_newfwd.intport" data-type="portrange" data-optional="true" />
-                       </td>
-                       <td class="cbi-section-table-cell">
-                               <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
-                       </td>
-               </tr>
-       </table>
 
-       <script type="text/javascript">//<![CDATA[
-               cbi_bind(document.getElementById('_newfwd.extport'), 'blur',
-                       function() {
-                               var n = document.getElementById('_newfwd.name');
-                               var p = document.getElementById('_newfwd.proto');
-                               var i = document.getElementById('_newfwd.intport');
-                               var hints = {
-                               /*  port    name     0=both, 1=tcp, 2=udp, 3=other */
-                                       21:   [ 'FTP',   1 ],
-                                       22:   [ 'SSH',   1 ],
-                                       53:   [ 'DNS',   0 ],
-                                       80:   [ 'HTTP',  1 ],
-                                       443:  [ 'HTTPS', 1 ],
-                                       3389: [ 'RDP',   1 ],
-                                       5900: [ 'VNC',   1 ],
-                               };
+<h4><%:New port forward%></h4>
+<div class="table">
+       <div class="tr table-titles">
+               <div class="th"><%:Name%></div>
+               <div class="th"><%:Protocol%></div>
+               <div class="th"><%:External zone%></div>
+               <div class="th"><%:External port%></div>
+               <div class="th"><%:Internal zone%></div>
+               <div class="th"><%:Internal IP address%></div>
+               <div class="th"><%:Internal port%></div>
+               <div class="th"></div>
+       </div>
+       <div class="tr">
+               <div class="td">
+                       <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New port forward%>" />
+               </div>
+               <div class="td">
+                       <select class="cbi-input-select" id="_newfwd.proto" name="_newfwd.proto">
+                               <option value="tcp udp">TCP+UDP</option>
+                               <option value="tcp">TCP</option>
+                               <option value="udp">UDP</option>
+                               <option value="other"><%:Other...%></option>
+                       </select>
+               </div>
+               <div class="td">
+                       <select class="cbi-input-select" id="_newfwd.extzone" name="_newfwd.extzone">
+                               <% for _, z in ipairs(ezl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
+                       </select>
+               </div>
+               <div class="td">
+                       <input type="text" class="cbi-input-text" id="_newfwd.extport" name="_newfwd.extport" data-type="portrange" data-optional="true" />
+               </div>
+               <div class="td">
+                       <select class="cbi-input-select" id="_newfwd.intzone" name="_newfwd.intzone">
+                               <% for _, z in ipairs(izl) do -%><option value="<%=z:name()%>"><%=z:name()%></option><%- end %>
+                       </select>
+               </div>
+               <div class="td">
+                       <input type="text" class="cbi-input-text" id="_newfwd.intaddr" name="_newfwd.intaddr" data-type="host" data-optional="true"<%=
+                               ifattr(#keys > 0, "data-choices", {keys, vals})
+                       %>/>
+               </div>
+               <div class="td">
+                       <input type="text" class="cbi-input-text" id="_newfwd.intport" name="_newfwd.intport" data-type="portrange" data-optional="true" />
+               </div>
+               <div class="td bottom">
+                       <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
+               </div>
+       </div>
+</div>
 
-                               if (!this.className.match(/invalid/))
-                               {
-                                       if (!i.value) i.value = this.value;
+<script type="text/javascript">//<![CDATA[
+       cbi_bind(document.getElementById('_newfwd.extport'), 'blur',
+               function() {
+                       var n = document.getElementById('_newfwd.name');
+                       var p = document.getElementById('_newfwd.proto');
+                       var i = document.getElementById('_newfwd.intport');
+                       var hints = {
+                       /*  port    name     0=both, 1=tcp, 2=udp, 3=other */
+                               21:   [ 'FTP',   1 ],
+                               22:   [ 'SSH',   1 ],
+                               53:   [ 'DNS',   0 ],
+                               80:   [ 'HTTP',  1 ],
+                               443:  [ 'HTTPS', 1 ],
+                               3389: [ 'RDP',   1 ],
+                               5900: [ 'VNC',   1 ],
+                       };
 
-                                       var hint = hints[this.value || 0] || hints[i.value || 0];
-                                       if (hint)
-                                       {
-                                               p.selectedIndex = hint[1];
+                       if (!this.className.match(/invalid/))
+                       {
+                               if (!i.value) i.value = this.value;
+
+                               var hint = hints[this.value || 0] || hints[i.value || 0];
+                               if (hint)
+                               {
+                                       p.selectedIndex = hint[1];
 
-                                               if (!n.value)
-                                                       n.value = hint[0];
-                                       }
-                                       else if (!n.value)
-                                       {
-                                               n.value = 'Forward' + this.value;
-                                       }
+                                       if (!n.value)
+                                               n.value = hint[0];
                                }
-                       });
-       //]]></script>
-</div>
+                               else if (!n.value)
+                               {
+                                       n.value = 'Forward' + this.value;
+                               }
+                       }
+               });
+//]]></script>
index b06fac3de424f60bae3a7c2a41003a5d6eb2b143..273675cd30226fcfea872097153bd99a9f043ca7 100644 (file)
        local zones = fw:get_zones()
 %>
 
-<div class="cbi-section-create cbi-tblsection-create">
-       <% if wz then %>
-               <br />
-               <table class="cbi-section-table" style="margin-left:5px">
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell left" colspan="4"><%:Open ports on router%>:</th>
-                       </tr>
-                       <tr class="cbi-section-table-descr">
-                               <th class="cbi-section-table-cell"><%:Name%></th>
-                               <th class="cbi-section-table-cell"><%:Protocol%></th>
-                               <th class="cbi-section-table-cell"><%:External port%></th>
-                               <th class="cbi-section-table-cell"></th>
-                       </tr>
-                       <tr class="cbi-section-table-row">
-                               <td class="cbi-section-table-cell" style="width:130px">
-                                       <input type="text" class="cbi-input-text" id="_newopen.name" name="_newopen.name" placeholder="<%:New input rule%>" />
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <select class="cbi-input-select" id="_newopen.proto" name="_newopen.proto">
-                                               <option value="tcp udp">TCP+UDP</option>
-                                               <option value="tcp">TCP</option>
-                                               <option value="udp">UDP</option>
-                                               <option value="other"><%:Other...%></option>
-                                       </select>
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <input type="text" class="cbi-input-text" id="_newopen.extport" name="_newopen.extport" />
-                               </td>
-                               <td class="cbi-section-table-cell left">
-                                       <input type="submit" class="cbi-button cbi-button-add" name="_newopen.submit" value="<%:Add%>" />
-                               </td>
-                       </tr>
-               </table>
-       <% end %>
-       <% if #zones > 1 then %>
-               <table class="cbi-section-table" style="margin-left:5px">
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell left" colspan="6"><br /><%:New forward rule%>:</th>
-                       </tr>
-                       <tr class="cbi-section-table-descr">
-                               <th class="cbi-section-table-cell"><%:Name%></th>
-                               <th class="cbi-section-table-cell"><%:Source zone%></th>
-                               <th class="cbi-section-table-cell"><%:Destination zone%></th>
-                               <th class="cbi-section-table-cell"></th>
-                       </tr>
-                       <tr class="cbi-section-table-row">
-                               <td class="cbi-section-table-cell" style="width:130px">
-                                       <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New forward rule%>" />
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <select class="cbi-input-text" id="_newfwd.src" name="_newfwd.src">
-                                               <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
-                                                       <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
-                                               <%- end %>
-                                       </select>
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <select class="cbi-input-text" id="_newfwd.dest" name="_newfwd.dest">
-                                               <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
-                                                       <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
-                                               <%- end %>
-                                       </select>
-                               </td>
-                               <td class="cbi-section-table-cell left">
-                                       <input type="submit" class="cbi-button cbi-button-link" name="_newfwd.submit" value="<%:Add and edit...%>" />
-                               </td>
-                       </tr>
-               </table>
-       <% else %>
-               <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
-       <% end %>
+<% if wz then %>
+       <h4><%:Open ports on router%></h4>
+       <div class="table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th"><%:Name%></div>
+                       <div class="th"><%:Protocol%></div>
+                       <div class="th"><%:External port%></div>
+                       <div class="th"></div>
+               </div>
+               <div class="tr">
+                       <div class="td">
+                               <input type="text" class="cbi-input-text" id="_newopen.name" name="_newopen.name" placeholder="<%:New input rule%>" />
+                       </div>
+                       <div class="td">
+                               <select class="cbi-input-select" id="_newopen.proto" name="_newopen.proto">
+                                       <option value="tcp udp">TCP+UDP</option>
+                                       <option value="tcp">TCP</option>
+                                       <option value="udp">UDP</option>
+                                       <option value="other"><%:Other...%></option>
+                               </select>
+                       </div>
+                       <div class="td">
+                               <input type="text" class="cbi-input-text" id="_newopen.extport" name="_newopen.extport" />
+                       </div>
+                       <div class="td bottom">
+                               <input type="submit" class="cbi-button cbi-button-add" name="_newopen.submit" value="<%:Add%>" />
+                       </div>
+               </div>
+       </div>
+<% end %>
+<% if #zones > 1 then %>
+       <h4><%:New forward rule%></h4>
+       <div class="table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th"><%:Name%></div>
+                       <div class="th"><%:Source zone%></div>
+                       <div class="th"><%:Destination zone%></div>
+                       <div class="th"></div>
+               </div>
+               <div class="tr">
+                       <div class="td">
+                               <input type="text" class="cbi-input-text" id="_newfwd.name" name="_newfwd.name" placeholder="<%:New forward rule%>" />
+                       </div>
+                       <div class="td">
+                               <select class="cbi-input-text" id="_newfwd.src" name="_newfwd.src">
+                                       <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+                                               <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+                                       <%- end %>
+                               </select>
+                       </div>
+                       <div class="td">
+                               <select class="cbi-input-text" id="_newfwd.dest" name="_newfwd.dest">
+                                       <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+                                               <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+                                       <%- end %>
+                               </select>
+                       </div>
+                       <div class="td bottom">
+                               <input type="submit" class="cbi-button cbi-button-link" name="_newfwd.submit" value="<%:Add and edit...%>" />
+                       </div>
+               </div>
+       </div>
+<% else %>
+       <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
+<% end %>
 
-       <% if wz then %>
-               <script type="text/javascript">//<![CDATA[
-                       cbi_validate_field('_newopen.extport', true, 'list(neg(portrange))');
-                       cbi_bind(document.getElementById('_newopen.extport'), 'blur',
-                               function() {
-                                       var n = document.getElementById('_newopen.name');
-                                       var p = document.getElementById('_newopen.proto');
-                                       var hints = {
-                                       /*  port    name     0=both, 1=tcp, 2=udp, 3=other */
-                                               22:   [ 'SSH',   1 ],
-                                               53:   [ 'DNS',   0 ],
-                                               80:   [ 'HTTP',  1 ],
-                                               443:  [ 'HTTPS', 1 ],
-                                       };
+<% if wz then %>
+       <script type="text/javascript">//<![CDATA[
+               cbi_validate_field('_newopen.extport', true, 'list(neg(portrange))');
+               cbi_bind(document.getElementById('_newopen.extport'), 'blur',
+                       function() {
+                               var n = document.getElementById('_newopen.name');
+                               var p = document.getElementById('_newopen.proto');
+                               var hints = {
+                               /*  port    name     0=both, 1=tcp, 2=udp, 3=other */
+                                       22:   [ 'SSH',   1 ],
+                                       53:   [ 'DNS',   0 ],
+                                       80:   [ 'HTTP',  1 ],
+                                       443:  [ 'HTTPS', 1 ],
+                               };
 
-                                       if (!this.className.match(/invalid/))
+                               if (!this.className.match(/invalid/))
+                               {
+                                       var hint = hints[this.value || 0];
+                                       if (hint)
                                        {
-                                               var hint = hints[this.value || 0];
-                                               if (hint)
-                                               {
-                                                       p.selectedIndex = hint[1];
+                                               p.selectedIndex = hint[1];
 
-                                                       if (!n.value)
-                                                               n.value = hint[0];
-                                               }
-                                               else if (!n.value && this.value)
-                                               {
-                                                       n.value = 'Open' + this.value;
-                                               }
+                                               if (!n.value)
+                                                       n.value = hint[0];
                                        }
-                               });
+                                       else if (!n.value && this.value)
+                                       {
+                                               n.value = 'Open' + this.value;
+                                       }
+                               }
+                       });
 
 
-                       cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');
-               //]]></script>
-       <% end %>
-</div>
+               cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');
+       //]]></script>
+<% end %>
index 0a5913fc00c13e051c37d9f19f59f5f7cd5e873f..0b4774ccc0d54451f4f154624e37807f76b3e5cc 100644 (file)
        end
 %>
 
-<div class="cbi-section-create cbi-tblsection-create">
-       <% if #zones > 1 then %>
-               <br />
-               <table class="cbi-section-table" style="width:700px; margin-left:5px">
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell left" colspan="6"><%:New source NAT%>:</th>
-                       </tr>
-                       <tr class="cbi-section-table-descr">
-                               <th class="cbi-section-table-cell"><%:Name%></th>
-                               <th class="cbi-section-table-cell"><%:Source zone%></th>
-                               <th class="cbi-section-table-cell"><%:Destination zone%></th>
-                               <th class="cbi-section-table-cell"><%:To source IP%></th>
-                               <th class="cbi-section-table-cell"><%:To source port%></th>
-                               <th class="cbi-section-table-cell"></th>
-                       </tr>
-                       <tr class="cbi-section-table-row">
-                               <td class="cbi-section-table-cell">
-                                       <input type="text" class="cbi-input-text" id="_newsnat.name" name="_newsnat.name" placeholder="<%:New SNAT rule%>" />
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <select class="cbi-input-text" id="_newsnat.src" name="_newsnat.src">
-                                               <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
-                                                       <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
-                                               <%- end %>
-                                       </select>
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <select class="cbi-input-text" id="_newsnat.dest" name="_newsnat.dest">
-                                               <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
-                                                       <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
-                                               <%- end %>
-                                       </select>
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <input type="text" class="cbi-input-text" id="_newsnat.dip" name="_newsnat.dip" placeholder="<%:Do not rewrite%>" data-type="ip4addr" data-optional="true"<%=
-                                               ifattr(#keys > 0, "data-choices", { keys, vals })
-                                       %> />
-                               </td>
-                               <td class="cbi-section-table-cell" style="width:110px">
-                                       <input type="text" class="cbi-input-text" id="_newsnat.dport" name="_newsnat.dport" placeholder="<%:Do not rewrite%>" data-type="portrange" data-optional="true" />
-                               </td>
-                               <td class="cbi-section-table-cell">
-                                       <input type="submit" class="cbi-button cbi-button-link" name="_newsnat.submit" value="<%:Add and edit...%>" />
-                               </td>
-                       </tr>
-               </table>
-       <% else %>
-               <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
-       <% end %>
-</div>
+<% if #zones > 1 then %>
+       <h4><%:New source NAT%></h4>
+       <div class="table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th"><%:Name%></div>
+                       <div class="th"><%:Source zone%></div>
+                       <div class="th"><%:Destination zone%></div>
+                       <div class="th"><%:To source IP%></div>
+                       <div class="th"><%:To source port%></div>
+                       <div class="th"></div>
+               </div>
+               <div class="tr">
+                       <div class="td">
+                               <input type="text" class="cbi-input-text" id="_newsnat.name" name="_newsnat.name" placeholder="<%:New SNAT rule%>" />
+                       </div>
+                       <div class="td">
+                               <select class="cbi-input-text" id="_newsnat.src" name="_newsnat.src">
+                                       <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+                                               <option<%=ifattr(v:name() == "lan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+                                       <%- end %>
+                               </select>
+                       </div>
+                       <div class="td">
+                               <select class="cbi-input-text" id="_newsnat.dest" name="_newsnat.dest">
+                                       <% local k, v; for k, v in ipairs(fw:get_zones()) do -%>
+                                               <option<%=ifattr(v:name() == "wan", "selected", "selected")%> value="<%=v:name()%>"><%=v:name()%></option>
+                                       <%- end %>
+                               </select>
+                       </div>
+                       <div class="td">
+                               <input type="text" class="cbi-input-text" id="_newsnat.dip" name="_newsnat.dip" placeholder="<%:Do not rewrite%>" data-type="ip4addr" data-optional="true"<%=
+                                       ifattr(#keys > 0, "data-choices", { keys, vals })
+                               %> />
+                       </div>
+                       <div class="td">
+                               <input type="text" class="cbi-input-text" id="_newsnat.dport" name="_newsnat.dport" placeholder="<%:Do not rewrite%>" data-type="portrange" data-optional="true" />
+                       </div>
+                       <div class="td bottom">
+                               <input type="submit" class="cbi-button cbi-button-link" name="_newsnat.submit" value="<%:Add and edit...%>" />
+                       </div>
+               </div>
+       </div>
+<% else %>
+       <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
+<% end %>
index ff43427eed07aa08608f957e382c90cd85ce9e7a..b43791939ec2271ea9505350a4e45f7b1e1068f3 100644 (file)
@@ -48,6 +48,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Acció"
 
@@ -106,6 +109,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "No reescriguis"
 
@@ -115,6 +121,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Descarta els paquets invàlids"
 
@@ -130,6 +139,9 @@ msgstr "Habilita protecció contra la inundació SYN"
 msgid "Enable logging on this zone"
 msgstr "Habilita el registre d'aquesta zona"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Adreça IP extern"
 
@@ -178,9 +190,21 @@ msgstr "Des de %s en %s amb origen %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Des de %s en %s amb orígens %s i %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Ajusts generals"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -308,6 +332,9 @@ msgstr "Altre..."
 msgid "Output"
 msgstr "Sortida"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!"
 
@@ -337,6 +364,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -365,6 +398,9 @@ msgstr "Reescriu a l'origen %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Reescriu als orígens %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -380,6 +416,12 @@ msgstr "Port SNAT"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Adreça IP d'origen"
 
index caa7e199884325f0f19ac66b6e9fb1a752211bc3..e4e01a1784ab06ff1e2095276269c1fe016776cf 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Akce"
 
@@ -101,6 +104,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Nepřepisovat"
 
@@ -110,6 +116,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Zahazovat neplatné pakety"
 
@@ -125,6 +134,9 @@ msgstr "Povolit ochranu proti SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Povolit logování v této oblasti"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Vnější IP adresa"
 
@@ -173,9 +185,21 @@ msgstr "Z %s v %s se zdrojovou %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Z %s v %s se zdrojovou %s a %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Obecné nastavení"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -303,6 +327,9 @@ msgstr "Ostatní ..."
 msgid "Output"
 msgstr "Výstup"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Předává další argumenty iptables. Používat opatrně!"
 
@@ -334,6 +361,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -362,6 +395,9 @@ msgstr "Přepsat na zdrojovou %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Přepsat na zdrojovou %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -377,6 +413,12 @@ msgstr "Port SNATu"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Zdrojová IP adresa"
 
index fcf8bec6798ed50c3fa03694beba110718601008..fe1db6ba5896b9efb2f6de64de8a49aa529ebcc7 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Aktion"
 
@@ -104,6 +107,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Nicht umschreiben"
 
@@ -113,6 +119,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Ungültige Pakete verwerfen"
 
@@ -128,6 +137,9 @@ msgstr "Schutz vor SYN-flood-Attacken"
 msgid "Enable logging on this zone"
 msgstr "Protokollierung innerhalb der Zone aktivieren"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Externe IP-Adresse"
 
@@ -176,9 +188,21 @@ msgstr "Von %s in %s mit Quell-%s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Von %s in %s mit Quell-%s und %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Allgemein"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -301,6 +325,9 @@ msgstr "Anderes..."
 msgid "Output"
 msgstr "Ausgang"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht "
@@ -334,6 +361,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -362,6 +395,9 @@ msgstr "Schreibe um auf Quell-%s"
 msgid "Rewrite to source %s, %s"
 msgstr "Schreibe um auf Quell-%s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -377,6 +413,12 @@ msgstr "SNAT-Port"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Quell-IP-Adresse"
 
index 598927557b4b3ee1549e30f4ff43b546657d606e..ecba86665417e41c032aeb5d84bf3b61a912d6e4 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Ενέργεια"
 
@@ -101,6 +104,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -110,6 +116,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Αγνόηση μη-έγκυρων πακετών"
 
@@ -126,6 +135,9 @@ msgstr "Προστασία SYN-flood"
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Εξωτερική διεύθυνση IP"
 
@@ -174,9 +186,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Γενικές Ρυθμίσεις"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -300,6 +324,9 @@ msgstr "Άλλο..."
 msgid "Output"
 msgstr "Έξοδος"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -327,6 +354,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -353,6 +386,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -368,6 +404,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 #, fuzzy
 msgid "Source IP address"
 msgstr "Διεύθυνση MAC πηγής"
index df1ed4a088114e9fe09aed09cceaa0fe031a1f41..1cb489c4b8ba4510d1ce64bc51187f6fb6e651b3 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Action"
 
@@ -98,6 +101,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -107,6 +113,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Drop invalid packets"
 
@@ -122,6 +131,9 @@ msgstr "Enable SYN-flood protection"
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -174,9 +186,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -299,6 +323,9 @@ msgstr ""
 msgid "Output"
 msgstr "Output"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -327,6 +354,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -353,6 +386,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -368,6 +404,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 # Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua      #
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
index bae8b693daa0bbf04c68cc9c63d1daaefd6633f0..ef37e2edc0f8eb32ae3c66896bd35c39d8c36f08 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Acción"
 
@@ -105,6 +108,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "No reescribir"
 
@@ -114,6 +120,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Descartar paquetes no válidos"
 
@@ -129,6 +138,9 @@ msgstr "Activar protección a inundación-SYN"
 msgid "Enable logging on this zone"
 msgstr "Activar registro en esta zona"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Dirección IP externa"
 
@@ -177,9 +189,21 @@ msgstr "Desde %s en %s con origen %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Desde %s en %s con origen %s y %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Configuración general"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -306,6 +330,9 @@ msgstr "Otros..."
 msgid "Output"
 msgstr "Salida"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Pasa más parámetros a IPTables. ¡Usar con cuidado!"
 
@@ -336,6 +363,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -364,6 +397,9 @@ msgstr "Reescribir a origen %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Reescribir a origen %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -379,6 +415,12 @@ msgstr "Puerto SNAT"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Dirección IP origen"
 
index 281999b550a64f832433d957f9bd77110038047b..770d85dbc854d455993a9f251a7484fd71c61954 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Action"
 
@@ -100,6 +103,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -109,6 +115,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Supprimer les paquets invalides"
 
@@ -124,6 +133,9 @@ msgstr "Activer la protection contre le SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Activer les traces (logs) sur cette zone"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Adresse IP externe"
 
@@ -176,9 +188,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Paramètres généraux"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -301,6 +325,9 @@ msgstr "Autre..."
 msgid "Output"
 msgstr "Sortie"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -332,6 +359,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -362,6 +395,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -377,6 +413,12 @@ msgstr "Port SNAT"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 #  applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua                    #
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
index 06952d49018356a9419771e7dac0193d86fc6dc0..45c9d87ce7b2767a95daeebe58af2cf08f83971b 100644 (file)
@@ -41,6 +41,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -95,6 +98,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -104,6 +110,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr ""
 
@@ -119,6 +128,9 @@ msgstr ""
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -167,9 +179,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -290,6 +314,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -317,6 +344,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -343,6 +376,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -358,6 +394,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr ""
 
index 29aa3241876c45b6106b63e8d4b7e07ec9895e97..55d920e47acbc46bc34d8f4ec8d4b3fcc343f202 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Művelet"
 
@@ -102,6 +105,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Ne írja felül"
 
@@ -111,6 +117,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Érvénytelen csomagok eldobása"
 
@@ -126,6 +135,9 @@ msgstr "SYN-flood védelem engedélyezése"
 msgid "Enable logging on this zone"
 msgstr "Naplózás engeélyezése ezen a zónán"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Külső IP cím"
 
@@ -174,9 +186,21 @@ msgstr "%s felől %s-ben %s forrással"
 msgid "From %s in %s with source %s and %s"
 msgstr "%s felől %s-ben %s és %s forrással"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Általános beállítások"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -307,6 +331,9 @@ msgstr "Egyéb..."
 msgid "Output"
 msgstr "Kimenet"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "További argumentumok küldése az iptables részére. Használja körültekintően!"
@@ -338,6 +365,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -366,6 +399,9 @@ msgstr "Átírás %s forrásra"
 msgid "Rewrite to source %s, %s"
 msgstr "Átírás %s, %s forrásra"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -381,6 +417,12 @@ msgstr "SNAT port"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Forrás IP cím"
 
index 43b90a9e9b4d7f220de6bad42b54026fe94e79d0..d639ad828c8ca8d38379a7c937cddfc5bee37491 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Azione"
 
@@ -104,6 +107,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Non riscrivere"
 
@@ -113,6 +119,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Scarta pacchetti invalidi"
 
@@ -128,6 +137,9 @@ msgstr "Attiva protezione SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Attiva registro su questa zona"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Indirizzo IP Esterno"
 
@@ -176,9 +188,21 @@ msgstr "Da %s a %s con sorgente %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Da %s a %s con sorgente %s e %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Opzioni Generali"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -305,6 +329,9 @@ msgstr "Altri..."
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa comandi addizionali a iptables. Usare con cura!"
 
@@ -334,6 +361,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr "Riavvia Firewall"
 
@@ -362,6 +395,9 @@ msgstr "Riscrivi alla sorgente %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Riscrivi alla sorgente %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -377,6 +413,12 @@ msgstr "Porta SNAT"
 msgid "Saturday"
 msgstr "Sabato"
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 # Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua      #
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
index 2d252797ff6742a7a4063179465021d4aefc0999..b52db441dac6fbf793b07e57680f4e8205c5c9a0 100644 (file)
@@ -3,14 +3,14 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-03-30 17:00+0200\n"
-"PO-Revision-Date: 2018-01-15 14:56+0900\n"
+"PO-Revision-Date: 2018-06-18 16:56+0900\n"
 "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 2.0.5\n"
+"X-Generator: Poedit 2.0.8\n"
 "Language-Team: \n"
 
 msgid "%s in %s"
@@ -47,6 +47,9 @@ msgstr "転送を許可"
 msgid "Accept input"
 msgstr "入力を許可"
 
+msgid "Accept output"
+msgstr "出力を許可"
+
 msgid "Action"
 msgstr "動作"
 
@@ -105,6 +108,9 @@ msgstr "転送を破棄"
 msgid "Discard input"
 msgstr "入力を破棄"
 
+msgid "Discard output"
+msgstr "出力を破棄"
+
 msgid "Do not rewrite"
 msgstr "リライトしない"
 
@@ -114,6 +120,9 @@ msgstr "転送を追跡しない"
 msgid "Do not track input"
 msgstr "入力を追跡しない"
 
+msgid "Do not track output"
+msgstr "出力を追跡しない"
+
 msgid "Drop invalid packets"
 msgstr "無効なパケットを遮断する"
 
@@ -129,6 +138,9 @@ msgstr "SYN-Floodプロテクションを有効にする"
 msgid "Enable logging on this zone"
 msgstr "このゾーンのログ記録を有効にする"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr "実験的な機能です。 QoS/SQM との完全な互換性はありません。"
+
 msgid "External IP address"
 msgstr "外部IPアドレス"
 
@@ -172,14 +184,26 @@ msgid "From %s in %s"
 msgstr "送信元 %s (%s)"
 
 msgid "From %s in %s with source %s"
-msgstr "送信元 %s (%s) , 送信元 %s"
+msgstr "送信元 %s (%s) , %s"
 
 msgid "From %s in %s with source %s and %s"
-msgstr "送信元 %s (%s) , 送信元 %s, 送信元 %s"
+msgstr "送信元 %s (%s) , %s, %s"
+
+msgid "From %s on <var>this device</var>"
+msgstr "送信元 %s (<var>デバイス</var>)"
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr "送信元 %s, %s (<var>デバイス</var>)"
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr "送信元 %s, %s, %s (<var>デバイス</var>)"
 
 msgid "General Settings"
 msgstr "一般設定"
 
+msgid "Hardware flow offloading"
+msgstr "ハードウェア フローオフロード"
+
 msgid "IP"
 msgstr "IP"
 
@@ -310,6 +334,9 @@ msgstr "その他のプロトコル"
 msgid "Output"
 msgstr "送信"
 
+msgid "Output zone"
+msgstr "出力ゾーン"
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "iptablesにパススルーする追加の引数を設定してください。ただし、注意して設定し"
@@ -343,6 +370,13 @@ msgstr "転送を拒否"
 msgid "Refuse input"
 msgstr "入力を拒否"
 
+msgid "Refuse output"
+msgstr "出力を拒否"
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+"ハードウェア NAT サポートが必要です。 mt7621 のみにおいて実装されています。"
+
 msgid "Restart Firewall"
 msgstr "ファイアウォールの再起動"
 
@@ -372,6 +406,9 @@ msgstr "送信元 %s にリライト"
 msgid "Rewrite to source %s, %s"
 msgstr "送信元 %s, %s にリライト"
 
+msgid "Routing/NAT Offloading"
+msgstr "ルーティング/NAT オフロード"
+
 msgid "Rule is disabled"
 msgstr "ルールは無効です"
 
@@ -387,6 +424,12 @@ msgstr "SNAT ポート"
 msgid "Saturday"
 msgstr "土曜日"
 
+msgid "Software based offloading for routing/NAT"
+msgstr "ルーティング/NAT のための、ソフトウェアベースのオフロードです。"
+
+msgid "Software flow offloading"
+msgstr "ソフトウェア フローオフロード"
+
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 # Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua      #
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
index bfe94d04a8bd5a3f9834b3c46854c5ed25b21bdb..1e9610c109364265d60aed3b3bf78a3f85e79893 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -103,6 +106,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -112,6 +118,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr ""
 
@@ -127,6 +136,9 @@ msgstr "SYN-flood protection 활성화"
 msgid "Enable logging on this zone"
 msgstr "zone 의 logging 활성화"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "외부 IP 주소"
 
@@ -175,9 +187,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -298,6 +322,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "iptables 명령에 추가 인자들을 더합니다.  조심해 사용하세요!"
 
@@ -327,6 +354,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -353,6 +386,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -368,6 +404,12 @@ msgstr ""
 msgid "Saturday"
 msgstr "토요일"
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Source IP 주소"
 
index c6ab19791eaa0ca032ef253127feac82876cbf41..73cb6db614c753d15295ace08ae45f93986be153 100644 (file)
@@ -40,6 +40,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -94,6 +97,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -103,6 +109,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr ""
 
@@ -118,6 +127,9 @@ msgstr ""
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -166,9 +178,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -289,6 +313,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -316,6 +343,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -342,6 +375,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -357,6 +393,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr ""
 
index e9ecb2b63c6212524a9ef0a160beea828bec7f81..3339c5d4709370663dbfb4cf144f13939fa9157a 100644 (file)
@@ -41,6 +41,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Handling"
 
@@ -98,6 +101,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Ikke omskriv"
 
@@ -107,6 +113,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Forkast ugyldige pakker"
 
@@ -122,6 +131,9 @@ msgstr "Aktiver SYN-flood beskyttelse"
 msgid "Enable logging on this zone"
 msgstr "Aktiver logging av denne sonen"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Ekstern IP adressse"
 
@@ -171,9 +183,21 @@ msgstr "Fra %s i %s med kilde %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Fra %s i %s med kilde %s og %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Generelle Innstillinger"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -302,6 +326,9 @@ msgstr "Andre..."
 msgid "Output"
 msgstr "Utdata"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!"
 
@@ -333,6 +360,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -361,6 +394,9 @@ msgstr "Omskriv til kilde %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Omskriv til kilde %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -376,6 +412,12 @@ msgstr "SNAT port"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Kilde IP adresse"
 
index fe48060237a835574c468a71ff9c43c5d188bfd4..3804d8c03ca8645fb9c3932d88804fb00bc42bb2 100644 (file)
@@ -48,6 +48,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Działanie"
 
@@ -105,6 +108,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Nie przepisuj"
 
@@ -114,6 +120,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Porzuć wadliwe pakiety"
 
@@ -129,6 +138,9 @@ msgstr "Włącz ochronę przed atakiem SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Włącz logowanie na tej strefy"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Zewnętrzne adresy IP"
 
@@ -180,9 +192,21 @@ msgstr "Z %s w %s ze źródłem %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Z %s w %s ze źródłem %s i %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Ustawienia ogólne"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -310,6 +334,9 @@ msgstr "Inne..."
 msgid "Output"
 msgstr "Wyjście (Output)"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególną ostrożność!"
@@ -342,6 +369,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -374,6 +407,9 @@ msgstr "Przepisz do źródła %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Przepisz do źródła %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -389,6 +425,12 @@ msgstr "Port SNAT"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Źródłowy adres IP"
 
index b49adccdda974c1c867d5d6a6a9b5e4c6db5b8df..9b440ad7489b1901b142ea7231fb9c1cd553a519 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Ação"
 
@@ -103,6 +106,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Não sobrescreva"
 
@@ -112,6 +118,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Descartar pacotes inválidos"
 
@@ -127,6 +136,9 @@ msgstr "Habilite proteção contra SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Habilite o registro nesta zona"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Endereço IP externo"
 
@@ -175,9 +187,21 @@ msgstr "Vindo de %s em %s com origem %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Vindo de %s em %s com origem %s e %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Configurações Gerais"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -307,6 +331,9 @@ msgstr "Outro..."
 msgid "Output"
 msgstr "Saída"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!"
 
@@ -337,6 +364,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr "Reiniciar o Firewall"
 
@@ -365,6 +398,9 @@ msgstr "Reescrever para a origem %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Reescrever para a origem %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -380,6 +416,12 @@ msgstr "Porta da SNAT"
 msgid "Saturday"
 msgstr "Sábado"
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Endereço IP de origem"
 
index 29a7c7c2c73b42cb975114d3712acd8e85aaed7a..648f26b955d9631d057ac5006ad5d2f30a7ec797 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Acção"
 
@@ -104,6 +107,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Não re-escrever"
 
@@ -113,6 +119,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Cancelar pacotes inválidos"
 
@@ -128,6 +137,9 @@ msgstr "Ativar a Proteção SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Ativar registo nesta zona"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Endereço IP externo"
 
@@ -176,9 +188,21 @@ msgstr "De %s em %s com origem %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "De %s em %s com origem %s e %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Definições Gerais"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -308,6 +332,9 @@ msgstr "Outro..."
 msgid "Output"
 msgstr "Saída"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!"
 
@@ -339,6 +366,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -365,6 +398,9 @@ msgstr "Re-escrever para a origem %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Re-escrever para a origem %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -380,6 +416,12 @@ msgstr "Porta SNAT"
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Endereço IP de origem"
 
index cc4d7a62af83c0923c5d2fa896acf590ca4a6286..a052d1dc312c794f5a7e05f64edcbf7fb004df9e 100644 (file)
@@ -45,6 +45,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Acţiune"
 
@@ -99,6 +102,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Nu rescrie"
 
@@ -108,6 +114,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Descarcă pachetele invalide"
 
@@ -123,6 +132,9 @@ msgstr "Activează protecţia SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Activeaza log in aceasta zona"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Adresă IP externă"
 
@@ -171,9 +183,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Setari generale"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -294,6 +318,9 @@ msgstr "Altele..."
 msgid "Output"
 msgstr "Ieşire"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -321,6 +348,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -347,6 +380,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -362,6 +398,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "Sursă adresă IP"
 
index b8611af780b318762e90cd197d79d0feeb3eea7e..c596fc906a91d7a764e06c5638b8ce47dbeaf12e 100644 (file)
@@ -48,6 +48,9 @@ msgstr "Принять перенаправление"
 msgid "Accept input"
 msgstr "Принять входящий трафик"
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Действие"
 
@@ -106,6 +109,9 @@ msgstr "Отключить перенаправление"
 msgid "Discard input"
 msgstr "Отключить входящий трафик"
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Не перезаписывать"
 
@@ -115,6 +121,9 @@ msgstr "Не отслеживать перенаправление"
 msgid "Do not track input"
 msgstr "Не отслеживать входящий трафик"
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Не пропускать<br />некорректные пакеты"
 
@@ -130,6 +139,9 @@ msgstr "Включить защиту<br />от SYN-flood атак"
 msgid "Enable logging on this zone"
 msgstr "Включить журналирование в этой зоне"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Внешний IP-адрес"
 
@@ -178,9 +190,21 @@ msgstr "Из %s в %s с источником %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Из %s в %s с источниками %s и %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Основные настройки"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr "IP-адрес"
 
@@ -312,6 +336,9 @@ msgstr "Другое..."
 msgid "Output"
 msgstr "Исходящий трафик"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Передаёт дополнительные аргументы таблице iptables. Используйте с "
@@ -346,6 +373,12 @@ msgstr "Сбрасывать перенаправление"
 msgid "Refuse input"
 msgstr "Сбрасывать входящий трафик"
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr "Перезапустить межсетевой экран"
 
@@ -374,6 +407,9 @@ msgstr "Перенаправлять к источнику %s"
 msgid "Rewrite to source %s, %s"
 msgstr "Перенаправлять к источнику %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr "Правило отключено"
 
@@ -389,6 +425,12 @@ msgstr "Порт SNAT"
 msgid "Saturday"
 msgstr "Суббота"
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "IP-адрес источника"
 
index a185625a027a08d6731e7f946b3a3fd30589b068..b1735ecb2848d1c7877696974213dea57d2e71cf 100644 (file)
@@ -41,6 +41,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -95,6 +98,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -104,6 +110,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr ""
 
@@ -119,6 +128,9 @@ msgstr ""
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -167,9 +179,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -290,6 +314,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -317,6 +344,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -343,6 +376,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -358,6 +394,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr ""
 
index c98eafa09aa08c803e53eefe88ed4d90ac6b7db5..6c9cde89d7b608fd28869a4d9d860e9014734a7c 100644 (file)
@@ -42,6 +42,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Åtgärd"
 
@@ -96,6 +99,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "Skriv inte om igen"
 
@@ -105,6 +111,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Släpp ogiltiga paket"
 
@@ -120,6 +129,9 @@ msgstr ""
 msgid "Enable logging on this zone"
 msgstr "Aktivera loggning i den här zonen"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "Extern IP-adress"
 
@@ -168,9 +180,21 @@ msgstr "Från %s i %s med källa %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "Från %s i %s med källa %s och %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "Generella inställningar"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -296,6 +320,9 @@ msgstr "Andra..."
 msgid "Output"
 msgstr "Utmatning"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -323,6 +350,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr "Starta om brandvägg"
 
@@ -349,6 +382,9 @@ msgstr "Skriv om igen till källan %s"
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -364,6 +400,12 @@ msgstr "SNAT-port"
 msgid "Saturday"
 msgstr "Lördag"
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "IP-adress för källa"
 
index 62c4a2e84a7e153edd4b3b0e6f2b82e89a41e49e..d9015c58474602f1fe1218b4cffe7e265dbb7ed8 100644 (file)
@@ -34,6 +34,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -88,6 +91,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -97,6 +103,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr ""
 
@@ -112,6 +121,9 @@ msgstr ""
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -160,9 +172,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -283,6 +307,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -310,6 +337,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -336,6 +369,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -351,6 +387,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr ""
 
index f23d10aafc677fb12414ebfc03510bdf7ab22bdb..6aa3b4b476da3b4d5717e43d938ea44a9527b1fb 100644 (file)
@@ -41,6 +41,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -95,6 +98,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -104,6 +110,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr ""
 
@@ -119,6 +128,9 @@ msgstr ""
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -167,9 +179,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -290,6 +314,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -317,6 +344,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -343,6 +376,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -358,6 +394,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr ""
 
index de72ec6e0afa25d8e3f454fc0d91093dcc2d31c8..6301b83e35ae26c5af50ba178af75e6353138fb3 100644 (file)
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2012-12-29 12:53+0200\n"
+"PO-Revision-Date: 2018-06-18 20:24+0300\n"
 "Last-Translator: Yurii <yuripet@gmail.com>\n"
 "Language-Team: none\n"
 "Language: uk\n"
@@ -10,7 +10,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
 
 msgid "%s in %s"
 msgstr "%s у %s"
@@ -40,10 +39,13 @@ msgid "<var>%s</var> and limit to %s"
 msgstr "<var>%s</var> з лімітом %s"
 
 msgid "Accept forward"
-msgstr ""
+msgstr "Приймати переспрямовування"
 
 msgid "Accept input"
-msgstr ""
+msgstr "Приймати вхідний"
+
+msgid "Accept output"
+msgstr "Приймати вихідний"
 
 msgid "Action"
 msgstr "Дія"
@@ -58,10 +60,10 @@ msgid "Advanced Settings"
 msgstr "Розширені настройки"
 
 msgid "Allow forward from <em>source zones</em>:"
-msgstr "Дозволити спрямовування від <em>зон-джерел</em>:"
+msgstr "Дозволити переспрямовування від <em>зон джерела</em>:"
 
 msgid "Allow forward to <em>destination zones</em>:"
-msgstr "Дозволити спрямовування до <em>зон призначення</em>:"
+msgstr "Дозволити переспрямовування до <em>зон призначення</em>:"
 
 msgid "Any"
 msgstr "Будь-який"
@@ -95,22 +97,28 @@ msgid "Destination zone"
 msgstr "Зона призначення"
 
 msgid "Disable"
-msgstr ""
+msgstr "Вимкнути"
 
 msgid "Discard forward"
-msgstr ""
+msgstr "Відкидати переспрямовування"
 
 msgid "Discard input"
-msgstr ""
+msgstr "Відкидати вхідний"
+
+msgid "Discard output"
+msgstr "Відкидати вихідний"
 
 msgid "Do not rewrite"
 msgstr "Не перезаписувати"
 
 msgid "Do not track forward"
-msgstr ""
+msgstr "Не відслідковувати переспрямовування"
 
 msgid "Do not track input"
-msgstr ""
+msgstr "Не відслідковувати вхідний"
+
+msgid "Do not track output"
+msgstr "Не відслідковувати вихідний"
 
 msgid "Drop invalid packets"
 msgstr "Відкидати помилкові пакети"
@@ -127,6 +135,9 @@ msgstr "Увімкнути захист від SYN-flood"
 msgid "Enable logging on this zone"
 msgstr "Увімкнути реєстрування у цій зоні"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr "Експериментальна функція. Не повністю сумісно з QoS / SQM."
+
 msgid "External IP address"
 msgstr "Зовнішня IP-адреса"
 
@@ -146,7 +157,7 @@ msgid "Firewall - Custom Rules"
 msgstr "Брандмауер — Настроювані правила"
 
 msgid "Firewall - Port Forwards"
-msgstr "Ð\91Ñ\80андмаÑ\83еÑ\80 â\80\94 Ð¡прямовування портів"
+msgstr "Ð\91Ñ\80андмаÑ\83еÑ\80 â\80\94 Ð\9fеÑ\80еÑ\81прямовування портів"
 
 msgid "Firewall - Traffic Rules"
 msgstr "Брандмауер — Правила трафіка"
@@ -158,34 +169,46 @@ msgid "Force connection tracking"
 msgstr "Увімкнути відстеження з'єднань"
 
 msgid "Forward"
-msgstr "Спрямовування"
+msgstr "Ð\9fеÑ\80еÑ\81прямовування"
 
 msgid "Forward to"
-msgstr "спрямовування до"
+msgstr "переспрямовування до"
 
 msgid "Friday"
-msgstr ""
+msgstr "П'ятниця"
 
 msgid "From %s in %s"
 msgstr "%s у %s"
 
 msgid "From %s in %s with source %s"
-msgstr "%s Ñ\83 %s Ð· Ð²Ð¸Ñ\85Ñ\96дним %s"
+msgstr "%s Ñ\83 %s Ð· Ð´Ð¶ÐµÑ\80елом %s"
 
 msgid "From %s in %s with source %s and %s"
-msgstr "%s у %s з вихідним %s та %s"
+msgstr "%s у %s з джерелом %s та %s"
+
+msgid "From %s on <var>this device</var>"
+msgstr "Від %s на <var>цьому пристрої</var>"
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr "Від %s на <var>цьому пристрої</var> з джерелом %s"
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr "Від %s на <var>цьому пристрої</var> з джерелом %s та %s"
 
 msgid "General Settings"
 msgstr "Загальні настройки"
 
+msgid "Hardware flow offloading"
+msgstr "Апаратні засоби розвантаження потоку"
+
 msgid "IP"
-msgstr ""
+msgstr "IP-адреса"
 
 msgid "IP range"
-msgstr ""
+msgstr "Діапазон IP"
 
 msgid "IPs"
-msgstr ""
+msgstr "IP-адреси"
 
 msgid "IPv4"
 msgstr "IPv4"
@@ -206,7 +229,7 @@ msgid "Input"
 msgstr "Вхідний"
 
 msgid "Inter-Zone Forwarding"
-msgstr "СпÑ\80Ñ\8fмовÑ\83ваннÑ\8f ÐºÑ\80Ñ\96зÑ\8c Ð·Ð¾Ð½и"
+msgstr "Ð\9fеÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83ваннÑ\8f Ð¼Ñ\96ж Ð·Ð¾Ð½Ð°Ð¼и"
 
 msgid "Internal IP address"
 msgstr "Внутрішня IP-адреса"
@@ -221,10 +244,10 @@ msgid "Limit log messages"
 msgstr "Обмеження повідомлень журналу"
 
 msgid "MAC"
-msgstr ""
+msgstr "MAC-адреса"
 
 msgid "MACs"
-msgstr ""
+msgstr "MAC-адреси"
 
 msgid "MSS clamping"
 msgstr "Затискання MSS"
@@ -240,8 +263,8 @@ msgstr "Зіставляти ICMP типу"
 
 msgid "Match forwarded traffic to the given destination port or port range."
 msgstr ""
-"Зіставляти трафік, що спрямовується на заданий порт призначення або діапазон "
-"портів."
+"Зіставляти трафік, що переспрямовується на заданий порт призначення або "
+"дÑ\96апазон Ð¿Ð¾Ñ\80Ñ\82Ñ\96в."
 
 msgid ""
 "Match incoming traffic directed at the given destination port or port range "
@@ -258,10 +281,10 @@ msgstr ""
 "діапазоні портів вузла клієнта."
 
 msgid "Monday"
-msgstr ""
+msgstr "Понеділок"
 
 msgid "Month Days"
-msgstr ""
+msgstr "Дні місяця"
 
 msgid "Name"
 msgstr "Ім'я"
@@ -270,13 +293,13 @@ msgid "New SNAT rule"
 msgstr "Нове правило SNAT"
 
 msgid "New forward rule"
-msgstr "Нове правило спрямовування"
+msgstr "Нове правило переспрямовування"
 
 msgid "New input rule"
 msgstr "Нове вхідне правило"
 
 msgid "New port forward"
-msgstr "Нове спрямовування порту"
+msgstr "Нове переспрямовування порту"
 
 msgid "New source NAT"
 msgstr "Новий NAT джерела"
@@ -306,18 +329,21 @@ msgstr "Інше..."
 msgid "Output"
 msgstr "Вихідний"
 
+msgid "Output zone"
+msgstr "Вихідна зона"
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Передача додаткових аргументів для IPTables. Використовуйте з обережністю!"
 
 msgid "Port Forwards"
-msgstr "Спрямовування портів"
+msgstr "Ð\9fеÑ\80еÑ\81прямовування портів"
 
 msgid ""
 "Port forwarding allows remote computers on the Internet to connect to a "
 "specific computer or service within the private LAN."
 msgstr ""
-"Спрямовування портів дозволяє віддаленим комп'ютерам з Інтернету "
+"Ð\9fеÑ\80еÑ\81прямовування портів дозволяє віддаленим комп'ютерам з Інтернету "
 "підключатися до певного комп'ютера або служби у приватній мережі."
 
 msgid "Protocol"
@@ -332,19 +358,25 @@ msgid "Redirect matched incoming traffic to the specified internal host"
 msgstr "Переспрямувати відповідний вхідний трафік на заданий внутрішній вузол"
 
 msgid "Refuse forward"
-msgstr ""
+msgstr "Відхиляти переспрямовування"
 
 msgid "Refuse input"
-msgstr ""
+msgstr "Відхиляти вхідний"
+
+msgid "Refuse output"
+msgstr "Відхиляти вихідний"
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr "Необхідна апаратна підтримка NAT. Впроваджено принаймні для mt7621"
 
 msgid "Restart Firewall"
-msgstr ""
+msgstr "Перезавантажити брандмауер"
 
 msgid "Restrict Masquerading to given destination subnets"
 msgstr "Обмежити підміну заданими підмережами призначення"
 
 msgid "Restrict Masquerading to given source subnets"
-msgstr "Ð\9eбмежиÑ\82и Ð¿Ñ\96дмÑ\96нÑ\83 Ð·Ð°Ð´Ð°Ð½Ð¸Ð¼Ð¸ Ð²Ð¸Ñ\85Ñ\96дними Ð¿Ñ\96дмеÑ\80ежами"
+msgstr "Ð\9eбмежиÑ\82и Ð¿Ñ\96дмÑ\96нÑ\83 Ð·Ð°Ð´Ð°Ð½Ð¸Ð¼Ð¸ Ð¿Ñ\96дмеÑ\80ежами Ð´Ð¶ÐµÑ\80ела"
 
 msgid "Restrict to address family"
 msgstr "Обмежити сімейство протоколів"
@@ -360,16 +392,19 @@ msgstr ""
 "порожнім, щоб переписувати тільки IP-адресу."
 
 msgid "Rewrite to source %s"
-msgstr "пеÑ\80езапиÑ\81 Ð½Ð° Ð²Ð¸Ñ\85Ñ\96дний %s"
+msgstr "пеÑ\80езапиÑ\81 Ð½Ð° Ð´Ð¶ÐµÑ\80ело %s"
 
 msgid "Rewrite to source %s, %s"
-msgstr "перезапис на вихідний %s, %s"
+msgstr "перезапис на джерело %s, %s"
+
+msgid "Routing/NAT Offloading"
+msgstr "Розвантаження маршрутизації/NAT"
 
 msgid "Rule is disabled"
-msgstr ""
+msgstr "Правило вимкнено"
 
 msgid "Rule is enabled"
-msgstr ""
+msgstr "Правило ввімкнено"
 
 msgid "SNAT IP address"
 msgstr "IP-адреса SNAT"
@@ -378,7 +413,13 @@ msgid "SNAT port"
 msgstr "Порт SNAT"
 
 msgid "Saturday"
-msgstr ""
+msgstr "Субота"
+
+msgid "Software based offloading for routing/NAT"
+msgstr "Програмне розвантаження для маршрутизації/NAT"
+
+msgid "Software flow offloading"
+msgstr "Програмне розвантаження потоку"
 
 msgid "Source IP address"
 msgstr "IP-адреса джерела"
@@ -405,22 +446,22 @@ msgid "Source port"
 msgstr "Порт джерела"
 
 msgid "Source zone"
-msgstr "Зона-джерело"
+msgstr "Зона джерела"
 
 msgid "Start Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "Дата початку (рррр-мм-дд)"
 
 msgid "Start Time (hh:mm:ss)"
-msgstr ""
+msgstr "Час початку (гг:хх:сс)"
 
 msgid "Stop Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "Дата зупинки (рррр-мм-дд)"
 
 msgid "Stop Time (hh:mm:ss)"
-msgstr ""
+msgstr "Час зупинки (гг:хх:сс)"
 
 msgid "Sunday"
-msgstr ""
+msgstr "Неділя"
 
 msgid ""
 "The firewall creates zones over your network interfaces to control network "
@@ -437,19 +478,21 @@ msgid ""
 "rule is <em>unidirectional</em>, e.g. a forward from lan to wan does "
 "<em>not</em> imply a permission to forward from wan to lan as well."
 msgstr ""
-"Опції, наведені нижче, управляють політиками спрямовування між цією (%s) та "
-"іншими зонами. <em>Зони призначення</em> покриваються трафіком, що "
-"<strong>виходить з %q</strong>. <em>Зони-джерела</em> покриваються трафіком "
-"з інших зон, <strong>спрямованим на %q</strong>. Правила спрямування є "
-"<em>односпрямованим</em>, тобто, спрямування від LAN до WAN <em>не</em> "
-"означає, що є також дозвіл спрямовувати від WAN в LAN."
+"Опції, наведені нижче, керують політиками переспрямовування між цією (%s) та "
+"іншими зонами. <em>Зони призначення</em> покриваються переспрямованим "
+"трафіком, що <strong>виходить з %q</strong>. <em>Зони джерела</em> "
+"покриваються трафіком з інших зон, <strong>переспрямованим на %q</strong>. "
+"Правило переспрямовування є <em>односпрямованим</em>, тобто, спрямовування "
+"від LAN до WAN <em>не</em> означає, що є також дозвіл спрямовувати від WAN "
+"до LAN."
 
 msgid ""
 "This page allows you to change advanced properties of the port forwarding "
 "entry. In most cases there is no need to modify those settings."
 msgstr ""
-"На цій сторінці можна змінити додаткові властивості елемента спрямовування "
-"портів. У більшості випадків змінювати ці параметри немає необхідності."
+"На цій сторінці можна змінити додаткові властивості елемента "
+"переспрямовування портів. У більшості випадків змінювати ці параметри немає "
+"потреби."
 
 msgid ""
 "This page allows you to change advanced properties of the traffic rule "
@@ -458,7 +501,6 @@ msgstr ""
 "На цій сторінці можна змінити додаткові властивості елемента правил трафіка, "
 "таких як відповідні параметри джерела та вузлів призначення."
 
-#, fuzzy
 msgid ""
 "This section defines common properties of %q. The <em>input</em> and "
 "<em>output</em> options set the default policies for traffic entering and "
@@ -468,15 +510,15 @@ msgid ""
 msgstr ""
 "Цей розділ визначає загальні властивості %q. Параметри <em>вхідний</em> і "
 "<em>вихідний</em> задають типову політику для трафіку на вході й виході з "
-"цієї зони, а параметр \"спрямовування\" описує політику спрямовування "
-"Ñ\82Ñ\80аÑ\84Ñ\96кÑ\83 Ð¼Ñ\96ж Ñ\80Ñ\96зними Ð¼ÐµÑ\80ежами Ð² Ð¼ÐµÐ¶Ð°Ñ\85 Ð·Ð¾Ð½Ð¸. Ð\9fÑ\83нкÑ\82 <em>вкриті мережі</em> "
+"цієї зони, а параметр \"переспрямовування\" описує політику спрямовування "
+"Ñ\82Ñ\80аÑ\84Ñ\96кÑ\83 Ð¼Ñ\96ж Ñ\80Ñ\96зними Ð¼ÐµÑ\80ежами Ð² Ð¼ÐµÐ¶Ð°Ñ\85 Ð·Ð¾Ð½Ð¸. Ð\9fÑ\83нкÑ\82 <em>Ð\9fокриті мережі</em> "
 "визначає, які доступні мережі є членами цієї зони."
 
 msgid "Thursday"
-msgstr ""
+msgstr "Четвер"
 
 msgid "Time in UTC"
-msgstr ""
+msgstr "Час в UTC"
 
 msgid "To %s at %s on <var>this device</var>"
 msgstr "%s на %s <var>цього пристрою</var>"
@@ -509,7 +551,7 @@ msgstr ""
 "порти WAN на маршрутизаторі."
 
 msgid "Tuesday"
-msgstr ""
+msgstr "Вівторок"
 
 msgid "Via %s"
 msgstr "Через %s"
@@ -518,10 +560,10 @@ msgid "Via %s at %s"
 msgstr "Через %s на %s"
 
 msgid "Wednesday"
-msgstr ""
+msgstr "Середа"
 
 msgid "Week Days"
-msgstr ""
+msgstr "Дні тижня"
 
 msgid ""
 "You may specify multiple by selecting \"-- custom --\" and then entering "
@@ -534,7 +576,7 @@ msgid "Zone %q"
 msgstr "Зона %q"
 
 msgid "Zone ⇒ Forwardings"
-msgstr "Ð\97она â\87\92 Ð¡прямовування"
+msgstr "Ð\97она â\87\92 Ð\9fеÑ\80еÑ\81прямовування"
 
 msgid "Zones"
 msgstr "Зони"
@@ -555,7 +597,7 @@ msgid "any zone"
 msgstr "будь-якій зоні"
 
 msgid "day"
-msgstr ""
+msgstr "день"
 
 msgid "don't track"
 msgstr "не відстеж."
@@ -564,31 +606,31 @@ msgid "drop"
 msgstr "опускати"
 
 msgid "hour"
-msgstr ""
+msgstr "година"
 
 msgid "minute"
-msgstr ""
+msgstr "хвилина"
 
 msgid "not"
-msgstr ""
+msgstr "не"
 
 msgid "port"
-msgstr ""
+msgstr "порт"
 
 msgid "ports"
-msgstr ""
+msgstr "порти"
 
 msgid "reject"
 msgstr "відкидати"
 
 msgid "second"
-msgstr ""
+msgstr "секунда"
 
 msgid "traffic"
-msgstr ""
+msgstr "трафік"
 
 msgid "type"
-msgstr ""
+msgstr "типом"
 
 msgid "types"
-msgstr ""
+msgstr "типами"
index 24452ff1c00cbb547c04d4a389770c2fb78ac3ea..7032dac258f42ad3e46d264a96b51e7cdc4727b6 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "Action"
 
@@ -101,6 +104,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr ""
 
@@ -110,6 +116,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "Bỏ qua nhưng gói không hợp lý"
 
@@ -126,6 +135,9 @@ msgstr "SYN-flood bảo vệ "
 msgid "Enable logging on this zone"
 msgstr ""
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr ""
 
@@ -174,9 +186,21 @@ msgstr ""
 msgid "From %s in %s with source %s and %s"
 msgstr ""
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr ""
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -300,6 +324,9 @@ msgstr ""
 msgid "Output"
 msgstr "Output"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
@@ -327,6 +354,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr ""
 
@@ -353,6 +386,9 @@ msgstr ""
 msgid "Rewrite to source %s, %s"
 msgstr ""
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -368,6 +404,12 @@ msgstr ""
 msgid "Saturday"
 msgstr ""
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 #, fuzzy
 msgid "Source IP address"
 msgstr "Đỉa chỉ MAC nguồn"
index 9e9c64d6704b584b90c98ec243801e801ffc5ff9..1b12dc5e19797f520ddbba456507a2b654a95e97 100644 (file)
@@ -44,6 +44,9 @@ msgstr "接受转发"
 msgid "Accept input"
 msgstr "接受入站"
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "动作"
 
@@ -100,6 +103,9 @@ msgstr "丢弃转发"
 msgid "Discard input"
 msgstr "丢弃入站"
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "不重写"
 
@@ -109,6 +115,9 @@ msgstr "不跟踪转发"
 msgid "Do not track input"
 msgstr "不跟踪入站"
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "丢弃无效数据包"
 
@@ -124,6 +133,9 @@ msgstr "启用 SYN-flood 防御"
 msgid "Enable logging on this zone"
 msgstr "启用此区域的日志记录"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr "实验特性。与 QoS/SQM 不完全兼容。"
+
 msgid "External IP address"
 msgstr "外部 IP 地址"
 
@@ -172,9 +184,21 @@ msgstr "来自 %s 位于 %s 源于 %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "来自 %s 位于 %s 源端口 %s 源 MAC %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "基本设置"
 
+msgid "Hardware flow offloading"
+msgstr "硬件流量分载"
+
 msgid "IP"
 msgstr "IP"
 
@@ -295,6 +319,9 @@ msgstr "其它..."
 msgid "Output"
 msgstr "出站数据"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "传递到 iptables 的额外参数。小心使用!"
 
@@ -323,6 +350,12 @@ msgstr "拒绝转发"
 msgid "Refuse input"
 msgstr "拒绝入站"
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr "需要硬件 NAT 支持。目前 mt7621 已实现"
+
 msgid "Restart Firewall"
 msgstr "重启防火墙"
 
@@ -349,6 +382,9 @@ msgstr "源地址改写成 %s"
 msgid "Rewrite to source %s, %s"
 msgstr "源地址改写成 %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr "Routing/NAT 分载"
+
 msgid "Rule is disabled"
 msgstr "规则已禁用"
 
@@ -364,6 +400,12 @@ msgstr "SNAT 端口"
 msgid "Saturday"
 msgstr "星期六"
 
+msgid "Software based offloading for routing/NAT"
+msgstr "基于软件的 Routing/NAT 分载"
+
+msgid "Software flow offloading"
+msgstr "软件流量分载"
+
 msgid "Source IP address"
 msgstr "源 IP 地址"
 
index afc9c4e33c1d19e6b75f0242a99b60a8e8138670..070d22d6f4f87ec949a15fc73ed303b3e5684734 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "Accept input"
 msgstr ""
 
+msgid "Accept output"
+msgstr ""
+
 msgid "Action"
 msgstr "動作"
 
@@ -100,6 +103,9 @@ msgstr ""
 msgid "Discard input"
 msgstr ""
 
+msgid "Discard output"
+msgstr ""
+
 msgid "Do not rewrite"
 msgstr "不重寫"
 
@@ -109,6 +115,9 @@ msgstr ""
 msgid "Do not track input"
 msgstr ""
 
+msgid "Do not track output"
+msgstr ""
+
 msgid "Drop invalid packets"
 msgstr "丟棄無效資料包"
 
@@ -124,6 +133,9 @@ msgstr "啟用 SYN-flood 防禦"
 msgid "Enable logging on this zone"
 msgstr "啟用此區域的日誌記錄"
 
+msgid "Experimental feature. Not fully compatible with QoS/SQM."
+msgstr ""
+
 msgid "External IP address"
 msgstr "外部 IP 位址"
 
@@ -172,9 +184,21 @@ msgstr "來自 %s 位於 %s 源於 %s"
 msgid "From %s in %s with source %s and %s"
 msgstr "來自 %s 位於 %s 源埠 %s 源 MAC %s"
 
+msgid "From %s on <var>this device</var>"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s"
+msgstr ""
+
+msgid "From %s on <var>this device</var> with source %s and %s"
+msgstr ""
+
 msgid "General Settings"
 msgstr "基本設定"
 
+msgid "Hardware flow offloading"
+msgstr ""
+
 msgid "IP"
 msgstr ""
 
@@ -295,6 +319,9 @@ msgstr "其它..."
 msgid "Output"
 msgstr "出站資料"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "傳遞到 iptables 的額外引數。小心使用!"
 
@@ -322,6 +349,12 @@ msgstr ""
 msgid "Refuse input"
 msgstr ""
 
+msgid "Refuse output"
+msgstr ""
+
+msgid "Requires hardware NAT support. Implemented at least for mt7621"
+msgstr ""
+
 msgid "Restart Firewall"
 msgstr "重啟防火牆"
 
@@ -348,6 +381,9 @@ msgstr "源位址改寫成 %s"
 msgid "Rewrite to source %s, %s"
 msgstr "源位址改寫成 %s, %s"
 
+msgid "Routing/NAT Offloading"
+msgstr ""
+
 msgid "Rule is disabled"
 msgstr ""
 
@@ -363,6 +399,12 @@ msgstr "SNAT 埠"
 msgid "Saturday"
 msgstr "星期六"
 
+msgid "Software based offloading for routing/NAT"
+msgstr ""
+
+msgid "Software flow offloading"
+msgstr ""
+
 msgid "Source IP address"
 msgstr "源 IP 位址"
 
index d861ef9fcba9f2a723e637698cb727d6aa852e7e..2fd7168bd2df6d4fd33e186c6867e918df9bcd28 100644 (file)
@@ -5,13 +5,12 @@ XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
                var tb = document.getElementById('telephony_status_table');
                if (st && tb)
                {
-                       tb.deleteRow(1);
-                       var tr = tb.insertRow(-1);
-                       tr.className = 'cbi-section-table-row cbi-rowstyle-1';
-
-                       tr.insertCell(-1).innerHTML = st.status;
-                       tr.insertCell(-1).innerHTML = st.line1;
-                       tr.insertCell(-1).innerHTML = st.line2;
+                       tb.removeChild(tb.firstChild);
+                       tb.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-1">', [
+                               E('<div class="td">', st.status),
+                               E('<div class="td">', st.line1),
+                               E('<div class="td">', st.line2)
+                       ]));
                }
        }
 );
@@ -19,14 +18,14 @@ XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
 
 <fieldset class="cbi-section">
        <legend><%:Current Telephony State%></legend>
-       <table class="cbi-section-table" id="telephony_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Uplink%></th>
-                       <th class="cbi-section-table-cell"><%:Port1%></th>
-                       <th class="cbi-section-table-cell"><%:Port2%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
+       <div class="table cbi-section-table" id="telephony_status_table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:Uplink%></div>
+                       <div class="th cbi-section-table-cell"><%:Port1%></div>
+                       <div class="th cbi-section-table-cell"><%:Port2%></div>
+               </div>
+               <div class="tr cbi-section-table-row">
+                       <div class="td" colspan="5"><em><br /><%:Collecting data...%></em></div>
+               </div>
+       </div>
 </fieldset>
index 6ee351c4c20e99c894c9c3e553924b9b09d755d0..a5826926ddbb52aed3c3083dada77e5454c49ef0 100644 (file)
@@ -7,7 +7,7 @@ msgstr ""
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.3\n"
+"X-Generator: Poedit 2.0.7\n"
 "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Language: ja\n"
@@ -43,6 +43,9 @@ msgstr "利用可能な値: 1-256。空欄の場合のデフォルトは1です
 msgid "Check IP rules"
 msgstr "IP ルールのチェック"
 
+msgid "Check link quality"
+msgstr "リンク品質のチェック"
+
 msgid "Check routing table"
 msgstr "ルーティング テーブルのチェック"
 
@@ -56,7 +59,7 @@ msgid "Destination port"
 msgstr "宛先ポート"
 
 msgid "Detail"
-msgstr ""
+msgstr "詳細"
 
 msgid "Diagnostics"
 msgstr "診断機能"
@@ -77,7 +80,7 @@ msgid "Enter value in hex, starting with <code>0x</code>"
 msgstr "<code>0x</code> で始まる16進数の値を入力してください。"
 
 msgid "Execute"
-msgstr ""
+msgstr "実行"
 
 msgid "Expect interface state on up event"
 msgstr "Up イベント時に予想されるインターフェースの状態です。"
@@ -89,10 +92,12 @@ msgid "Firewall mask"
 msgstr "ファイアウォール マスク"
 
 msgid "Flush conntrack table"
-msgstr ""
+msgstr "conntrack テーブルのクリア"
 
 msgid "Flush global firewall conntrack table on interface events"
 msgstr ""
+"インターフェース イベント時にグローバル ファイアウォール conntrack テーブルを"
+"クリアします。"
 
 msgid "Globals"
 msgstr "全般"
@@ -104,7 +109,7 @@ msgid "Hotplug ifup"
 msgstr "ホットプラグ ifup"
 
 msgid "INFO: MWAN not running"
-msgstr ""
+msgstr "情報: MWAN は実行されていません"
 
 msgid "IPset"
 msgstr "IPset"
@@ -157,28 +162,28 @@ msgid "Local source interface"
 msgstr ""
 
 msgid "MWAN - Globals"
-msgstr ""
+msgstr "MWAN - グローバル"
 
 msgid "MWAN - Interfaces"
-msgstr ""
+msgstr "MWAN - インターフェース"
 
 msgid "MWAN - Members"
-msgstr ""
+msgstr "MWAN - メンバー"
 
 msgid "MWAN - Notification"
-msgstr ""
+msgstr "MWAN - 通知"
 
 msgid "MWAN - Policies"
-msgstr ""
+msgstr "MWAN - ポリシー"
 
 msgid "MWAN - Rules"
-msgstr ""
+msgstr "MWAN - ルール"
 
 msgid "MWAN Interface Configuration - %s"
 msgstr "MWAN インターフェース設定 - %s"
 
 msgid "MWAN Interfaces"
-msgstr ""
+msgstr "MWAN インターフェース"
 
 msgid "MWAN Member Configuration - %s"
 msgstr "MWAN メンバー設定 - %s"
@@ -190,13 +195,13 @@ msgid "MWAN Rule Configuration - %s"
 msgstr "MWAN ルール設定 - %s"
 
 msgid "MWAN Status - Detail"
-msgstr ""
+msgstr "MWAN ステータス - 詳細"
 
 msgid "MWAN Status - Diagnostics"
-msgstr ""
+msgstr "MWAN ステータス - 診断"
 
 msgid "MWAN Status - Troubleshooting"
-msgstr ""
+msgstr "MWAN ステータス - トラブルシューティング"
 
 msgid ""
 "MWAN supports up to 252 physical and/or logical interfaces<br />MWAN "
@@ -214,6 +219,12 @@ msgstr ""
 "スは使用できません。<br />インターフェースには、設定済みのメンバーやポリ"
 "シー、ルールと同じ名前を使用することはできません。"
 
+msgid "Max packet latency [ms]"
+msgstr "最大パケットレイテンシ [ms]"
+
+msgid "Max packet loss [%]"
+msgstr "最大パケットロス [%]"
+
 msgid ""
 "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
 "as a portrange (eg \"1024:2048\") without quotes"
@@ -246,6 +257,12 @@ msgstr "アサイン済みメンバー"
 msgid "Metric"
 msgstr "メトリック"
 
+msgid "Min packet latency [ms]"
+msgstr "最小パケットレイテンシ [ms]"
+
+msgid "Min packet loss [%]"
+msgstr "最小パケットロス [%]"
+
 msgid ""
 "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
 "youtube.com/youtube\")"
@@ -260,7 +277,7 @@ msgid "No MWAN interfaces found"
 msgstr "MWAN インターフェースが見つかりません"
 
 msgid "Notification"
-msgstr ""
+msgstr "通知"
 
 msgid "Offline"
 msgstr "オフライン"
@@ -342,6 +359,16 @@ msgid ""
 "z, 0-9, _ and no spaces<br />Rules may not share the same name as configured "
 "interfaces, members or policies"
 msgstr ""
+"ルールは、どのトラフィックが特定の MWAN ポリシーを使用するかを指定します<br /"
+">ルールは IP アドレスやポート、プロトコルに基づいています<br />ルールは上から"
+"下へマッチングが行われます<br />合致したルールより下のルールは無視されます"
+"<br />いずれのルールにもマッチしないトラフィックは、メインのルーティングテー"
+"ブルを使用してルーティングされます<br />既知(デフォルト以外)のネットワーク"
+"へのトラフィックは、メインのルーティングテーブルによって制御されます<br />ト"
+"ラフィックがルールに合致しても、全 WAN インターフェースが down の場合は "
+"blackhole 状態となります<br />名前は A-Z, a-z, 0-9, _ を含むことができます"
+"が、スペースは使用できません<br />ルールは、設定済みのインターフェースやメン"
+"バー、ポリシーと同じ名前を使用することはできません。"
 
 msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"
 msgstr "秒。利用可能な値: 1-1000000。空欄の場合のデフォルト値は600です。"
@@ -362,7 +389,7 @@ msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"
 msgstr "CIDR 表記のサポート(例: \"192.168.100.0/24\")"
 
 msgid "Task"
-msgstr ""
+msgstr "タスク"
 
 msgid "There are currently %d of %d supported interfaces configured"
 msgstr "現在、%d 個中 %d 個のサポートされたインターフェースが設定済みです。"
@@ -397,6 +424,21 @@ msgid ""
 "Physical device name which interface went up or down (e.g. \"eth0\" or "
 "\"wwan0\")<br /><br />"
 msgstr ""
+"このセクションでは、 \"/etc/mwan3.user\" の内容を変更することができます。"
+"<br />このファイルも sysupgrade の際に保持されます。<br /><br />注意: <br />"
+"このファイルはシェルスクリプトとして解釈されます。<br />最初の行は &#34;#!/"
+"bin/sh&#34; である必要があります(クォーテーション不要)。<br /># で始まる行"
+"はコメントであり、実行されません。<br />mwan3 のカスタム動作をここに入力して"
+"ください。<br />これらは、mwan3 で有効なインターフェースの<br /> netifd "
+"hotplug インターフェース イベント毎に実行されます。<br /><br />このスクリプト"
+"に受け渡される主に3つの環境変数が利用できます。<br /><br />$ACTION<br />* "
+"\"ifup\" は netifd と mwan3track により呼び出されます<br />* \"ifdown\" は "
+"netifd と mwan3track により呼び出されます<br />* \"connected\" はトラッキング"
+"が成功した際に mwan3track にのみにより呼び出されます<br />* \"disconnected\" "
+"は トラッキングが失敗した際に mwan3track のみにより呼び出されます<br />"
+"$INTERFACE up または down したインターフェース名(例: \"wan\" や \"wwan\")"
+"<br />$DEVICE up または down したインターフェースの物理デバイス名(例: "
+"\"eth0\" や \"wwan0\")<br /><br />"
 
 msgid "Tracking hostname or IP address"
 msgstr "追跡ホスト名または IP アドレス"
@@ -426,36 +468,42 @@ msgstr ""
 "インターフェースの IP アドレスが使用されます。"
 
 msgid "View the content of /etc/protocols for protocol description"
-msgstr ""
+msgstr "プロトコルの説明については、 /etc/protocols の内容を確認してください"
 
 msgid "WARNING: %d interfaces are configured exceeding the maximum of %d!"
 msgstr ""
 "警告: %d 個のインターフェースが、最大個数の %d 個 を超えて設定されています!"
 
 msgid "WARNING: Interface %s are not found in /etc/config/network"
-msgstr ""
+msgstr "警告: インターフェース %s が /etc/config/network に見つかりません"
 
 msgid "WARNING: Interface %s has a duplicate metric %s configured"
-msgstr ""
+msgstr "警告: インターフェース %s に重複するメトリック %s が設定されています"
 
 msgid ""
 "WARNING: Interface %s has a higher reliability requirement than tracking "
 "hosts (%d)"
 msgstr ""
+"警告: インターフェース %s は追跡ホスト数 (%d) よりも高い追跡信頼性の値が設定"
+"されています"
 
 msgid "WARNING: Interface %s has no default route in the main routing table"
 msgstr ""
+"警告: インターフェース %s はメインのルーティング テーブル内でデフォルトルート"
+"がありません"
 
 msgid "WARNING: Policy %s has exceeding the maximum name of 15 characters"
-msgstr ""
+msgstr "警告: ポリシー %s の名前は15文字の最大文字数を超えています"
 
 msgid ""
 "WARNING: Rule %s have a port configured with no or improper protocol "
 "specified!"
 msgstr ""
+"警告: ルール %s はプロトコル指定が不適切、または無いポートが設定されていま"
+"す!"
 
 msgid "Waiting for command to complete..."
-msgstr ""
+msgstr "コマンドを実行中です..."
 
 msgid "Weight"
 msgstr "ウエイト"
@@ -489,289 +537,3 @@ msgstr "never"
 
 msgid "unreachable (reject)"
 msgstr "unreachable (reject)"
-
-#~ msgid "Online (tracking active)"
-#~ msgstr "オンライン(追跡実行中)"
-
-#~ msgid "MWAN Interface Live Status"
-#~ msgstr "MWAN インターフェース Live ステータス"
-
-#~ msgid "Online (tracking off)"
-#~ msgstr "オンライン(追跡オフ)"
-
-#~ msgid ""
-#~ "This section allows you to modify the content of \"/etc/mwan3.user\".<br /"
-#~ ">The file is also preserved during sysupgrade.<br /><br />Notes:<br /"
-#~ ">This file is interpreted as a shell script.<br />The first line of the "
-#~ "script must be &#34;#!/bin/sh&#34; without quotes.<br />Lines beginning "
-#~ "with # are comments and are not executed.<br />Put your custom mwan3 "
-#~ "action here, they will<br />be executed with each netifd hotplug "
-#~ "interface event<br />on interfaces for which mwan3 is enabled.<br /><br /"
-#~ ">There are three main environment variables that are passed to this "
-#~ "script.<br /><br />$ACTION Either \"ifup\" or \"ifdown\"<br />$INTERFACE "
-#~ "Name of the interface which went up or down (e.g. \"wan\" or \"wwan"
-#~ "\")<br />$DEVICE Physical device name which interface went up or down (e."
-#~ "g. \"eth0\" or \"wwan0\")<br /><br />"
-#~ msgstr ""
-#~ "このセクションでは、 \"/etc/mwan3.user\" の内容を変更することができます。"
-#~ "<br />このファイルは、 sysupgrade 時に保持されます。<br /><br />注意: "
-#~ "<br />このファイルは、シェルスクリプトとして解釈されます。<br />スクリプト"
-#~ "の1行目は、&#34;#!bin/sh&#34; である必要があります(クォーテーション不"
-#~ "要)。<br /># で始まる行はコメントであり、実行されません。<br />mwan3 のカ"
-#~ "スタム動作をここに入力してください。これらは、 mwan3 が有効なインター"
-#~ "フェースの<br />netifd ホットプラグ インターフェース イベント毎に実行され"
-#~ "ます。<br /><br />主に3つの環境変数が利用可能です。<br /><br />$ACTION - "
-#~ "\"ifup\" および \"ifdown\"<br />$INTERFACE - Up または Down が行われたイン"
-#~ "ターフェース名(例: \"wan\" や \"wwan\")<br />$DEVICE - Up または Down が"
-#~ "行われた物理デバイス名(例: \"eth0\" や \"wwan0\")<br /><br />"
-
-#~ msgid "Currently Configured Interfaces"
-#~ msgstr "設定済みインターフェース"
-
-#~ msgid "Currently Configured Members"
-#~ msgstr "設定済みメンバー"
-
-#~ msgid "Currently Configured Policies"
-#~ msgstr "設定済みポリシー"
-
-#~ msgid "Detailed Status"
-#~ msgstr "詳細ステータス"
-
-#~ msgid "Diagnostic Results"
-#~ msgstr "診断結果"
-
-#~ msgid "Error collecting troubleshooting information"
-#~ msgstr "トラブルシューティング情報の収集エラー"
-
-#~ msgid "Errors"
-#~ msgstr "エラー"
-
-#~ msgid "Globals mwan3 options"
-#~ msgstr "MWAN3 全般オプション"
-
-#~ msgid "Interface Status"
-#~ msgstr "インターフェース ステータス"
-
-#~ msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :"
-#~ msgstr "直近の MWAN システムログ(50行)です。一番上が最新の行です:"
-
-#~ msgid "MWAN Detailed Status"
-#~ msgstr "MWAN 詳細ステータス"
-
-#~ msgid "MWAN Interface Configuration"
-#~ msgstr "MWAN インターフェース設定"
-
-#~ msgid "MWAN Interface Diagnostics"
-#~ msgstr "MWAN インターフェース診断"
-
-#~ msgid "MWAN Interface Systemlog"
-#~ msgstr "MWAN インターフェース システムログ"
-
-#~ msgid "MWAN Member Configuration"
-#~ msgstr "MWAN メンバー設定"
-
-#~ msgid "MWAN Policy Configuration"
-#~ msgstr "MWAN ポリシー設定"
-
-#~ msgid "MWAN Rule Configuration"
-#~ msgstr "MWAN ルール設定"
-
-#~ msgid "MWAN Service Control"
-#~ msgstr "MWAN サービス コントロール"
-
-#~ msgid "No MWAN systemlog history found"
-#~ msgstr "MWAN システムログの履歴が見つかりません"
-
-#~ msgid "No detailed status information available"
-#~ msgstr "詳細ステータス情報は利用できません"
-
-#~ msgid "No diagnostic results returned"
-#~ msgstr "診断結果がありません"
-
-#~ msgid "No protocol specified"
-#~ msgstr "プロトコルが設定されていません"
-
-#~ msgid "Restart MWAN"
-#~ msgstr "MWAN の再起動"
-
-#~ msgid ""
-#~ "Rules specify which traffic will use a particular MWAN policy based on IP "
-#~ "address, port or protocol<br />Rules are matched from top to bottom. "
-#~ "Rules below a matching rule are ignored. Traffic not matching any rule is "
-#~ "routed using the main routing table<br />Traffic destined for known "
-#~ "(other than default) networks is handled by the main routing table. "
-#~ "Traffic matching a rule, but all WAN interfaces for that policy are down "
-#~ "will be blackholed<br />Names may contain characters A-Z, a-z, 0-9, _ and "
-#~ "no spaces<br />Rules may not share the same name as configured "
-#~ "interfaces, members or policies"
-#~ msgstr ""
-#~ "ルールは IP アドレスやポート、プロトコルを基に、トラフィックがどの MWAN ポ"
-#~ "リシーを使用するかを設定します。<br />ルールは上から下へマッチングが行わ"
-#~ "れ、合致したルールより下のルールは無視されます。全てのルールに合致しないト"
-#~ "ラフィックは、メインのルーティング テーブルを使用してルートが決定されま"
-#~ "す。<br />既知(デフォルト以外)のネットワークへのトラフィックは、メインの"
-#~ "ルーティング テーブルによって制御されます。ルールに合致したトラフィックで"
-#~ "も、当該ポリシーの全 WAN インターフェースが Down 状態の場合は blackhole 状"
-#~ "態となります。<br />名前は A-Z, a-z, 0-9, _ を含むことができますが、スペー"
-#~ "スは使用できません。<br />ルールは、設定済みのインターフェースやメンバー、"
-#~ "ポリシーと同じ名前を使用することはできません。"
-
-#~ msgid "Start MWAN"
-#~ msgstr "MWAN の起動"
-
-#~ msgid "Stop MWAN"
-#~ msgstr "MWAN の停止"
-
-#~ msgid "Tracking IP"
-#~ msgstr "追跡 IP"
-
-#~ msgid "Traffic Rules"
-#~ msgstr "トラフィック ルール"
-
-#~ msgid "Troubleshooting Data"
-#~ msgstr "トラブルシューティング データ"
-
-#~ msgid "View the contents of /etc/protocols for protocol descriptions"
-#~ msgstr ""
-#~ "プロトコルの説明については、 /etc/protocols の内容を確認してください。"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces are configured incorrectly or not at all in /etc/"
-#~ "config/network!"
-#~ msgstr ""
-#~ "警告: 設定を誤っているか、もしくは完全に設定されていないインターフェースが"
-#~ "あります!"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have a higher reliability requirement than there "
-#~ "are tracking IP addresses!"
-#~ msgstr ""
-#~ "警告: 追跡 IP アドレスの個数より大きい追跡信頼性の値が設定されたインター"
-#~ "フェースがあります!"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have duplicate metrics configured in /etc/config/"
-#~ "network!"
-#~ msgstr ""
-#~ "警告: /etc/config/network で、重複するメトリックを設定されているインター"
-#~ "フェースがあります!"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have no default route in the main routing table!"
-#~ msgstr ""
-#~ "警告: メインのルーティング テーブルで、デフォルト ルートを設定されていない"
-#~ "インターフェースがあります!"
-
-#~ msgid ""
-#~ "WARNING: Some interfaces have no metric configured in /etc/config/network!"
-#~ msgstr ""
-#~ "警告: /etc/config/network で、メトリックを設定されていないインターフェース"
-#~ "があります!"
-
-#~ msgid ""
-#~ "WARNING: Some policies have names exceeding the maximum of 15 characters!"
-#~ msgstr ""
-#~ "警告: 最大文字数の 15 文字を超える名前が設定されているポリシーがあります!"
-
-#~ msgid ""
-#~ "WARNING: Some rules have a port configured with no or improper protocol "
-#~ "specified! Please configure a specific protocol!"
-#~ msgstr ""
-#~ "警告: 不適切なプロトコルが指定されている、または何も指定されていないポート"
-#~ "を設定されたルールがあります!プロトコルを指定し直してください!"
-
-#~ msgid ""
-#~ "WARNING: This and other interfaces have duplicate metrics configured in /"
-#~ "etc/config/network!"
-#~ msgstr ""
-#~ "警告: これと他のインターフェースで重複するメトリックが /etc/config/"
-#~ "network に設定されています!"
-
-#~ msgid ""
-#~ "WARNING: This interface has a higher reliability requirement than there "
-#~ "are tracking IP addresses!"
-#~ msgstr ""
-#~ "警告: このインターフェースは、追跡 IP アドレスの個数より大きい追跡信頼性の"
-#~ "値を設定されています!"
-
-#~ msgid ""
-#~ "WARNING: This interface has no default route in the main routing table!"
-#~ msgstr ""
-#~ "警告: このインターフェースは、メインのルーティング テーブルにデフォルト "
-#~ "ルートが設定されていません!"
-
-#~ msgid ""
-#~ "WARNING: This interface has no metric configured in /etc/config/network!"
-#~ msgstr ""
-#~ "警告: このインターフェースは、 /etc/config/network でメトリックが設定され"
-#~ "ていません!"
-
-#~ msgid ""
-#~ "WARNING: This interface is configured incorrectly or not at all in /etc/"
-#~ "config/network!"
-#~ msgstr ""
-#~ "警告: このインターフェースは /etc/config/network で設定が誤っているか、も"
-#~ "しくは完全に設定されていません!"
-
-#~ msgid ""
-#~ "WARNING: This policy's name is %d characters exceeding the maximum of 15!"
-#~ msgstr ""
-#~ "警告: このポリシーの名前は、最大文字数 15 文字を超える %d 文字が設定されて"
-#~ "います!"
-
-#~ msgid ""
-#~ "WARNING: This rule is incorrectly configured with no or improper protocol "
-#~ "specified! Please configure a specific protocol!"
-#~ msgstr ""
-#~ "警告: このルールは不適切なプロトコルが指定されているか、または何も指定され"
-#~ "ていません!プロトコルを指定し直してください!"
-
-#~ msgid "Waiting for MWAN to %s..."
-#~ msgstr "MWAN の %s を待っています..."
-
-#~ msgid "Waiting for diagnostic results..."
-#~ msgstr "診断結果を待っています..."
-
-#~ msgid "restart"
-#~ msgstr "再起動"
-
-#~ msgid "start"
-#~ msgstr "起動"
-
-#~ msgid "stop"
-#~ msgstr "停止"
-
-#~ msgid "Advanced"
-#~ msgstr "詳細設定"
-
-#~ msgid "Configuration"
-#~ msgstr "設定"
-
-#~ msgid "Hotplug Script"
-#~ msgstr "ホットプラグ スクリプト"
-
-#~ msgid "MWAN Config"
-#~ msgstr "MWAN 設定"
-
-#~ msgid "Network Config"
-#~ msgstr "ネットワーク設定"
-
-#~ msgid "Overview"
-#~ msgstr "概要"
-
-#~ msgid "This section allows you to modify the contents of /etc/config/mwan3"
-#~ msgstr ""
-#~ "このセクションでは、 /etc/config/mwan3 の内容を変更することができます。"
-
-#~ msgid ""
-#~ "This section allows you to modify the contents of /etc/config/network"
-#~ msgstr ""
-#~ "このセクションでは、 /etc/config/network の内容を変更することができます。"
-
-#~ msgid ""
-#~ "This section allows you to modify the contents of /etc/config/wireless"
-#~ msgstr ""
-#~ "このセクションでは、 /etc/config/wireless の内容を変更することができます。"
-
-#~ msgid "Wireless Config"
-#~ msgstr "無線設定"
index 11721ecc57cc96a23a0086e2c67d6c71dfef5346..140c537e7320d0b52fb8c091a89c846b5da7df52 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Допустимые значения: 1-256 По умолчанию 1,
 msgid "Check IP rules"
 msgstr "Проверить правила IP"
 
+msgid "Check link quality"
+msgstr ""
+
 msgid "Check routing table"
 msgstr "Проверить таблицу маршрутизации"
 
@@ -216,6 +219,12 @@ msgstr ""
 "символы A-Z, a-z, 0-9, _ и пробелы.<br />Интерфейсы не могут иметь "
 "одинаковые имена с настроенными узлами, политиками или правилами."
 
+msgid "Max packet latency [ms]"
+msgstr ""
+
+msgid "Max packet loss [%]"
+msgstr ""
+
 msgid ""
 "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
 "as a portrange (eg \"1024:2048\") without quotes"
@@ -247,6 +256,12 @@ msgstr "Назначенные узлы"
 msgid "Metric"
 msgstr "Метрика"
 
+msgid "Min packet latency [ms]"
+msgstr ""
+
+msgid "Min packet loss [%]"
+msgstr ""
+
 msgid ""
 "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
 "youtube.com/youtube\")"
index f6b3a1b3801dbe7da7fd75427d137b239aa8cdd6..bcc5e977a535d455fc93f3ebe6badc5f35010cf5 100644 (file)
@@ -30,6 +30,9 @@ msgstr ""
 msgid "Check IP rules"
 msgstr ""
 
+msgid "Check link quality"
+msgstr ""
+
 msgid "Check routing table"
 msgstr ""
 
@@ -190,6 +193,12 @@ msgid ""
 "rules"
 msgstr ""
 
+msgid "Max packet latency [ms]"
+msgstr ""
+
+msgid "Max packet loss [%]"
+msgstr ""
+
 msgid ""
 "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
 "as a portrange (eg \"1024:2048\") without quotes"
@@ -216,6 +225,12 @@ msgstr ""
 msgid "Metric"
 msgstr ""
 
+msgid "Min packet latency [ms]"
+msgstr ""
+
+msgid "Min packet loss [%]"
+msgstr ""
+
 msgid ""
 "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
 "youtube.com/youtube\")"
index ef593398620f1571667bc16ea6da42c4592a90e3..13773ef1e1f31c61e202c2f07c4f1b3f5d2a689a 100644 (file)
@@ -41,6 +41,9 @@ msgstr "取值范围:1-256。如果不填写,默认值为 1"
 msgid "Check IP rules"
 msgstr "检查 IP 规则"
 
+msgid "Check link quality"
+msgstr "检查连接数量"
+
 msgid "Check routing table"
 msgstr "检查路由表"
 
@@ -54,7 +57,7 @@ msgid "Destination port"
 msgstr "目标端口"
 
 msgid "Detail"
-msgstr ""
+msgstr "详细"
 
 msgid "Diagnostics"
 msgstr "诊断"
@@ -73,7 +76,7 @@ msgid "Enter value in hex, starting with <code>0x</code>"
 msgstr "输入十六进制值,以 <code>0x</code> 开头"
 
 msgid "Execute"
-msgstr ""
+msgstr "执行"
 
 msgid "Expect interface state on up event"
 msgstr "在 up 事件发生时的预期接口状态"
@@ -100,7 +103,7 @@ msgid "Hotplug ifup"
 msgstr "Hotplug ifup"
 
 msgid "INFO: MWAN not running"
-msgstr ""
+msgstr "信息:MWAN 没有运行"
 
 msgid "IPset"
 msgstr "IPset"
@@ -151,28 +154,28 @@ msgid "Local source interface"
 msgstr "本地源接口"
 
 msgid "MWAN - Globals"
-msgstr ""
+msgstr "MWAN - 全局"
 
 msgid "MWAN - Interfaces"
-msgstr ""
+msgstr "MWAN - 接口"
 
 msgid "MWAN - Members"
-msgstr ""
+msgstr "MWAN - 成员"
 
 msgid "MWAN - Notification"
-msgstr ""
+msgstr "MWAN - 通知"
 
 msgid "MWAN - Policies"
-msgstr ""
+msgstr "MWAN - 策略"
 
 msgid "MWAN - Rules"
-msgstr ""
+msgstr "MWAN - 规则"
 
 msgid "MWAN Interface Configuration - %s"
 msgstr "MWAN 接口配置 - %s"
 
 msgid "MWAN Interfaces"
-msgstr ""
+msgstr "MWAN 接口"
 
 msgid "MWAN Member Configuration - %s"
 msgstr "MWAN 成员配置 - %s"
@@ -184,13 +187,13 @@ msgid "MWAN Rule Configuration - %s"
 msgstr "MWAN 规则配置 - %s"
 
 msgid "MWAN Status - Detail"
-msgstr ""
+msgstr "MWAN Status - 详细"
 
 msgid "MWAN Status - Diagnostics"
-msgstr ""
+msgstr "MWAN Status - 诊断"
 
 msgid "MWAN Status - Troubleshooting"
-msgstr ""
+msgstr "MWAN Status - 故障排除"
 
 msgid ""
 "MWAN supports up to 252 physical and/or logical interfaces<br />MWAN "
@@ -205,6 +208,12 @@ msgstr ""
 "的接口名称匹配。<br />名称允许包括 A-Z、a-z、0-9、_ 但是不能有空格。<br />接"
 "口不应该与成员、策略、规则中的任意一个设置项使用相同的名称"
 
+msgid "Max packet latency [ms]"
+msgstr "最大数据包延迟 [ms]"
+
+msgid "Max packet loss [%]"
+msgstr "最大数据包丢失率 [%]"
+
 msgid ""
 "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
 "as a portrange (eg \"1024:2048\") without quotes"
@@ -236,6 +245,12 @@ msgstr "分配的成员"
 msgid "Metric"
 msgstr "跃点数"
 
+msgid "Min packet latency [ms]"
+msgstr "最小数据包延迟 [ms]"
+
+msgid "Min packet loss [%]"
+msgstr "最小数据包丢失率 [%]"
+
 msgid ""
 "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
 "youtube.com/youtube\")"
@@ -250,7 +265,7 @@ msgid "No MWAN interfaces found"
 msgstr "没有找到 MWAN 接口"
 
 msgid "Notification"
-msgstr ""
+msgstr "通知"
 
 msgid "Offline"
 msgstr "离线"
@@ -297,7 +312,7 @@ msgstr ""
 "“策略”把成员进行分组,告诉 MWAN 如何分配“规则”中使用这一策略的流量<br />拥有"
 "较低跃点数的成员将会被优先使用。拥有相同跃点数的成员把流量进行负载均衡。<br /"
 ">进行负载均衡的成员之间拥有较高比重的成员将会被分配到更多流量。<br />名称允许"
-"包括A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内<br />策略不应该"
+"包括 A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内<br />策略不应该"
 "与接口、成员、规则中的任意一个设置项使用相同的名称"
 
 msgid "Policy"
@@ -329,6 +344,11 @@ msgid ""
 "z, 0-9, _ and no spaces<br />Rules may not share the same name as configured "
 "interfaces, members or policies"
 msgstr ""
+"规则指定哪些流量将使用特定的 MWAN 策略<br />规则基于 IP 地址,端口或协议<br />"
+"规则从上到下匹配<br />匹配规则以下的规则被忽略<br />不符合任何规则的流量将使用主路由表进"
+"行路由<br />目的地为已知(非默认)网络的流量由主路由表处理<br />流量符合规则,但该策略的"
+"所有 WAN 接口关闭后都会被失效<br />名称可包含字符 A-Z,a-z,0-9,_和空格<br />"
+"规则不能与配置的接口、成员或策略共享相同的名称"
 
 msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"
 msgstr "单位为秒。接受的值:1-1000000。留空则使用默认值 600 秒"
@@ -349,7 +369,7 @@ msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"
 msgstr "支持 CIDR 记法(例如:\"192.168.100.0/24\")不含引号"
 
 msgid "Task"
-msgstr ""
+msgstr "任务"
 
 msgid "There are currently %d of %d supported interfaces configured"
 msgstr "当前已配置 %d 个接口,最大支持 %d 个"
@@ -380,6 +400,14 @@ msgid ""
 "Physical device name which interface went up or down (e.g. \"eth0\" or "
 "\"wwan0\")<br /><br />"
 msgstr ""
+"这里允许您修改“/etc/mwan3.user”的内容。<br />该文件在 sysupgrade 期间也会"
+"保留。<br /><br />注意:<br />该文件会作为 shell 脚本解释。<br />脚本的第"
+"一行必须是 &#34;#!/bin/sh&#34;,不带引号。<br />以 # 开头的行是注释,不会执"
+"行。<br />将您的自定义 mwan3 动作放在这里,他们将<br />在启用 mwan3 的接口"
+"上<br />在 netifd hotplug 接口事件时执行。<br /><br />有三个主要的环境变量"
+"传递给这个脚本。<br /><br />$ACTION “ifup” 或 “ifdown”<br />$INTERFACE 启动"
+"或停止的接口名(例如 “wan” 或 “wwan”)<br />$DEVICE 启动或停止接口的物理设备"
+"名(例如 “eth0” 或 “wwan0”)<br /><br />"
 
 msgid "Tracking hostname or IP address"
 msgstr "跟踪的主机或 IP 地址"
@@ -406,35 +434,37 @@ msgid ""
 msgstr "使用该接口的 IP 地址作为路由器本身发起的流量的源 IP 地址"
 
 msgid "View the content of /etc/protocols for protocol description"
-msgstr ""
+msgstr "查看协议描述的 /etc/protocols 的内容"
 
 msgid "WARNING: %d interfaces are configured exceeding the maximum of %d!"
 msgstr "警告:已配置 %d 个接口,超过最大值 %d!"
 
 msgid "WARNING: Interface %s are not found in /etc/config/network"
-msgstr ""
+msgstr "警告:接口 %s 在 /etc/config/network 中未找到"
 
 msgid "WARNING: Interface %s has a duplicate metric %s configured"
-msgstr ""
+msgstr "警告:接口 %s 的 metric %s 配置重复"
 
 msgid ""
 "WARNING: Interface %s has a higher reliability requirement than tracking "
 "hosts (%d)"
 msgstr ""
+"警告:接口 %s 比跟踪主机具有更高的可靠性要求(%d)"
 
 msgid "WARNING: Interface %s has no default route in the main routing table"
-msgstr ""
+msgstr "警告:接口 %s 在主路由表中没有默认的路由"
 
 msgid "WARNING: Policy %s has exceeding the maximum name of 15 characters"
-msgstr ""
+msgstr "警告:策略 %s 名称超过 15 个字符"
 
 msgid ""
 "WARNING: Rule %s have a port configured with no or improper protocol "
 "specified!"
 msgstr ""
+"警告:规则 %s 有一个端口配置没有指定或协议不正确!"
 
 msgid "Waiting for command to complete..."
-msgstr ""
+msgstr "正在等待命令完成..."
 
 msgid "Weight"
 msgstr "比重"
index 6af9fae7e31bba8d75a8f977dc922465a566c1aa..9fa5263428bd577849878b3bf0f3fc352473f6d8 100644 (file)
@@ -41,6 +41,9 @@ msgstr "取值範圍:1-256。如果不填寫,預設值為 1"
 msgid "Check IP rules"
 msgstr "檢查 IP 規則"
 
+msgid "Check link quality"
+msgstr ""
+
 msgid "Check routing table"
 msgstr "檢查路由表"
 
@@ -205,6 +208,12 @@ msgstr ""
 "中的介面名稱匹配。<br />名稱允許包括 A-Z、a-z、0-9、_ 但是不能有空格。<br />"
 "介面不應該與成員、策略、規則中的任意一個設定項使用相同的名稱"
 
+msgid "Max packet latency [ms]"
+msgstr ""
+
+msgid "Max packet loss [%]"
+msgstr ""
+
 msgid ""
 "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
 "as a portrange (eg \"1024:2048\") without quotes"
@@ -236,6 +245,12 @@ msgstr "分配的成員"
 msgid "Metric"
 msgstr "躍點數"
 
+msgid "Min packet latency [ms]"
+msgstr ""
+
+msgid "Min packet loss [%]"
+msgstr ""
+
 msgid ""
 "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
 "youtube.com/youtube\")"
index f2fb9312a7ccf6309d04b9d81b7e097e782ce4d2..4caf3e04e41dcbd9cc80003cf0dd87aeb29dfec1 100644 (file)
     <fieldset class="cbi-section">
         <legend><%:Recognized Clients%></legend>
         <div class="cbi-section-node">
-            <table class="cbi-section-table">
-                <tr class="cbi-section-table-titles">
-                    <th class="cbi-section-table-cell"><%:Hostname%></th>
-                    <th class="cbi-section-table-cell"><%:IPv4%></th>
-                    <th class="cbi-section-table-cell"><%:MAC%></th>
-                    <th class="cbi-section-table-cell"><%:Manufacturer%></th>
-                    <th class="cbi-section-table-cell"><%:Model%></th>
-                    <th class="cbi-section-table-cell"><%:Class%></th>
-                </tr>
+            <div class="table cbi-section-table">
+                <div class="tr cbi-section-table-titles">
+                    <div class="th cbi-section-table-cell"><%:Hostname%></div>
+                    <div class="th cbi-section-table-cell"><%:IPv4%></div>
+                    <div class="th cbi-section-table-cell"><%:MAC%></div>
+                    <div class="th cbi-section-table-cell"><%:Manufacturer%></div>
+                    <div class="th cbi-section-table-cell"><%:Model%></div>
+                    <div class="th cbi-section-table-cell"><%:Class%></div>
+                </div>
 
                 <%
                     for i,v in ipairs(devdump) do
                         if v.DeviceProfileUuid ~= "" then
                 %>
-                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                    <td class="cbi-value-field"><%=v.Hostname%></td>
-                    <td class="cbi-value-field"><%=v.Ipv4Address%></td>
-                    <td class="cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></td>
-                    <td class="cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Manufacturer%></td>
-                    <td class="cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Model%></td>
-                    <td class="cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].ThingClass%></td>
-                </tr>
+                <div class="tr cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
+                    <div class="td cbi-value-field"><%=v.Hostname%></div>
+                    <div class="td cbi-value-field"><%=v.Ipv4Address%></div>
+                    <div class="td cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></div>
+                    <div class="td cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Manufacturer%></div>
+                    <div class="td cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].Model%></div>
+                    <div class="td cbi-value-field"><%=devicevalues[v.DeviceProfileUuid].ThingClass%></div>
+                </div>
                 <%
                             style=false
                         end
                     end
                 %>
-            </table>
+            </div>
         </div>
     </fieldset>
     <br />
     <fieldset class="cbi-section">
         <legend><%:Unrecognized Clients%></legend>
         <div class="cbi-section-node">
-            <table class="cbi-section-table">
-                <tr class="cbi-section-table-titles">
-                    <th class="cbi-section-table-cell"><%:Hostname%></th>
-                    <th class="cbi-section-table-cell"><%:IPv4%></th>
-                    <th class="cbi-section-table-cell"><%:MAC%></th>
-                    <th class="cbi-section-table-cell"><%:Manufacturer%></th>
-                    <th class="cbi-section-table-cell"><%:Model%></th>
-                    <th class="cbi-section-table-cell"><%:DhcpVendor%></th>
-                    <th class="cbi-section-table-cell"><%:DhcpHostname%></th>
-                </tr>
+            <div class="table cbi-section-table">
+                <div class="tr cbi-section-table-titles">
+                    <div class="th cbi-section-table-cell"><%:Hostname%></div>
+                    <div class="th cbi-section-table-cell"><%:IPv4%></div>
+                    <div class="th cbi-section-table-cell"><%:MAC%></div>
+                    <div class="th cbi-section-table-cell"><%:Manufacturer%></div>
+                    <div class="th cbi-section-table-cell"><%:Model%></div>
+                    <div class="th cbi-section-table-cell"><%:DhcpVendor%></div>
+                    <div class="th cbi-section-table-cell"><%:DhcpHostname%></div>
+                </div>
 
                 <%
                     for i,v in ipairs(devdump) do
                         if v.DeviceProfileUuid == "" then
                 %>
-                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                    <td class="cbi-value-field"><%=v.Hostname%></td>
-                    <td class="cbi-value-field"><%=v.Ipv4Address%></td>
-                    <td class="cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></td>
-                    <td class="cbi-value-field"><%=v.SsdpManufacturer%></td>
-                    <td class="cbi-value-field"><%=v.SsdpModelName%></td>
-                    <td class="cbi-value-field"><%=v.DhcpVendor1%></td>
-                    <td class="cbi-value-field"><%=v.DhcpHostname%></td>
-                </tr>
+                <div class="tr cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
+                    <div class="td cbi-value-field"><%=v.Hostname%></div>
+                    <div class="td cbi-value-field"><%=v.Ipv4Address%></div>
+                    <div class="td cbi-value-field"><a href="/cgi-bin/clientdetails?mac=<%=v.MacAddress%>"><%=v.MacAddress%></a></div>
+                    <div class="td cbi-value-field"><%=v.SsdpManufacturer%></div>
+                    <div class="td cbi-value-field"><%=v.SsdpModelName%></div>
+                    <div class="td cbi-value-field"><%=v.DhcpVendor1%></div>
+                    <div class="td cbi-value-field"><%=v.DhcpHostname%></div>
+                </div>
                 <%
                             style=false
                         end
                     end
                 %>
-            </table>
+            </div>
         </div>
     </fieldset>
 
index 03a9ed70ee56fa981139f2e604b8bbf42a6df258..66e44e96769f1467f455f2b70fbc59f5a67d7f05 100644 (file)
@@ -5,8 +5,8 @@
                        function(x)
                        {
                                var tb = document.getElementById('ocserv_status_table');
-                               if (tb && (idx < tb.rows.length))
-                                       tb.rows[0].parentNode.removeChild(tb.rows[idx]);
+                               if (tb && (idx + 1 < tb.childNodes.length))
+                                       tb.removeChild(tb.childNodes[idx + 1]);
                        }
                );
        }
                        if (st && tb)
                        {
                                /* clear all rows */
-                               while( tb.rows.length > 1 )
-                                       tb.deleteRow(1);
+                               while (tb.firstElementChild !== tb.lastElementChild)
+                                       tb.removeChild(tb.lastElementChild);
 
-                               for( var i = 0; i < st.length; i++ )
+                               for (var i = 0; i < st.length; i++)
                                {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                       tr.insertCell(-1).innerHTML = st[i].user;
-                                       tr.insertCell(-1).innerHTML = st[i].group;
-                                       tr.insertCell(-1).innerHTML = st[i].vpn_ip;
-                                       tr.insertCell(-1).innerHTML = st[i].ip;
-                                       tr.insertCell(-1).innerHTML = st[i].device;
-                                       tr.insertCell(-1).innerHTML = st[i].time;
-                                       tr.insertCell(-1).innerHTML = st[i].cipher;
-                                       tr.insertCell(-1).innerHTML = st[i].status;
-
-                                       tr.insertCell(-1).innerHTML = String.format(
-                                               '<input class="cbi-button cbi-input-remove" type="button" value="<%:Disconnect%>" onclick="ocserv_disconnect(%d)" />',
-                                                       st[i].id
-                                       );
+                                       tb.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format((i % 2) + 1), [
+                                               E('<div class="td">', st[i].user),
+                                               E('<div class="td">', st[i].group),
+                                               E('<div class="td">', st[i].vpn_ip),
+                                               E('<div class="td">', st[i].ip),
+                                               E('<div class="td">', st[i].device),
+                                               E('<div class="td">', st[i].time),
+                                               E('<div class="td">', st[i].cipher),
+                                               E('<div class="td">', st[i].status),
+                                               E('<div class="td">',
+                                                       E('<input class="cbi-button cbi-input-remove" type="button" value="<%:Disconnect%>" onclick="ocserv_disconnect(%d)" />'
+                                                               .format(st[i].id)))
+                                       ]));
                                }
 
-                               if( tb.rows.length == 1 )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 5;
-                                               td.innerHTML = '<em><br /><%:There are no active users.%></em>';
-                               }
+                               if (tb.firstElementChild === tb.lastElementChild)
+                                       tb.appendChild(E('<div class="tr cbi-section-table-row"><div class="td"><em><br /><%:There are no active users.%></em></div></div>'));
                        }
                }
        );
 
 <fieldset class="cbi-section">
        <legend><%:Active OpenConnect Users%></legend>
-       <table class="cbi-section-table" id="ocserv_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:User%></th>
-                       <th class="cbi-section-table-cell"><%:Group%></th>
-                       <th class="cbi-section-table-cell"><%:IP Address%></th>
-                       <th class="cbi-section-table-cell"><%:VPN IP Address%></th>
-                       <th class="cbi-section-table-cell"><%:Device%></th>
-                       <th class="cbi-section-table-cell"><%:Time%></th>
-                       <th class="cbi-section-table-cell"><%:Cipher%></th>
-                       <th class="cbi-section-table-cell"><%:Status%></th>
-                       <th class="cbi-section-table-cell">&#160;</th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
+       <div class="table cbi-section-table" id="ocserv_status_table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:User%></div>
+                       <div class="th cbi-section-table-cell"><%:Group%></div>
+                       <div class="th cbi-section-table-cell"><%:IP Address%></div>
+                       <div class="th cbi-section-table-cell"><%:VPN IP Address%></div>
+                       <div class="th cbi-section-table-cell"><%:Device%></div>
+                       <div class="th cbi-section-table-cell"><%:Time%></div>
+                       <div class="th cbi-section-table-cell"><%:Cipher%></div>
+                       <div class="th cbi-section-table-cell"><%:Status%></div>
+                       <div class="th cbi-section-table-cell">&#160;</div>
+               </div>
+               <div class="tr cbi-section-table-row">
+                       <div class="td" colspan="5"><em><br /><%:Collecting data...%></em></div>
+               </div>
+       </div>
 </fieldset>
+
index 476150dd28212be17edbbd7084e7c9c5d42d75b6..150ed87dadf44ab403de454fa721e00747691df7 100644 (file)
@@ -132,11 +132,11 @@ end
                                {
                                var service = info[idx];
                                s += String.format(
-                                       '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
-                                               '<td class="cbi-section-table-titles"><a href="%s">%s</a></td>' +
-                                               '<td class="cbi-section-table-titles">%s</td>' +
-                                               '<td class="cbi-section-table-titles"><a href="http://%s/cgi-bin-status.html">%s</a></td>' +
-                                       '</tr>',
+                                       '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
+                                               '<div class="td cbi-section-table-titles"><a href="%s">%s</a></div>' +
+                                               '<div class="td cbi-section-table-titles">%s</div>' +
+                                               '<div class="td cbi-section-table-titles"><a href="http://%s/cgi-bin-status.html">%s</a></div>' +
+                                       '</div>',
                                        service.url, service.descr, service.proto, service.origin_link, service.origin || '?'
                                        );
                                }
@@ -153,16 +153,16 @@ end
 
        <fieldset class="cbi-section">
        <legend><%:Internal services%></legend>
-       <table class="cbi-section-table">
-               <thead>
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell"><%:Url%></th>
-                               <th class="cbi-section-table-cell"><%:Protocol%></th>
-                               <th class="cbi-section-table-cell"><%:Source%></th>
-                       </tr>
-               </thead>
-
-               <tbody id="olsr_services">
+       <div class="table cbi-section-table">
+               <div class="thead">
+                       <div class="tr cbi-section-table-titles">
+                               <div class="th cbi-section-table-cell"><%:Url%></div>
+                               <div class="th cbi-section-table-cell"><%:Protocol%></div>
+                               <div class="th cbi-section-table-cell"><%:Source%></div>
+                       </div>
+               </div>
+
+               <div class="tbody" id="olsr_services">
        <%
                for k, line in ipairs(services) do
                        local field = {}
@@ -178,15 +178,15 @@ end
                        local url, proto, descr, origin = pcdata(field[1]), pcdata(field[2]), utl.trim(pcdata(field[3])), pcdata(field[4])
                        %>
 
-                       <tr class="cbi-section-table-row cbi-rowstyle-<%=i%>">
-                               <td class="cbi-section-table-titles"><a href="<%=url%>"><%=descr%></a></td>
-                               <td class="cbi-section-table-titles"><%=proto%></td>
-                               <td class="cbi-section-table-titles"><a href="http://<%=origin_link%>/cgi-bin-status.html"><%=origin%></a></td>
-                       </tr>
+                       <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%>">
+                               <div class="td cbi-section-table-titles"><a href="<%=url%>"><%=descr%></a></div>
+                               <div class="td cbi-section-table-titles"><%=proto%></div>
+                               <div class="td cbi-section-table-titles"><a href="http://<%=origin_link%>/cgi-bin-status.html"><%=origin%></a></div>
+                       </div>
                        <% i = ((i % 2) + 1)
                end %>
-               </tbody>
-       </table>
+               </div>
+       </div>
        <br />
        <%=last_update%>
        </fieldset>
index 5ea7b74e4d30d516389df16b5df308115e09694f..2dc4ce1730b1a851d0ced91aecc0664929f6c439 100644 (file)
@@ -41,7 +41,7 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
                {
                        var hna = info[idx];
                        var linkgw = ''
-                       s += '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + hna.proto + '">'
+                       s += '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + hna.proto + '">'
                        if (hna.proto == '6') {
                                linkgw = '<a href="http://[' + hna.gateway + ']/cgi-bin-status.html">' + hna.gateway + '</a>'
                        } else {
@@ -61,11 +61,11 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
                        }
 
                        s += String.format(
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>', hna.destination + '/' + hna.genmask, linkgw + hostname, validity
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>', hna.destination + '/' + hna.genmask, linkgw + hostname, validity
                                 )
-                       s += '</tr>'
+                       s += '</div>'
                }
                hnadiv.innerHTML = s;
        }
@@ -79,21 +79,21 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
 <fieldset class="cbi-section">
 
        <legend><%:Overview of currently active OLSR host net announcements%></legend>
-       <table class="cbi-section-table">
-               <thead>
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Announced network%></th>
-                       <th class="cbi-section-table-cell"><%:OLSR gateway%></th>
-                       <th class="cbi-section-table-cell"><%:Validity Time%></th>
-               </tr>
+       <div class="table cbi-section-table">
+               <div class="thead">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:Announced network%></div>
+                       <div class="th cbi-section-table-cell"><%:OLSR gateway%></div>
+                       <div class="th cbi-section-table-cell"><%:Validity Time%></div>
+               </div>
 
-               </thead>
-               <tbody id="olsrd_hna">
+               </div>
+               <div class="tbody" id="olsrd_hna">
                <% for k, route in ipairs(hna) do %>
 
-               <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=hna[k].proto%>">
-                       <td class="cbi-section-table-cell"><%=hna[k].destination%>/<%=hna[k].genmask%> </td>
-                       <td class="cbi-section-table-cell">
+               <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=hna[k].proto%>">
+                       <div class="td cbi-section-table-cell"><%=hna[k].destination%>/<%=hna[k].genmask%> </div>
+                       <div class="td cbi-section-table-cell">
                                <% if hna[k].proto == '6' then %>
                                <a href="http://[<%=hna[k].gateway%>]/cgi-bin-status.html"><%=hna[k].gateway%></a>
                                <% else %>
@@ -102,20 +102,20 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
                                <% if hna[k].hostname then %>
                                 / <a href="http://<%=hna[k].hostname%>/cgi-bin-status.html"><%=hna[k].hostname%></a>
                                <% end %>
-                       </td>
+                       </div>
                        <% if hna[k].validityTime then
                                validity = hna[k].validityTime .. 's'
                        else
                                validity = '-'
                        end %>
 
-                       <td class="cbi-section-table-cell"><%=validity%></td>
-               </tr>
+                       <div class="td cbi-section-table-cell"><%=validity%></div>
+               </div>
 
                <% i = ((i % 2) + 1)
                end %>
-               </tbody>
-       </table>
+               </div>
+       </div>
 </fieldset>
 
 <%+status-olsr/common_js%>
index 81d0a3dd311204032279ce03ee1344c46f138fae..e3ccd0c23dc0a1b2038fe13d93f40d14be70570d 100644 (file)
@@ -18,31 +18,31 @@ local i = 1
 <fieldset class="cbi-section">
        <legend><%:Overview of interfaces where OLSR is running%></legend>
 
-       <table class="cbi-section-table">
-               <tr>
-                       <th class="cbi-section-table-cell"><%:Interface%></th>
-                       <th class="cbi-section-table-cell"><%:State%></th>
-                       <th class="cbi-section-table-cell"><%:MTU%></th>
-                       <th class="cbi-section-table-cell"><%:WLAN%></th>
-                       <th class="cbi-section-table-cell"><%:Source address%></th>
-                       <th class="cbi-section-table-cell"><%:Netmask%></th>
-                       <th class="cbi-section-table-cell"><%:Broadcast address%></th>
-               </tr>
+       <div class="table cbi-section-table">
+               <div class="tr">
+                       <div class="th cbi-section-table-cell"><%:Interface%></div>
+                       <div class="th cbi-section-table-cell"><%:State%></div>
+                       <div class="th cbi-section-table-cell"><%:MTU%></div>
+                       <div class="th cbi-section-table-cell"><%:WLAN%></div>
+                       <div class="th cbi-section-table-cell"><%:Source address%></div>
+                       <div class="th cbi-section-table-cell"><%:Netmask%></div>
+                       <div class="th cbi-section-table-cell"><%:Broadcast address%></div>
+               </div>
 
                <% for k, iface in ipairs(iface) do %>
 
-               <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=iface.proto%>">
-                       <td class="cbi-section-table-cell"><%=iface.name%></td>
-                       <td class="cbi-section-table-cell"><%=iface.state%></td>
-                       <td class="cbi-section-table-cell"><%=iface.olsrMTU%></td>
-                       <td class="cbi-section-table-cell"><%=iface.wireless and luci.i18n.translate('yes') or luci.i18n.translate('no')%></td>
-                       <td class="cbi-section-table-cell"><%=iface.ipv4Address or iface.ipv6Address%></td>
-                       <td class="cbi-section-table-cell"><%=iface.netmask%></td>
-                       <td class="cbi-section-table-cell"><%=iface.broadcast or iface.multicast%></td>
-               </tr>
+               <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=iface.proto%>">
+                       <div class="td cbi-section-table-cell"><%=iface.name%></div>
+                       <div class="td cbi-section-table-cell"><%=iface.state%></div>
+                       <div class="td cbi-section-table-cell"><%=iface.olsrMTU%></div>
+                       <div class="td cbi-section-table-cell"><%=iface.wireless and luci.i18n.translate('yes') or luci.i18n.translate('no')%></div>
+                       <div class="td cbi-section-table-cell"><%=iface.ipv4Address or iface.ipv6Address%></div>
+                       <div class="td cbi-section-table-cell"><%=iface.netmask%></div>
+                       <div class="td cbi-section-table-cell"><%=iface.broadcast or iface.multicast%></div>
+               </div>
                <% i = ((i % 2) + 1)
                end %>
-       </table>
+       </div>
 </fieldset>
 <%+status-olsr/common_js%>
 <%+footer%>
index f658288fc13fc6e0003e10902852ac6c38b9bebb..8c9f63af0b012f89657e47f65c6664a35c2a3724 100644 (file)
@@ -15,11 +15,11 @@ local i = 1
 <div id="togglebuttons"></div> 
 <fieldset class="cbi-section">
        <legend><%:Overview of known multiple interface announcements%></legend>
-       <table class="cbi-section-table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:OLSR node%></th>
-                       <th class="cbi-section-table-cell" ><%:Secondary OLSR interfaces%></th>
-               </tr>
+       <div class="table cbi-section-table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:OLSR node%></div>
+                       <div class="th cbi-section-table-cell" ><%:Secondary OLSR interfaces%></div>
+               </div>
 
                <% for k, mid in ipairs(mids) do 
                        local aliases = ''
@@ -37,14 +37,14 @@ local i = 1
                        end
                %>
 
-               <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=mid.proto%>">
-                       <td class="cbi-section-table-cell"><a href="http://<%=host%>/cgi-bin-status.html"><%=mid.ipAddress%></a></td>
-                       <td class="cbi-section-table-cell"><%=aliases%></td>
-               </tr>
+               <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=mid.proto%>">
+                       <div class="td cbi-section-table-cell"><a href="http://<%=host%>/cgi-bin-status.html"><%=mid.ipAddress%></a></div>
+                       <div class="td cbi-section-table-cell"><%=aliases%></div>
+               </div>
 
                <% i = ((i % 2) + 1)
                end %>
-       </table>
+       </div>
 </fieldset>
 <%+status-olsr/common_js%>
 <%+footer%>
index c077c2048620cdb8b8e8918191f986603c556140..ab09865865758f8dc37ee376af3a55f9700eeecc 100644 (file)
@@ -64,36 +64,36 @@ end
 
                                        if (neigh.proto == '6') {
                                                s += String.format(
-                                                       '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
-                                                       '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://[%s]/cgi-bin-status.html">%s</a></td>',
+                                                       '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
+                                                       '<div class="td cbi-section-table-titles" style="background-color:%s"><a href="http://[%s]/cgi-bin-status.html">%s</a></div>',
                                                        neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip
                                                );
                                        } else {
                                                s += String.format(
-                                                       '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
-                                                       '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>',
+                                                       '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
+                                                       '<div class="td cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></div>',
                                                        neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip
                                                );
                                        }
                                        if (neigh.hn) {
                                                s += String.format(
-                                                       '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>',
+                                                       '<div class="td cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></div>',
                                                        neigh.dfgcolor, neigh.hn, neigh.hn
                                                );
                                        } else {
                                                s += String.format(
-                                                       '<td class="cbi-section-table-titles" style="background-color:%s">?</td>',
+                                                       '<div class="td cbi-section-table-titles" style="background-color:%s">?</div>',
                                                        neigh.dfgcolor
                                                );
                                        }
                                        s += String.format(
-                                               '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
-                                               '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
-                                               '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
-                                               '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
-                                               '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' +
-                                               '<td class="cbi-section-table-titles" style="background-color:%s" title="Signal: %s Noise: %s">%s</td>' +
-                                               '</tr>',
+                                               '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+                                               '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+                                               '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+                                               '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+                                               '<div class="td cbi-section-table-titles" style="background-color:%s">%s</div>' +
+                                               '<div class="td cbi-section-table-titles" style="background-color:%s" title="Signal: %s Noise: %s">%s</div>' +
+                                               '</div>',
                                                neigh.dfgcolor, neigh.ifn, neigh.dfgcolor, neigh.lip, neigh.dfgcolor, neigh.lq, neigh.dfgcolor, neigh.nlq, neigh.color, neigh.cost, neigh.snr_color, neigh.signal, neigh.noise, neigh.snr || '?'
                                        );
                                }
@@ -112,21 +112,21 @@ end
 <fieldset class="cbi-section">
        <legend><%:Overview of currently established OLSR connections%></legend>
 
-       <table class="cbi-section-table">
-               <thead>
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell"><%:Neighbour IP%></th>
-                               <th class="cbi-section-table-cell"><%:Hostname%></th>
-                               <th class="cbi-section-table-cell"><%:Interface%></th>
-                               <th class="cbi-section-table-cell"><%:Local interface IP%></th>
-                               <th class="cbi-section-table-cell">LQ</th>
-                               <th class="cbi-section-table-cell">NLQ</th>
-                               <th class="cbi-section-table-cell">ETX</th>
-                               <th class="cbi-section-table-cell">SNR</th>
-                       </tr>
-               </thead>
+       <div class="table cbi-section-table">
+               <div class="thead">
+                       <div class="tr cbi-section-table-titles">
+                               <div class="th cbi-section-table-cell"><%:Neighbour IP%></div>
+                               <div class="th cbi-section-table-cell"><%:Hostname%></div>
+                               <div class="th cbi-section-table-cell"><%:Interface%></div>
+                               <div class="th cbi-section-table-cell"><%:Local interface IP%></div>
+                               <div class="th cbi-section-table-cell">LQ</div>
+                               <div class="th cbi-section-table-cell">NLQ</div>
+                               <div class="th cbi-section-table-cell">ETX</div>
+                               <div class="th cbi-section-table-cell">SNR</div>
+                       </div>
+               </div>
        
-               <tbody id="olsr_neigh_table">
+               <div class="tbody" id="olsr_neigh_table">
                <%      local i = 1
                        for k, link in ipairs(links) do
                        link.linkCost = tonumber(link.linkCost) or 0
@@ -147,25 +147,25 @@ end
                        end
                %>
 
-               <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=link.proto%>">
+               <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=link.proto%>">
                        <% if link.proto == "6" then %>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://[<%=link.remoteIP%>]/cgi-bin-status.html"><%=link.remoteIP%></a></td>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://[<%=link.remoteIP%>]/cgi-bin-status.html"><%=link.remoteIP%></a></div>
                        <% else %>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.remoteIP%>/cgi-bin-status.html"><%=link.remoteIP%></a></td>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.remoteIP%>/cgi-bin-status.html"><%=link.remoteIP%></a></div>
                        <% end %>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.hostname%>/cgi-bin-status.html"><%=link.hostname%></a></td>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.interface%></td>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.localIP%></td>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.linkQuality)%></td>
-                       <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.neighborLinkQuality)%></td>
-                       <td class="cbi-section-table-titles" style="background-color:<%=color%>"><%=string.format("%.3f", link.linkCost)%></td>
-                       <td class="cbi-section-table-titles" style="background-color:<%=snr_color%>" title="Signal: <%=link.signal%> Noise: <%=link.noise%>"><%=link.snr%></td>
-               </tr>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.hostname%>/cgi-bin-status.html"><%=link.hostname%></a></div>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.interface%></div>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.localIP%></div>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.linkQuality)%></div>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.neighborLinkQuality)%></div>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=color%>"><%=string.format("%.3f", link.linkCost)%></div>
+                       <div class="td cbi-section-table-titles" style="background-color:<%=snr_color%>" title="Signal: <%=link.signal%> Noise: <%=link.noise%>"><%=link.snr%></div>
+               </div>
                <% 
                        i = ((i % 2) + 1)
                end %>
-               </tbody>
-       </table>
+               </div>
+       </div>
 <br />
 
 <%+status-olsr/legend%>
index 61e17b3b2df61b2c940505659f271f28b42daebb..832a27aed75d50cec447d27e1248f6cb85dbe6e2 100644 (file)
@@ -160,48 +160,48 @@ XHR.poll(10, '<%=REQUEST_URI%>/json', { },
 <fieldset class="cbi-section">
         <legend><%:Network%></legend>
 
-        <table width="100%" cellspacing="10">
-                <tr><td width="33%"><%:Interfaces%></td><td>
+        <div class="table" width="100%" cellspacing="10">
+                <div class="tr"><div class="td" width="33%"><%:Interfaces%></div><div class="td">
                        <a href="<%=REQUEST_URI%>/interfaces">
                                <span id="nr_ifaces">-<span>
                        </a>
-               </td></tr>
-                <tr><td width="33%"><%:Neighbors%></td><td>
+               </div></div>
+                <div class="tr"><div class="td" width="33%"><%:Neighbors%></div><div class="td">
                        <a href="<%=REQUEST_URI%>/neighbors">
                                <span id="nr_neigh">-</span>
                        </a>
-               </td></tr>
-                <tr><td width="33%"><%:Nodes%></td><td>
+               </div></div>
+                <div class="tr"><div class="td" width="33%"><%:Nodes%></div><div class="td">
                        <a href="<%=REQUEST_URI%>/topology">
                                <span id="nr_nodes">-</span>
                        </a>
-               </td></tr>
-                <tr><td width="33%"><%:HNA%></td><td>
+               </div></div>
+                <div class="tr"><div class="td" width="33%"><%:HNA%></div><div class="td">
                        <a href="<%=REQUEST_URI%>/hna">
                                <span id="nr_hna">-</span>
                        </a>
-               </td></tr>
-                <tr><td width="33%"><%:Links total%></td><td>
+               </div></div>
+                <div class="tr"><div class="td" width="33%"><%:Links total%></div><div class="td">
                        <a href="<%=REQUEST_URI%>/topology">
                                <span id="nr_topo">-</span>
                        </a>
-               </td></tr>
-                <tr><td width="33%"><%:Links per node (average)%></td><td>
+               </div></div>
+                <div class="tr"><div class="td" width="33%"><%:Links per node (average)%></div><div class="td">
                        <span id="meshfactor">-</span>
-               </td></tr>
+               </div></div>
 
 
-        </table>
+        </div>
 </fieldset>
 
 
 <fieldset class="cbi-section">
         <legend>OLSR <%:Configuration%></legend>
-        <table width="100%" cellspacing="10">
-                <tr><td width="33%"><%:Version%></td><td>
+        <div class="table" width="100%" cellspacing="10">
+                <div class="tr"><div class="td" width="33%"><%:Version%></div><div class="td">
                        <span id="version">-<span>
-               </td></tr>
-                <tr><td width="33%"><%:Download Config%></td><td>
+               </div></div>
+                <div class="tr"><div class="td" width="33%"><%:Download Config%></div><div class="td">
                        <% if has_ipv4_conf then %>
                            <a href="<%=REQUEST_URI%>?openwrt_v4">OpenWrt (IPv4)</a>,
                        <% end %>
@@ -214,8 +214,8 @@ XHR.poll(10, '<%=REQUEST_URI%>/json', { },
                        <% if has_ipv6_conf then %>
                            <a href="<%=REQUEST_URI%>?conf_v6">OLSRD (IPv6)</a>
                        <% end %>
-               </td></tr>
-       </table>
+               </div></div>
+       </div>
 </fieldset>
 
 <%+footer%>
index 8e46daa02251041a6c9bee4c623cc7eafc48577e..c75b94fceffed0251317dc96b5f326b858b197da 100644 (file)
@@ -50,9 +50,9 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
                                        var route = info[idx];
 
                                        s += String.format(
-                                               '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
-                                                       '<td class="cbi-section-table-cell">%s/%s</td>' +
-                                                       '<td class="cbi-section-table-cell">' +
+                                               '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' +
+                                                       '<div class="td cbi-section-table-cell">%s/%s</div>' +
+                                                       '<div class="td cbi-section-table-cell">' +
                                                                '<a href="http://%s/cgi-bin-status.html">%s</a>',
                                                                route.proto, route.dest, route.genmask, route.gw, route.gw
                                                )
@@ -72,11 +72,11 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
 
                                        }
                                        s += String.format(
-                                                       '</td>' +
-                                                       '<td class="cbi-section-table-cell">%s</td>' +
-                                                       '<td class="cbi-section-table-cell">%s</td>' +
-                                                       '<td class="cbi-section-table-cell" style="background-color:%s">%s</td>' +
-                                               '</tr>',
+                                                       '</div>' +
+                                                       '<div class="td cbi-section-table-cell">%s</div>' +
+                                                       '<div class="td cbi-section-table-cell">%s</div>' +
+                                                       '<div class="td cbi-section-table-cell" style="background-color:%s">%s</div>' +
+                                               '</div>',
                                                route.interface, route.metric, route.color, route.etx || '?'
                                        );
                                }
@@ -96,27 +96,27 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
 <fieldset class="cbi-section">
 <legend><%:Overview of currently known routes to other OLSR nodes%></legend>
 
-<table class="cbi-section-table">
-       <thead>
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Announced network%></th>
-                       <th class="cbi-section-table-cell"><%:OLSR gateway%></th>
-                       <th class="cbi-section-table-cell"><%:Interface%></th>
-                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                       <th class="cbi-section-table-cell">ETX</th>
-               </tr>
-       </thead>
+<div class="table cbi-section-table">
+       <div class="thead">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:Announced network%></div>
+                       <div class="th cbi-section-table-cell"><%:OLSR gateway%></div>
+                       <div class="th cbi-section-table-cell"><%:Interface%></div>
+                       <div class="th cbi-section-table-cell"><%:Metric%></div>
+                       <div class="th cbi-section-table-cell">ETX</div>
+               </div>
+       </div>
 
-       <tbody id="olsrd_routes">
+       <div class="tbody" id="olsrd_routes">
 
        <% for k, route in ipairs(routes) do
                ETX = tonumber(route.rtpMetricCost)/1024 or '0'
                color = olsrtools.etx_color(ETX)
        %>
 
-               <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
-                       <td class="cbi-section-table-cell"><%=route.destination%>/<%=route.genmask%></td>
-                       <td class="cbi-section-table-cell">
+               <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
+                       <div class="td cbi-section-table-cell"><%=route.destination%>/<%=route.genmask%></div>
+                       <div class="td cbi-section-table-cell">
                                <% if route.proto == '6' then %>
                                <a href="http://[<%=route.gateway%>]/cgi-bin-status.html"><%=route.gateway%></a>
                                <% else  %>
@@ -125,16 +125,16 @@ XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
                                <% if route.hostname then %>
                                        / <a href="http://<%=route.Hostname%>/cgi-bin-status.html"><%=route.hostname%></a>  
                                <% end %>
-                       </td>
-                       <td class="cbi-section-table-cell"><%=route.networkInterface%></td>
-                       <td class="cbi-section-table-cell"><%=route.metric%></td>
-                       <td class="cbi-section-table-cell" style="background-color:<%=color%>"><%=string.format("%.3f", ETX)%></td>
-               </tr>
+                       </div>
+                       <div class="td cbi-section-table-cell"><%=route.networkInterface%></div>
+                       <div class="td cbi-section-table-cell"><%=route.metric%></div>
+                       <div class="td cbi-section-table-cell" style="background-color:<%=color%>"><%=string.format("%.3f", ETX)%></div>
+               </div>
        <% 
                i = ((i % 2) + 1)
        end %>
-       </tbody>
-</table>
+       </div>
+</div>
 
 <%+status-olsr/legend%>
 </fieldset>
index 6aa7a7546126ce25027ec4e1a3430af58ff6de47..7ca66816ae7723743df087ebd6c2dae9a411f4b8 100644 (file)
@@ -56,7 +56,7 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
                for (var idx = 0; idx < info.length; idx++)
                {
                        var smartgw = info[idx];
-                       s += '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + smartgw.proto + '">'
+                       s += '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-' + smartgw.proto + '">'
                        if (smartgw.proto == '6') {
                                linkgw = '<a href="http://[' + smartgw.ipAddress + ']/cgi-bin-status.html">' + smartgw.ipAddress + '</a>'
                        } else {
@@ -64,18 +64,18 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
                        }
 
                        s += String.format(
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>' +
-                                '<td class="cbi-section-table-cell">%s</td>',
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>' +
+                                '<div class="td cbi-section-table-cell">%s</div>',
                                linkgw, smartgw.status, smartgw.tcPathCost, smartgw.hopCount, smartgw.uplinkSpeed, smartgw.downlinkSpeed, smartgw.v4, smartgw.v6, smartgw.externalPrefix
                                 )
-                       s += '</tr>'
+                       s += '</div>'
                }
                smartgwdiv.innerHTML = s;
        }
@@ -94,23 +94,23 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
 
        <fieldset class="cbi-section">
                <legend><%:Overview of smart gateways in this network%></legend>
-               <table class="cbi-section-table">
-                       <thead>
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell"><%:Gateway%></th>
-                               <th class="cbi-section-table-cell"><%:Status%></th>
-                               <th class="cbi-section-table-cell"><%:ETX%></th>
-                               <th class="cbi-section-table-cell"><%:Hops%></th>
-                               <th class="cbi-section-table-cell"><%:Uplink%></th>
-                               <th class="cbi-section-table-cell"><%:Downlink%></th>
-                               <th class="cbi-section-table-cell"><%:IPv4%></th>
-                               <th class="cbi-section-table-cell"><%:IPv6%></th>
-                               <th class="cbi-section-table-cell"><%:Prefix%></th>
-
-                       </tr>
-                       </thead>
-
-                       <tbody id="olsrd_smartgw">
+               <div class="table cbi-section-table">
+                       <div class="thead">
+                       <div class="tr cbi-section-table-titles">
+                               <div class="th cbi-section-table-cell"><%:Gateway%></div>
+                               <div class="th cbi-section-table-cell"><%:Status%></div>
+                               <div class="th cbi-section-table-cell"><%:ETX%></div>
+                               <div class="th cbi-section-table-cell"><%:Hops%></div>
+                               <div class="th cbi-section-table-cell"><%:Uplink%></div>
+                               <div class="th cbi-section-table-cell"><%:Downlink%></div>
+                               <div class="th cbi-section-table-cell"><%:IPv4%></div>
+                               <div class="th cbi-section-table-cell"><%:IPv6%></div>
+                               <div class="th cbi-section-table-cell"><%:Prefix%></div>
+
+                       </div>
+                       </div>
+
+                       <div class="tbody" id="olsrd_smartgw">
                        <% for k, gw in ipairs(gws) do 
 
                        gw.tcPathCost = tonumber(gw.tcPathCost)/1024 or 0
@@ -119,27 +119,27 @@ XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
                                end
                        %>
 
-                       <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=proto%>">
+                       <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=proto%>">
                                <% if gw.proto == '6' then %>
-                                       <td class="cbi-section-table-cell"><a href="http://[<%=gw.ipAddress%>]/cgi-bin-status.html"><%=gw.ipAddress%></a></td>
+                                       <div class="td cbi-section-table-cell"><a href="http://[<%=gw.ipAddress%>]/cgi-bin-status.html"><%=gw.ipAddress%></a></div>
                                <% else %>
-                                       <td class="cbi-section-table-cell"><a href="http://<%=gw.ipAddress%>/cgi-bin-status.html"><%=gw.ipAddress%></a></td>
+                                       <div class="td cbi-section-table-cell"><a href="http://<%=gw.ipAddress%>/cgi-bin-status.html"><%=gw.ipAddress%></a></div>
                                <% end %>
 
-                               <td class="cbi-section-table-cell"><%=gw.ipv4Status or gw.ipv6Status or '-' %></td>
-                               <td class="cbi-section-table-cell"><%=string.format("%.3f", gw.tcPathCost)%></td>
-                               <td class="cbi-section-table-cell"><%=gw.hopCount%></td>
-                               <td class="cbi-section-table-cell"><%=gw.uplinkSpeed%></td>
-                               <td class="cbi-section-table-cell"><%=gw.downlinkSpeed%></td>
-                               <td class="cbi-section-table-cell"><%=gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></td>
-                               <td class="cbi-section-table-cell"><%=gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></td>
-                               <td class="cbi-section-table-cell"><%=gw.externalPrefix%></td>
-                       </tr>
+                               <div class="td cbi-section-table-cell"><%=gw.ipv4Status or gw.ipv6Status or '-' %></div>
+                               <div class="td cbi-section-table-cell"><%=string.format("%.3f", gw.tcPathCost)%></div>
+                               <div class="td cbi-section-table-cell"><%=gw.hopCount%></div>
+                               <div class="td cbi-section-table-cell"><%=gw.uplinkSpeed%></div>
+                               <div class="td cbi-section-table-cell"><%=gw.downlinkSpeed%></div>
+                               <div class="td cbi-section-table-cell"><%=gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></div>
+                               <div class="td cbi-section-table-cell"><%=gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no')%></div>
+                               <div class="td cbi-section-table-cell"><%=gw.externalPrefix%></div>
+                       </div>
 
                        <% i = ((i % 2) + 1)
                        end %>
-                       </tbody>
-               </table>
+                       </div>
+               </div>
        </fieldset>
 
 <% else %>
index b3abeaecbe8923c2cab8607af34981356a650e5f..02fdfddac33be7073f2b47262513703e8ccf2d69 100644 (file)
@@ -17,14 +17,14 @@ local olsrtools = require "luci.tools.olsr"
 
 <fieldset class="cbi-section">
        <legend><%:Overview of currently known OLSR nodes%></legend>
-       <table class="cbi-section-table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:OLSR node%></th>
-                       <th class="cbi-section-table-cell"><%:Last hop%></th>
-                       <th class="cbi-section-table-cell"><%:LQ%></th>
-                       <th class="cbi-section-table-cell"><%:NLQ%></th>
-                       <th class="cbi-section-table-cell"><%:ETX%></th>
-               </tr>
+       <div class="table cbi-section-table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:OLSR node%></div>
+                       <div class="th cbi-section-table-cell"><%:Last hop%></div>
+                       <div class="th cbi-section-table-cell"><%:LQ%></div>
+                       <div class="th cbi-section-table-cell"><%:NLQ%></div>
+                       <div class="th cbi-section-table-cell"><%:ETX%></div>
+               </div>
 
                <% for k, route in ipairs(routes) do 
                        local cost = string.format("%.3f", tonumber(route.tcEdgeCost/1024) or 0)
@@ -33,28 +33,28 @@ local olsrtools = require "luci.tools.olsr"
                        local nlq = string.format("%.3f", tonumber(route.neighborLinkQuality) or 0)
                %>
 
-               <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
+               <div class="tr cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=route.proto%>">
 
                        <% if route.proto == "6" then %>
 
-                       <td class="cbi-section-table-cell"><a href="http://[<%=route.destinationIP%>]/cgi-bin-status.html"><%=route.destinationIP%></a></td>
-                       <td class="cbi-section-table-cell"><a href="http://[<%=route.lastHopIP%>]/cgi-bin-status.html"><%=route.lastHopIP%></a></td>
+                       <div class="td cbi-section-table-cell"><a href="http://[<%=route.destinationIP%>]/cgi-bin-status.html"><%=route.destinationIP%></a></div>
+                       <div class="td cbi-section-table-cell"><a href="http://[<%=route.lastHopIP%>]/cgi-bin-status.html"><%=route.lastHopIP%></a></div>
 
                        <% else %>
 
-                       <td class="cbi-section-table-cell"><a href="http://<%=route.destinationIP%>/cgi-bin-status.html"><%=route.destinationIP%></a></td>
-                       <td class="cbi-section-table-cell"><a href="http://<%=route.lastHopIP%>/cgi-bin-status.html"><%=route.lastHopIP%></a></td>
+                       <div class="td cbi-section-table-cell"><a href="http://<%=route.destinationIP%>/cgi-bin-status.html"><%=route.destinationIP%></a></div>
+                       <div class="td cbi-section-table-cell"><a href="http://<%=route.lastHopIP%>/cgi-bin-status.html"><%=route.lastHopIP%></a></div>
 
                        <%end%>
 
-                       <td class="cbi-section-table-cell"><%=lq%></td>
-                       <td class="cbi-section-table-cell"><%=nlq%></td>
-                       <td class="cbi-section-table-cell" style="background-color:<%=color%>"><%=cost%></td>
-               </tr>
+                       <div class="td cbi-section-table-cell"><%=lq%></div>
+                       <div class="td cbi-section-table-cell"><%=nlq%></div>
+                       <div class="td cbi-section-table-cell" style="background-color:<%=color%>"><%=cost%></div>
+               </div>
 
                <%      i = ((i % 2) + 1)
                end %>
-       </table>
+       </div>
 <%+status-olsr/legend%>
 </fieldset>
 
index d2b5d32c05a07dcf4137eb01a23ab70efc5bdd22..a6b0e1dd902f0c953483326dcc5a4e02a194762c 100644 (file)
@@ -56,7 +56,7 @@ function s.create(self, name)
                luci.cbi.CREATE_PREFIX .. self.config .. "." ..
                self.sectiontype .. ".text"
        )
-       if string.len(name)>3 and not name:match("[^a-zA-Z0-9_]") then
+       if #name > 3 and not name:match("[^a-zA-Z0-9_]") then
                uci:section(
                        "openvpn", "openvpn", name,
                        uci:get_all( "openvpn_recipes", recipe )
@@ -67,9 +67,11 @@ function s.create(self, name)
                uci:save("openvpn")
 
                luci.http.redirect( self.extedit:format(name) )
-       else
+       elseif #name > 0 then
                self.invalid_cts = true
        end
+
+       return 0
 end
 
 
@@ -103,10 +105,7 @@ function updown.cfgvalue(self, section)
 end
 function updown.write(self, section, value)
        if self.option == "stop" then
-               local pid = s.getPID(section)
-               if pid ~= nil then
-                       sys.process.signal(pid,15)
-               end
+               luci.sys.call("/etc/init.d/openvpn stop %s" % section)
        else
                luci.sys.call("/etc/init.d/openvpn start %s" % section)
        end
@@ -126,5 +125,8 @@ function proto.cfgvalue(self, section)
        return val or "udp"
 end
 
+function m.on_after_commit(self,map)
+       require("luci.sys").call('/etc/init.d/openvpn reload')
+end
 
 return m
index 6cf4595ceafa39a5fab4a8bb9f4b0a216389b428..aa3ae538cde3e4fbf03862bb48b4734cca012694 100644 (file)
@@ -7,7 +7,7 @@
 
 include $(TOPDIR)/rules.mk
 
-LUCI_TITLE:=Roaring Penguing PPPoE Server
+LUCI_TITLE:=Roaring Penguin PPPoE Server
 LUCI_DEPENDS:=+rp-pppoe-server
 
 include ../../luci.mk
index af1a75b6f2f760f836e621a9d8738b3202f2ce72..5fc20c52bc6931529b939c22664575abc06d0646 100644 (file)
@@ -23,7 +23,7 @@ function values_actions(o)
 end
 
 function values_redir(o, xmode)
-       o.map.uci.foreach("shadowsocks-libev", "ss_redir", function(sdata)
+       o.map.uci:foreach("shadowsocks-libev", "ss_redir", function(sdata)
                local disabled = ucival_to_bool(sdata["disabled"])
                local sname = sdata[".name"]
                local mode = sdata["mode"] or "tcp_only"
@@ -37,7 +37,7 @@ function values_redir(o, xmode)
 end
 
 function values_serverlist(o)
-       o.map.uci.foreach("shadowsocks-libev", "server", function(sdata)
+       o.map.uci:foreach("shadowsocks-libev", "server", function(sdata)
                local sname = sdata[".name"]
                local server = sdata["server"]
                local server_port = sdata["server_port"]
index 219d89b07466121754a0385c1328cd9c617cb077..f016dd47e61bdc07f2e54001c3646b89348c210c 100644 (file)
@@ -1,24 +1,17 @@
 <div class="cbi-section-create cbi-tblsection-create">
-       <br />
-       <table class="cbi-section-table">
-               <tr class="cbi-section-table-row">
-                       <td class="cbi-section-table-cell" style="width:140px">
-                               <select class="cbi-input-select" id="_newinst.type" name="_newinst.type">
-                                       <option value="_dummy">-- instance type --</option>
-                                       <option value="ss_local">ss-local</option>
-                                       <option value="ss_tunnel">ss-tunnel</option>
-                                       <option value="ss_redir">ss-redir</option>
-                                       <option value="ss_server">ss-server</option>
-                               </select>
-                       </td>
-                       <td class="cbi-section-table-cell" style="width:110px">
-                               <input type="text" class="cbi-input-text" id="_newinst.name" name="_newinst.name" placeholder="<%:Name%>"/>
-                       </td>
-                       <td class="cbi-section-table-cell left">
-                               <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>" value="<%:Add%>" />
-                       </td>
-               </tr>
-       </table>
+       <div>
+               <select class="cbi-input-select" id="_newinst.type" name="_newinst.type">
+                       <option value="_dummy">-- instance type --</option>
+                       <option value="ss_local">ss-local</option>
+                       <option value="ss_tunnel">ss-tunnel</option>
+                       <option value="ss_redir">ss-redir</option>
+                       <option value="ss_server">ss-server</option>
+               </select>
+       </div>
+       <div>
+               <input type="text" class="cbi-input-text" id="_newinst.name" name="_newinst.name" placeholder="<%:Name%>"/>
+       </div>
+       <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>" value="<%:Add%>" />
 </div>
 <script type="text/javascript">//<![CDATA[
        XHR.poll(5, '<%=url('admin/services/shadowsocks-libev/status')%>', null,
index 37f67776aadd2acd90f406ce125a4b6cf769fa69..aad330791d6bdaa9ff6f1ca212cfcb0a19abd3b0 100644 (file)
@@ -145,19 +145,19 @@ end
                        {
                                var s = '';
                                if (info.length == undefined) {
-                                       s += '<tr class="cbi-section-table-row"><td colspan="7" class="cbi-section-table-cell"><br /><em><%:No clients connected%></em><br /></td></tr>'
+                                       s += '<div class="tr cbi-section-table-row"><div colspan="7" class="td cbi-section-table-cell"><br /><em><%:No clients connected%></em><br /></div></div>'
                                };
                                for (var idx = 0; idx < info.length; idx++)
                                {
                                        var splash = info[idx];
                                        s += String.format(
-                                               '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
-                                               '<td class="cbi-section-table-cell">%s</td>' +
-                                               '<td class="cbi-section-table-cell">%s</td>' +
-                                               '<td class="cbi-section-table-cell">%s</td>' +
-                                               '<td class="cbi-section-table-cell">%s</td>' +
-                                               '<td class="cbi-section-table-cell">%s/%s</td>' +
-                                               '<td class="cbi-section-table-cell">',
+                                               '<div class="tr cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+'">' +
+                                               '<div class="td cbi-section-table-cell">%s</div>' +
+                                               '<div class="td cbi-section-table-cell">%s</div>' +
+                                               '<div class="td cbi-section-table-cell">%s</div>' +
+                                               '<div class="td cbi-section-table-cell">%s</div>' +
+                                               '<div class="td cbi-section-table-cell">%s/%s</div>' +
+                                               '<div class="td cbi-section-table-cell">',
                                                splash.hostname, splash.ip, splash.mac, splash.timeleft, splash.trafficin, splash.trafficout);
 
                                <% if is_admin then %>
@@ -185,7 +185,7 @@ end
                                <% else %>
                                        s += String.format('%s', splash.policy);
                                <% end %>
-                                       s += '</td></tr>'
+                                       s += '</div></div>'
                                }
                                tbody.innerHTML = s;
                        }
@@ -200,18 +200,18 @@ end
                <legend><%:Active Clients%></legend>
                <div class="cbi-section-node">
                        <% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><input type="hidden" name="token" value="<%=token%>" /><% end %>
-                       <table class="cbi-section-table">
-                               <thead>
-                                       <tr class="cbi-section-table-titles">
-                                               <th class="cbi-section-table-cell"><%:Hostname%></th>
-                                               <th class="cbi-section-table-cell"><%:IP Address%></th>
-                                               <th class="cbi-section-table-cell"><%:MAC Address%></th>
-                                               <th class="cbi-section-table-cell"><%:Time remaining%></th>
-                                               <th class="cbi-section-table-cell"><%:Traffic in/out%></th>
-                                               <th class="cbi-section-table-cell"><%:Policy%></th>
-                                       </tr>
-                               </thead>
-                               <tbody id="splash_table">
+                       <div class="table cbi-section-table">
+                               <div class="thead">
+                                       <div class="tr cbi-section-table-titles">
+                                               <div class="th cbi-section-table-cell"><%:Hostname%></div>
+                                               <div class="th cbi-section-table-cell"><%:IP Address%></div>
+                                               <div class="th cbi-section-table-cell"><%:MAC Address%></div>
+                                               <div class="th cbi-section-table-cell"><%:Time remaining%></div>
+                                               <div class="th cbi-section-table-cell"><%:Traffic in/out%></div>
+                                               <div class="th cbi-section-table-cell"><%:Policy%></div>
+                                       </div>
+                               </div>
+                               <div class="tbody" id="splash_table">
 
                                <%-
                                        local count = 0
@@ -227,16 +227,16 @@ end
                                                if c.ip then
                                                        count = count + 1
                                -%>
-                                               <tr class="cbi-section-table-row cbi-rowstyle-<%=2-(count%2)%>">
-                                               <td class="cbi-section-table-cell"><%=c.hostname or "<em>" .. translate("unknown") .. "</em>"%></td>
-                                               <td class="cbi-section-table-cell"><%=c.ip or "<em>" .. translate("unknown") .. "</em>"%></td>
-                                               <td class="cbi-section-table-cell"><%=showmac(c.mac)%></td>
-                                               <td class="cbi-section-table-cell"><%=
+                                               <div class="tr cbi-section-table-row cbi-rowstyle-<%=2-(count%2)%>">
+                                               <div class="td cbi-section-table-cell"><%=c.hostname or "<em>" .. translate("unknown") .. "</em>"%></div>
+                                               <div class="td cbi-section-table-cell"><%=c.ip or "<em>" .. translate("unknown") .. "</em>"%></div>
+                                               <div class="td cbi-section-table-cell"><%=showmac(c.mac)%></div>
+                                               <div class="td cbi-section-table-cell"><%=
                                                        (c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or
                                                                (c.policy ~= "normal") and "-" or "<em>" .. translate("expired") .. "</em>"
-                                               %></td>
-                                               <td class="cbi-section-table-cell"><%=wat.byte_format(c.bytes_in)%> / <%=wat.byte_format(c.bytes_out)%></td>
-                                               <td class="cbi-section-table-cell">
+                                               %></div>
+                                               <div class="td cbi-section-table-cell"><%=wat.byte_format(c.bytes_in)%> / <%=wat.byte_format(c.bytes_out)%></div>
+                                               <div class="td cbi-section-table-cell">
                                                        <% if is_admin then %>
                                                        <select name="policy.<%=c.mac:lower()%>" style="width:200px">
                                                                <option value="whitelist"<%=c.policy=="whitelist" and ' selected="selected"'%>><%:whitelisted%></option>
@@ -250,21 +250,21 @@ end
                                                        <% else %>
                                                        <%=c.policy%>
                                                        <% end %>
-                                               </td>
-                                               </tr>
+                                               </div>
+                                               </div>
                                                <%- 
                                                        end
                                                end
                                                if count == 0 then
                                                -%>
-                                               <tr class="cbi-section-table-row">
-                                                       <td colspan="7" class="cbi-section-table-cell">
+                                               <div class="tr cbi-section-table-row">
+                                                       <div colspan="7" class="td cbi-section-table-cell">
                                                                <br /><em><%:No clients connected%></em><br />
-                                                       </td>
-                                               </tr>
+                                                       </div>
+                                               </div>
                                <%- end -%>
-                               </tbody>
-                       </table>
+                               </div>
+                       </div>
                        <% if is_admin then %></form><% end %>
                </div>
        </fieldset>
index 456e8b89ace3235d3ae6fddb8f5ead8b67e33279..08dc7199749329edea3e4ca541966addd4e19fbd 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 uci -q batch <<-EOF >/dev/null
-       delete ucitrack.@tranmsmission[-1]
+       delete ucitrack.@transmission[-1]
        add ucitrack transmission
        set ucitrack.@transmission[-1].init=transmission
        commit ucitrack
index 6cbeaffde614c7b3dbf536f2364d53c626d8c8f0..c40bdeeb591042853d5f765dd8de0121f4c94d2c 100644 (file)
@@ -6,10 +6,10 @@ This is free software, licensed under the Apache License, Version 2.0
 <%+header%>
 
 <div class="cbi-map">
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for travelmate related messages only.%></div>
                <textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
-       </fieldset>
+       </div>
 </div>
 
 <script type="text/javascript">
index f76b52e9cca52b1ddbb44b0fce92e1b94d1fb53c..ffacc2f6df488e1b37c82baefab86e5bbb23c74a 100644 (file)
@@ -11,20 +11,22 @@ This is free software, licensed under the Apache License, Version 2.0
 
 <%+header%>
 
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
 <div class="cbi-map">
 <div class="cbi-map-descr">
   <%=translatef("Provides an overview of all configured uplinks for the travelmate interface (%s). You can edit, delete or re-order existing uplinks or scan for a new one. The currently used uplink is emphasized in blue.", trmiface)%>
 </div>
 
-<fieldset class="cbi-section">
-  <table class="cbi-section-table" style="empty-cells:hide">
-    <tr class="cbi-section-table-titles">
-      <th class="cbi-section-table-cell" style="text-align:left"><%:Device%></th>
-      <th class="cbi-section-table-cell" style="text-align:left"><%:SSID%></th>
-      <th class="cbi-section-table-cell" style="text-align:left"><%:BSSID%></th>
-      <th class="cbi-section-table-cell" style="text-align:left"><%:Encryption%></th>
-      <th class="cbi-section-table-cell" style="text-align:center" colspan="2"><%:Actions%></th>
-    </tr>
+<div class="cbi-section">
+  <div class="table cbi-section-table">
+    <div class="tr cbi-section-table-titles">
+      <div class="th left"><%:Device%></div>
+      <div class="th left"><%:SSID%></div>
+      <div class="th left"><%:BSSID%></div>
+      <div class="th left"><%:Encryption%></div>
+      <div class="th center">&#160;</div>
+    </div>
 <%
   uci:foreach("wireless", "wifi-iface", function(s)
     local iface = s.network or ""
@@ -40,26 +42,24 @@ This is free software, licensed under the Apache License, Version 2.0
         style = "text-align:left;color:#0069d6;font-weight:bold"
       end
 %>
-    <tr class="cbi-section-table-row cbi-rowstyle-1" style="<%=style%>">
-      <td style="<%=style%>"><%=device%></td>
-      <td style="<%=style%>"><%=ssid%></td>
-      <td style="<%=style%>"><%=bssid%></td>
-      <td style="<%=style%>"><%=encryption%></td>
-      <td class="cbi-value-field" style="width:80px">
-        <input class="cbi-button cbi-button-up" type="button" value="" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&dir=up'" alt="<%:Move up%>" title="<%:Move up%>"/>
-        <input class="cbi-button cbi-button-down" type="button" value="" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&dir=down'" alt="<%:Move down%>" title="<%:Move down%>"/>
-      </td>
-      <td class="cbi-value-field" style="width:150px">
+    <div class="tr cbi-section-table-row cbi-rowstyle-1" style="<%=style%>">
+      <div class="td" style="<%=style%>"><%=device%></div>
+      <div class="td" style="<%=style%>"><%=ssid%></div>
+      <div class="td" style="<%=style%>"><%=bssid%></div>
+      <div class="td" style="<%=style%>"><%=encryption%></div>
+      <div class="td cbi-section-actions">
+        <input class="cbi-button cbi-button-up" type="button" value="<%:Up%>" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&amp;dir=up'" alt="<%:Move up%>" title="<%:Move up%>"/>
+        <input class="cbi-button cbi-button-down" type="button" value="<%:Down%>" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiorder')%>?cfg=<%=section%>&amp;dir=down'" alt="<%:Move down%>" title="<%:Move down%>"/>
         <input type="button" class="cbi-button cbi-button-edit" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifiedit')%>?cfg=<%=section%>'" title="<%:Edit this Uplink%>" value="<%:Edit%>"/>
         <input type="button" class="cbi-button cbi-button-remove" onclick="location.href='<%=luci.dispatcher.build_url('admin/services/travelmate/wifidelete')%>?cfg=<%=section%>'" title="<%:Delete this Uplink%>" value="<%:Delete%>"/>
-      </td>
-    </tr>
+      </div>
+    </div>
 <%
     end
   end)
 %>
-  </table>
-</fieldset>
+  </div>
+</div>
 <div class="cbi-page-actions right">
 <%
   uci:foreach("wireless", "wifi-device", function(s)
@@ -68,7 +68,7 @@ This is free software, licensed under the Apache License, Version 2.0
   <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiscan')%>" method="post">
     <input type="hidden" name="device" value="<%=device%>"/>
     <input type="hidden" name="token" value="<%=token%>"/>
-    <input type="submit" class="cbi-button cbi-button-find" title="<%:Find and join network on%> <%=device%>" value="<%:Scan%> <%=device%>"/>
+    <input type="submit" class="cbi-button cbi-button-action important" title="<%:Find and join network on%> <%=device%>" value="<%:Scan%> <%=device%>"/>
   </form>
 <%
   end)
index a8f63a17e28e3a8124acee31eb219a8ae734a097..57efd97376fe68798236b085c8b1b4317fc9e597 100644 (file)
@@ -39,31 +39,33 @@ This is free software, licensed under the Apache License, Version 2.0
 
 <%+header%>
 
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
 <div class="cbi-map">
 <h2 name="content"><%:Wireless Scan%></h2>
-    <fieldset class="cbi-section">
-        <table class="cbi-section-table" style="empty-cells:hide">
-            <tr class="cbi-section-table-titles">
-                <th class="cbi-section-table-cell" style="text-align:left"><%:Uplink SSID%></th>
-                <th class="cbi-section-table-cell" style="text-align:left"><%:Uplink BSSID%></th>
-                <th class="cbi-section-table-cell" style="text-align:left"><%:Encryption%></th>
-                <th class="cbi-section-table-cell" style="text-align:left" colspan="2"><%:Signal strength%></th>
-            </tr>
+    <div class="cbi-section">
+        <div class="table cbi-section-table">
+            <div class="tr cbi-section-table-titles">
+                <div class="th left"><%:Uplink SSID%></div>
+                <div class="th left"><%:Uplink BSSID%></div>
+                <div class="th left"><%:Encryption%></div>
+                <div class="th left"><%:Signal strength%></div>
+            </div>
             <% for i, net in ipairs(iw.scanlist or { }) do %>
-            <tr class="cbi-section-table-row cbi-rowstyle-1">
-                <td class="cbi-value-field" style="text-align:left">
+            <div class="tr cbi-section-table-row cbi-rowstyle-1">
+                <div class="td left">
                     <%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%>
-                </td>
-                <td class="cbi-value-field" style="text-align:left">
+                </div>
+                <div class="td left">
                     <%=net.bssid and utl.pcdata(net.bssid)%>
-                </td>
-                <td class="cbi-value-field" style="text-align:left">
+                </div>
+                <div class="td left">
                     <%=format_wifi_encryption(net.encryption)%>
-                </td>
-                <td class="cbi-value-field" style="text-align:left">
+                </div>
+                <div class="td left">
                     <%=percent_wifi_signal(net)%> %
-                </td>
-                <td class="cbi-value-field" style="width:100px;text-align:right">
+                </div>
+                <div class="td cbi-section-actions">
                     <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiadd')%>" method="post">
                         <input type="hidden" name="token" value="<%=token%>"/>
                         <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>"/>
@@ -76,20 +78,20 @@ This is free software, licensed under the Apache License, Version 2.0
                         <% end %>
                         <input class="cbi-button cbi-button-apply" type="submit" value="<%:Add Uplink%>"/>
                     </form>
-                </td>
-            </tr>
+                </div>
+            </div>
             <% end %>
-        </table>
-    </fieldset>
+        </div>
+    </div>
 <div class="cbi-page-actions right">
+    <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/stations')%>" method="get">
+        <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>"/>
+    </form>
     <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/wifiscan')%>" method="post">
         <input type="hidden" name="token" value="<%=token%>"/>
         <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>"/>
         <input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>"/>
     </form>
-    <form class="inline" action="<%=luci.dispatcher.build_url('admin/services/travelmate/stations')%>" method="post">
-        <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>"/>
-    </form>
 </div>
 </div>
 
index 535a9db26012898e60c347ef8c97af8903c08cd4..6a46ea3c87a3428eeabcefb3cc5ff33f14285ccd 100644 (file)
@@ -7,7 +7,7 @@ msgstr ""
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.0.7\n"
 "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Language: ja\n"
@@ -15,9 +15,6 @@ msgstr ""
 msgid "Actions"
 msgstr "操作"
 
-msgid "Add Interface"
-msgstr "インターフェースの追加"
-
 msgid "Add Uplink"
 msgstr "アップリンクの追加"
 
@@ -71,7 +68,7 @@ msgstr ""
 msgid "Connection Limit"
 msgstr "接続制限"
 
-msgid "Create Uplink Interface"
+msgid "Create Uplink interface"
 msgstr "アップリンク インターフェースの作成"
 
 msgid ""
@@ -202,7 +199,7 @@ msgid "Overall Timeout"
 msgstr "実行間隔"
 
 msgid "Overall retry timeout in seconds."
-msgstr ""
+msgstr "全体的な再試行タイムアウト(秒)です。"
 
 msgid "Overview"
 msgstr "概要"
@@ -283,6 +280,8 @@ msgstr "ステーション電波"
 msgid ""
 "The BSSID information '%s' is optional and only required for hidden networks"
 msgstr ""
+"BSSID 情報 '%s' はオプションであり、ステルス化されたネットワークにのみ必要で"
+"す。"
 
 msgid ""
 "This form allows you to modify the content of the main firewall "
@@ -319,6 +318,9 @@ msgstr ""
 "このフォームには、システムログ内の Travelmate に関するメッセージのみが表示さ"
 "れます。"
 
+msgid "This step has only to be done once."
+msgstr "この手順は、一度だけ実行される必要があります。"
+
 msgid "Travelmate"
 msgstr "Travelmate"
 
@@ -346,9 +348,6 @@ msgstr "アップリンク BSSID"
 msgid "Uplink SSID"
 msgstr "アップリンク SSID"
 
-msgid "Uplink interface"
-msgstr "アップリンク インターフェース"
-
 msgid "View AP QR-Codes"
 msgstr "AP QR-コードを確認"
 
@@ -379,37 +378,11 @@ msgstr "無線スキャン"
 msgid "Wireless Stations"
 msgstr "無線ステーション"
 
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
-msgstr ""
-"ファイアウォールの wan ゾーンに追加します。このステップは、一度だけ実行される"
-"必要があります。"
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr "ファイアウォールの wan ゾーンに追加します。<br />"
 
 msgid "hidden"
-msgstr "(不明)"
+msgstr "(ステルス)"
 
 msgid "n/a"
 msgstr "利用不可"
-
-#~ msgid "Enable 'automatic' mode"
-#~ msgstr "'automatic' モードの有効化"
-
-#~ msgid "Force a manual uplink rescan / reconnect in 'trigger' mode."
-#~ msgstr ""
-#~ "'trigger' モード時に、手動でアップリンクの再スキャンと再接続を行います。"
-
-#~ msgid ""
-#~ "Keep travelmate in an active state. Check every n seconds the connection "
-#~ "status, i.e. the uplink availability."
-#~ msgstr ""
-#~ "Travelmate をアクティブ状態で維持します。\"実行間隔\" で設定された時間毎"
-#~ "(秒)に、アップリンクの可用性を確認するために接続状態をチェックします"
-
-#~ msgid "Manual Rescan"
-#~ msgstr "手動再スキャン"
-
-#~ msgid "Rescan"
-#~ msgstr "再スキャン"
-
-#~ msgid "Timeout in seconds between retries in 'automatic' mode."
-#~ msgstr "'automatic' モード時に接続を確認または再試行する間隔(秒)です。"
index 5ea4d4a0d3c289a6fb773704528a680f989f879c..6bf65b9370ca8d8155dc92be110f6cc9f7e6c189 100644 (file)
@@ -15,9 +15,6 @@ msgstr ""
 msgid "Actions"
 msgstr ""
 
-msgid "Add Interface"
-msgstr ""
-
 msgid "Add Uplink"
 msgstr ""
 
@@ -67,7 +64,7 @@ msgstr ""
 msgid "Connection Limit"
 msgstr ""
 
-msgid "Create Uplink Interface"
+msgid "Create Uplink interface"
 msgstr ""
 
 msgid ""
@@ -292,6 +289,9 @@ msgid ""
 "messages only."
 msgstr ""
 
+msgid "This step has only to be done once."
+msgstr ""
+
 msgid "Travelmate"
 msgstr "Travelmate"
 
@@ -319,9 +319,6 @@ msgstr ""
 msgid "Uplink SSID"
 msgstr ""
 
-msgid "Uplink interface"
-msgstr ""
-
 msgid "View AP QR-Codes"
 msgstr ""
 
@@ -352,8 +349,7 @@ msgstr ""
 msgid "Wireless Stations"
 msgstr ""
 
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
+msgid "add it to the wan zone of the firewall.<br />"
 msgstr ""
 
 msgid "hidden"
index fad31bb849a9e411773b4b4374ce18438d2d0ae6..8b25e9b139105ee735071ca6c88a4f0ef743b5b6 100644 (file)
@@ -18,9 +18,6 @@ msgstr ""
 msgid "Actions"
 msgstr "Действия"
 
-msgid "Add Interface"
-msgstr "Добавить интерфейс"
-
 msgid "Add Uplink"
 msgstr "Подключение к сети"
 
@@ -70,8 +67,8 @@ msgstr ""
 msgid "Connection Limit"
 msgstr "Ограничение соединений"
 
-msgid "Create Uplink Interface"
-msgstr "Создать интерфейс сети"
+msgid "Create Uplink interface"
+msgstr ""
 
 msgid ""
 "Create a new wireless wan uplink interface, configure it to use dhcp and"
@@ -315,6 +312,9 @@ msgstr ""
 "Страница просмотра системного журнала, показаны только события связанные с "
 "работой утилиты TravelMate."
 
+msgid "This step has only to be done once."
+msgstr ""
+
 msgid "Travelmate"
 msgstr "TravelMate"
 
@@ -342,9 +342,6 @@ msgstr "BSSID внешней сети"
 msgid "Uplink SSID"
 msgstr "SSID внешней сети"
 
-msgid "Uplink interface"
-msgstr "Интерфейс внешней сети"
-
 msgid "View AP QR-Codes"
 msgstr ""
 
@@ -375,9 +372,8 @@ msgstr "Найденные точки доступа Wi-Fi"
 msgid "Wireless Stations"
 msgstr "Клиенты беспроводной сети"
 
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
-msgstr "добавить в wan зону межсетевого экрана. Можно сделать только один раз."
+msgid "add it to the wan zone of the firewall.<br />"
+msgstr ""
 
 msgid "hidden"
 msgstr "скрытый"
@@ -385,6 +381,21 @@ msgstr "скрытый"
 msgid "n/a"
 msgstr "нет данных"
 
+#~ msgid "Add Interface"
+#~ msgstr "Добавить интерфейс"
+
+#~ msgid "Create Uplink Interface"
+#~ msgstr "Создать интерфейс сети"
+
+#~ msgid "Uplink interface"
+#~ msgstr "Интерфейс внешней сети"
+
+#~ msgid ""
+#~ "add it to the wan zone of the firewall. This step has only to be done "
+#~ "once."
+#~ msgstr ""
+#~ "добавить в wan зону межсетевого экрана. Можно сделать только один раз."
+
 #~ msgid "Enable 'automatic' mode"
 #~ msgstr "Включить режим 'автоматически'"
 
index 8ba17668eca3370850a2427013c11882874cda5a..f4f34184226a02756ed368bd600512307fd0feca 100644 (file)
@@ -4,9 +4,6 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
 msgid "Actions"
 msgstr ""
 
-msgid "Add Interface"
-msgstr ""
-
 msgid "Add Uplink"
 msgstr ""
 
@@ -56,7 +53,7 @@ msgstr ""
 msgid "Connection Limit"
 msgstr ""
 
-msgid "Create Uplink Interface"
+msgid "Create Uplink interface"
 msgstr ""
 
 msgid ""
@@ -281,6 +278,9 @@ msgid ""
 "messages only."
 msgstr ""
 
+msgid "This step has only to be done once."
+msgstr ""
+
 msgid "Travelmate"
 msgstr ""
 
@@ -308,9 +308,6 @@ msgstr ""
 msgid "Uplink SSID"
 msgstr ""
 
-msgid "Uplink interface"
-msgstr ""
-
 msgid "View AP QR-Codes"
 msgstr ""
 
@@ -341,8 +338,7 @@ msgstr ""
 msgid "Wireless Stations"
 msgstr ""
 
-msgid ""
-"add it to the wan zone of the firewall. This step has only to be done once."
+msgid "add it to the wan zone of the firewall.<br />"
 msgstr ""
 
 msgid "hidden"
index bf2b65a0a1e1a61ee3e8ef4895c69c676b003c73..256bbb83925acb776caa35a08175326a51c444ae 100644 (file)
@@ -9,7 +9,7 @@ local rlh, rpv, vld, nvd, eds, prt, tlm
 local ctl, dlk, dom, dty, lfq, wfq, exa
 local dp6, d64, pfx, qry, qrs
 local pro, tgr, rsc, rsn, ag2, stt
-local rpn, din, dfw
+local rpn, din, dfw, ath
 local ucl = luci.model.uci.cursor()
 local valman = ucl:get_first("unbound", "unbound", "manual_conf")
 
@@ -100,15 +100,6 @@ if valman ~= "1" then
   pfx.optional = true
   pfx:depends({ dns64 = true })
 
-  qry = s1:taboption("basic", Flag, "query_minimize", translate("Query Minimize:"),
-    translate("Break down query components for limited added privacy"))
-  qry.rmempty = false
-
-  qrs = s1:taboption("basic", Flag, "query_min_strict", translate("Strict Minimize:"),
-    translate("Strict version of 'query minimize' but it can break DNS"))
-  qrs.rmempty = false
-  qrs:depends({ query_minimize = true })
-
   prt = s1:taboption("basic", Value, "listen_port", translate("Listening Port:"),
     translate("Choose Unbounds listening port"))
   prt.datatype = "port"
@@ -216,26 +207,43 @@ if valman ~= "1" then
 
   pro = s1:taboption("resource", ListValue, "protocol", translate("Recursion Protocol:"),
     translate("Chose the protocol recursion queries leave on"))
-  pro:value("mixed", translate("IP4 and IP6"))
-  pro:value("ip6_prefer", translate("IP6 Preferred"))
+  pro:value("default", translate("Default"))
   pro:value("ip4_only", translate("IP4 Only"))
   pro:value("ip6_only", translate("IP6 Only"))
+  pro:value("ip6_prefer", translate("IP6 Preferred"))
+  pro:value("mixed", translate("IP4 and IP6"))
   pro.rmempty = false
 
+  rsc = s1:taboption("resource", ListValue, "resource", translate("Memory Resource:"),
+    translate("Use menu System/Processes to observe any memory growth"))
+  rsc:value("default", translate("Default"))
+  rsc:value("tiny", translate("Tiny"))
+  rsc:value("small", translate("Small"))
+  rsc:value("medium", translate("Medium"))
+  rsc:value("large", translate("Large"))
+  rsc.rmempty = false
+
   rsn = s1:taboption("resource", ListValue, "recursion", translate("Recursion Strength:"),
     translate("Recursion activity affects memory growth and CPU load"))
-  rsn:value("aggressive", translate("Aggressive"))
   rsn:value("default", translate("Default"))
   rsn:value("passive", translate("Passive"))
+  rsn:value("aggressive", translate("Aggressive"))
   rsn.rmempty = false
 
-  rsc = s1:taboption("resource", ListValue, "resource", translate("Memory Resource:"),
-    translate("Use menu System/Processes to observe any memory growth"))
-  rsc:value("large", translate("Large"))
-  rsc:value("medium", translate("Medium"))
-  rsc:value("small", translate("Small"))
-  rsc:value("tiny", translate("Tiny"))
-  rsc.rmempty = false
+  qry = s1:taboption("resource", Flag, "query_minimize", translate("Query Minimize:"),
+    translate("Break down query components for limited added privacy"))
+  qry.rmempty = false
+  qry:depends({ recursion = "passive" })
+  qry:depends({ recursion = "aggressive" })
+
+  qrs = s1:taboption("resource", Flag, "query_min_strict", translate("Strict Minimize:"),
+    translate("Strict version of 'query minimize' but it can break DNS"))
+  qrs.rmempty = false
+  qrs:depends({ query_minimize = true })
+
+  ath = s1:taboption("resource", Flag, "prefetch_root", translate("Prefetch Root:"),
+    translate("Obtain complete root zone files and install in auth-zone: clause"))
+  ath.rmempty = false
 
   eds = s1:taboption("resource", Value, "edns_size", translate("EDNS Size:"),
     translate("Limit extended DNS packet size"))
index 89fdb5e21872ba2d1a323c4cf6fdbe88e7ecd254..ee385b24a8a7eaa17be3cd1eaf74f503bae2e2c7 100644 (file)
@@ -4,8 +4,8 @@
                        function(x)
                        {
                                var tb = document.getElementById('upnp_status_table');
-                               if (tb && (idx < tb.rows.length))
-                                       tb.rows[0].parentNode.removeChild(tb.rows[idx]);
+                               if (tb && (idx + 1 < tb.childNodes.length))
+                                       tb.removeChild(tb.childNodes[idx + 1]);
                        }
                );
        }
                        var tb = document.getElementById('upnp_status_table');
                        if (st && tb)
                        {
-                               /* clear all rows */
-                               while( tb.rows.length > 1 )
-                                       tb.deleteRow(1);
+                               var rows = [];
 
-                               for( var i = 0; i < st.length; i++ )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
+                               for (var i = 0; i < st.length; i++)
+                                       rows.push([
+                                               st[i].proto,
+                                               st[i].extport,
+                                               st[i].intaddr,
+                                               st[i].intport,
+                                               st[i].descr,
+                                               E('<input class="cbi-button cbi-button-remove" type="button" value="<%:Delete%>" onclick="upnp_delete_fwd(%d)" />'.format(st[i].num))
+                                       ]);
 
-                                       tr.insertCell(-1).innerHTML = st[i].proto;
-                                       tr.insertCell(-1).innerHTML = st[i].extport;
-                                       tr.insertCell(-1).innerHTML = st[i].intaddr;
-                                       tr.insertCell(-1).innerHTML = st[i].intport;
-                                       tr.insertCell(-1).innerHTML = st[i].descr;
-
-                                       tr.insertCell(-1).innerHTML = String.format(
-                                               '<input class="cbi-button cbi-input-remove" type="button" value="<%:Delete%>" onclick="upnp_delete_fwd(%d)" />',
-                                                       st[i].num
-                                       );
-                               }
-
-                               if( tb.rows.length == 1 )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 5;
-                                               td.innerHTML = '<em><br /><%:There are no active redirects.%></em>';
-                               }
+                               cbi_update_table(tb, rows, '<em><%:There are no active redirects.%></em>');
                        }
                }
        );
 //]]></script>
 
-<fieldset class="cbi-section">
-       <legend><%:Active UPnP Redirects%></legend>
-       <table class="cbi-section-table" id="upnp_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Protocol%></th>
-                       <th class="cbi-section-table-cell"><%:External Port%></th>
-                       <th class="cbi-section-table-cell"><%:Client Address%></th>
-                       <th class="cbi-section-table-cell"><%:Client Port%></th>
-                       <th class="cbi-section-table-cell"><%:Description%></th>
-                       <th class="cbi-section-table-cell">&#160;</th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
+<div class="cbi-section">
+       <h3><%:Active UPnP Redirects%></h3>
+       <div class="table" id="upnp_status_table">
+               <div class="tr table-titles">
+                       <div class="th"><%:Protocol%></div>
+                       <div class="th"><%:External Port%></div>
+                       <div class="th"><%:Client Address%></div>
+                       <div class="th"><%:Client Port%></div>
+                       <div class="th"><%:Description%></div>
+                       <div class="th cbi-section-actions">&#160;</div>
+               </div>
+               <div class="tr placeholder">
+                       <div class="td"><em><%:Collecting data...%></em></div>
+               </div>
+       </div>
+</div>
index 8f43ae371ad0ed00938f559c6d64cb8b3345f035..2a7fe3bd45308a3883de8e449dcf4f3e92f24b95 100644 (file)
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2013-05-26 19:26+0200\n"
+"PO-Revision-Date: 2018-06-17 23:15+0300\n"
 "Last-Translator: Yurii <yuripet@gmail.com>\n"
 "Language-Team: none\n"
 "Language: uk\n"
@@ -10,13 +10,13 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
+
 
 msgid ""
 "ACLs specify which external ports may be redirected to which internal "
 "addresses and ports"
 msgstr ""
-"Список кнтролю доступу визначає, які зовнішні порти можуть бути "
+"СпиÑ\81ок ÐºÐ¾Ð½Ñ\82Ñ\80олÑ\8e Ð´Ð¾Ñ\81Ñ\82Ñ\83пÑ\83 Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\8fкÑ\96 Ð·Ð¾Ð²Ð½Ñ\96Ñ\88нÑ\96 Ð¿Ð¾Ñ\80Ñ\82и Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и "
 "переспрямовані на які внутрішні адреси й порти"
 
 msgid "Action"
@@ -29,7 +29,7 @@ msgid "Advanced Settings"
 msgstr "Додаткові параметри"
 
 msgid "Advertise as IGDv1 device instead of IGDv2"
-msgstr ""
+msgstr "Оголошувати як пристрій IGDv1 замість IGDv2"
 
 msgid "Allow adding forwards only to requesting ip addresses"
 msgstr ""
@@ -59,20 +59,20 @@ msgstr "Збирання даних..."
 msgid "Comment"
 msgstr "Коментар"
 
-msgid "Delete"
-msgstr ""
+msgid "Delete Redirect"
+msgstr "Видалити переспрямування"
 
 msgid "Description"
-msgstr ""
+msgstr "Опис"
 
 msgid "Device UUID"
 msgstr "UUID пристрою"
 
 msgid "Downlink"
-msgstr "Ð\9dизÑ\85Ñ\96дний ÐºÐ°Ð½Ð°Ð»"
+msgstr "Ð\9dизÑ\85Ñ\96дне Ð·â\80\99Ñ\94днаннÑ\8f"
 
 msgid "Enable IGDv1 mode"
-msgstr ""
+msgstr "Увімкнути режим IGDv1"
 
 msgid "Enable NAT-PMP functionality"
 msgstr "Увімкнути функцію NAT-PMP"
@@ -148,20 +148,7 @@ msgid "Universal Plug & Play"
 msgstr "Universal Plug & Play"
 
 msgid "Uplink"
-msgstr "Ð\92иÑ\81Ñ\85Ñ\96дний ÐºÐ°Ð½Ð°Ð»"
+msgstr "Ð\92иÑ\81Ñ\85Ñ\96дне Ð·â\80\99Ñ\94днаннÑ\8f"
 
 msgid "Value in KByte/s, informational only"
-msgstr "Значення (КБ/с) тільки для інформації"
-
-#~ msgid "Delete Redirect"
-#~ msgstr "Видалити переспрямування"
-
-#~ msgid ""
-#~ "UPNP allows clients in the local network to automatically configure the "
-#~ "router."
-#~ msgstr ""
-#~ "UPnP надає клієнтам у локальній мережі змогу автоматично настроювати "
-#~ "маршрутизатор."
-
-#~ msgid "enable"
-#~ msgstr "Увімкнути"
+msgstr "Значення (КБ/с), тільки для інформації"
index 5af6232ae6f6c5e63538bf9946ef942bd77405cf..64d9955296a7604360b7e660139422ee0ab2a135 100644 (file)
 for ikey, iface in pairs(data) do
   -%>
   <legend><%:Interface%> <%=ikey%></legend>
-  <table width="100%" cellspacing="10">
-    <tr>
-      <td width="33%" style="vertical-align:top"><%:Configuration%></td>
-      <td>
-        <table>
-          <tr>
-            <td id="<%=ikey%>_icon" style="width:16px; text-align:center; padding:3px">
+  <div class="table" width="100%" cellspacing="10">
+    <div class="tr">
+      <div class="td" width="33%" style="vertical-align:top"><%:Configuration%></div>
+      <div class="td">
+        <div class="table">
+          <div class="tr">
+            <div class="td" id="<%=ikey%>_icon" style="width:16px; text-align:center; padding:3px">
               &nbsp;
-            </td>
-            <td id="<%=ikey%>_info" style="vertical-align:middle; padding: 3px">
+            </div>
+            <div class="td" id="<%=ikey%>_info" style="vertical-align:middle; padding: 3px">
               <em><%:Collecting data...%></em>
-            </td>
-        </tr></table>
-      </td>
-    </tr>
+            </div>
+        </div></div>
+      </div>
+    </div>
   <%-
   for pkey, peer in pairs(iface.peers) do
     -%>
-    <tr>
-      <td width="33%" style="vertical-align:top"><%:Peer%></td>
-      <td>
-        <table>
-          <tr>
-            <td id="<%=ikey%>_<%=peer.public_key%>_icon" style="width:16px; text-align:center; padding:3px">
+    <div class="tr">
+      <div class="td" width="33%" style="vertical-align:top"><%:Peer%></div>
+      <div class="td">
+        <div class="table">
+          <div class="tr">
+            <div class="td" id="<%=ikey%>_<%=peer.public_key%>_icon" style="width:16px; text-align:center; padding:3px">
               <img src="<%=resource%>/icons/tunnel_disabled.png" /><br />
               <small>?</small>
-            </td>
-            <td id="<%=ikey%>_<%=peer.public_key%>_info" style="vertical-align:middle; padding: 3px">
+            </div>
+            <div class="td" id="<%=ikey%>_<%=peer.public_key%>_info" style="vertical-align:middle; padding: 3px">
               <em><%:Collecting data...%></em>
-            </td>
-        </tr></table>
-      </td>
-    </tr>
+            </div>
+        </div></div>
+      </div>
+    </div>
     <%-
   end
   -%>
-  </table>
+  </div>
   <%-
 end
 -%>
diff --git a/collections/luci-nginx/Makefile b/collections/luci-nginx/Makefile
new file mode 100644 (file)
index 0000000..7d14b1d
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TYPE:=col
+LUCI_BASENAME:=nginx
+
+LUCI_TITLE:=LuCI interface with Nginx as Webserver
+LUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
+LUCI_DEPENDS:= \
+       +nginx +nginx-mod-luci +luci-mod-admin-full +luci-theme-bootstrap \
+       +luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6 \
+       +rpcd-mod-rrdns
+
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/collections/luci-ssl-nginx/Makefile b/collections/luci-ssl-nginx/Makefile
new file mode 100644 (file)
index 0000000..d7ff49a
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2008-2016 The LuCI Team
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TYPE:=col
+LUCI_BASENAME:=ssl
+
+LUCI_TITLE:=LuCI with HTTPS support (mbedTLS as SSL backend)
+LUCI_DEPENDS:=+luci-nginx +nginx-mod-luci-ssl +libustream-mbedtls +px5g
+
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/collections/luci-ssl-openssl-nginx/Makefile b/collections/luci-ssl-openssl-nginx/Makefile
new file mode 100644 (file)
index 0000000..5109647
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# Copyright (C) 2016 The LuCI Team
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TYPE:=col
+LUCI_BASENAME:=ssl-openssl
+
+LUCI_TITLE:=LuCI with HTTPS support (OpenSSL as SSL backend)
+LUCI_DESCRIPTION:=LuCI with OpenSSL as the SSL backend (libustream-openssl). \
+ OpenSSL cmd tools (openssl-util) are used by uhttpd for SSL key generation \
+ instead of the default px5g. (If px5g is installed, uhttpd will prefer that.)
+
+LUCI_DEPENDS:=+luci-nginx +nginx-mod-luci-ssl +libustream-openssl +openssl-util
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
index 9b495c3187b4ee887bf3dfa1390cd59c4f5ba379..3c765c396b8913459d56ea756fb1318af6c4f582 100644 (file)
@@ -9,7 +9,8 @@ include $(TOPDIR)/rules.mk
 LUCI_TYPE:=col
 LUCI_BASENAME:=luci
 
-LUCI_TITLE:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
+LUCI_TITLE:=LuCI interface with Uhttpd as Webserver (default)
+LUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
 LUCI_DEPENDS:= \
        +uhttpd +uhttpd-mod-ubus +luci-mod-admin-full +luci-theme-bootstrap \
        +luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6 \
diff --git a/luci.mk b/luci.mk
index cc39c0f4c8eb62086f8fdb1762e06d1a976cb357..6ece81c3d60b1f06d847e1219b6c63fe92584ab3 100644 (file)
--- a/luci.mk
+++ b/luci.mk
@@ -34,7 +34,7 @@ LUCI_LANG.ru=Русский (Russian)
 LUCI_LANG.sk=Slovenčina (Slovak)
 LUCI_LANG.sv=Svenska (Swedish)
 LUCI_LANG.tr=Türkçe (Turkish)
-LUCI_LANG.uk=украї́нська (Ukrainian)
+LUCI_LANG.uk=Українська (Ukrainian)
 LUCI_LANG.vi=Tiếng Việt (Vietnamese)
 LUCI_LANG.zh-cn=中文 (Chinese)
 LUCI_LANG.zh-tw=臺灣華語 (Taiwanese)
@@ -153,7 +153,7 @@ LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci
 
 define SrcDiet
        $(FIND) $(1) -type f -name '*.lua' | while read src; do \
-               if LuaSrcDiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
+               if luasrcdiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
                then mv "$$$$src.o" "$$$$src"; fi; \
        done
 endef
index 7f7d7e772f571a7a1ccee2f59953762df128ceba..5c38d99c589621dbaa00aad78afcd6c814d54afc 100644 (file)
@@ -14,12 +14,13 @@ LUCI_BASENAME:=base
 LUCI_TITLE:=LuCI core libraries
 LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +liblucihttp-lua
 
-PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
-PKG_SOURCE_URL:=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/luasrcdiet
-PKG_HASH:=ed7680f2896269ae8633756e7edcf09050812f78c8f49e280e63c30d14f35aea
-PKG_LICENSE:=Apache-2.0
 
-HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/LuaSrcDiet-0.12.1
+PKG_SOURCE:=v1.0.0.tar.gz
+PKG_SOURCE_URL:=https://github.com/jirutka/luasrcdiet/archive/
+PKG_HASH:=48162e63e77d009f5848f18a5cabffbdfc867d0e5e73c6d407f6af5d6880151b
+PKG_LICENSE:=MIT
+
+HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/luasrcdiet-1.0.0
 
 include $(INCLUDE_DIR)/host-build.mk
 
@@ -36,13 +37,13 @@ endef
 
 define Host/Compile
        $(MAKE) -C src/ clean po2lmo
-       $(MAKE) -C $(HOST_BUILD_DIR) bin/LuaSrcDiet.lua
+       $(MAKE) -C $(HOST_BUILD_DIR) bin/luasrcdiet
 endef
 
 define Host/Install
        $(INSTALL_DIR) $(1)/bin
        $(INSTALL_BIN) src/po2lmo $(1)/bin/po2lmo
-       $(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/LuaSrcDiet.lua $(1)/bin/LuaSrcDiet
+       $(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/luasrcdiet $(1)/bin/luasrcdiet
 endef
 
 $(eval $(call HostBuild))
index 6c35372cddd7560b6d76690f8dc1e0ac04b6e999..6a487366f8a5d652d348025237d2991e75a99fc8 100644 (file)
@@ -465,31 +465,16 @@ function cbi_d_add(field, dep, index) {
 }
 
 function cbi_d_checkvalue(target, ref) {
-       var t = document.getElementById(target);
-       var value;
+       var value = null,
+           query = 'input[id="'+target+'"], input[name="'+target+'"], ' +
+                   'select[id="'+target+'"], select[name="'+target+'"]';
 
-       if (!t) {
-               var tl = document.getElementsByName(target);
-
-               if( tl.length > 0 && (tl[0].type == 'radio' || tl[0].type == 'checkbox'))
-                       for( var i = 0; i < tl.length; i++ )
-                               if( tl[i].checked ) {
-                                       value = tl[i].value;
-                                       break;
-                               }
-
-               value = value ? value : "";
-       } else if (!t.value) {
-               value = "";
-       } else {
-               value = t.value;
-
-               if (t.type == "checkbox") {
-                       value = t.checked ? value : "";
-               }
-       }
+       document.querySelectorAll(query).forEach(function(i) {
+               if (value === null && ((i.type !== 'radio' && i.type !== 'checkbox') || i.checked === true))
+                       value = i.value;
+       });
 
-       return (value == ref)
+       return (((value !== null) ? value : "") == ref);
 }
 
 function cbi_d_check(deps) {
@@ -634,6 +619,14 @@ function cbi_init() {
                                   node.getAttribute('data-type'));
        }
 
+       document.querySelectorAll('.cbi-dropdown').forEach(function(s) {
+               cbi_dropdown_init(s);
+       });
+
+       document.querySelectorAll('.cbi-tooltip:not(:empty)').forEach(function(s) {
+               s.parentNode.classList.add('cbi-tooltip-container');
+       });
+
        cbi_d_update();
 }
 
@@ -1243,51 +1236,53 @@ function cbi_validate_field(cbid, optional, type)
 
 function cbi_row_swap(elem, up, store)
 {
-       var tr = elem.parentNode;
-       while (tr && tr.nodeName.toLowerCase() != 'tr')
-               tr = tr.parentNode;
+       var tr = findParent(elem.parentNode, '.cbi-section-table-row');
 
        if (!tr)
                return false;
 
-       var table = tr.parentNode;
-       while (table && table.nodeName.toLowerCase() != 'table')
-               table = table.parentNode;
+       tr.classList.remove('flash');
 
-       if (!table)
-               return false;
+       if (up) {
+               var prev = tr.previousElementSibling;
 
-       var s = up ? 3 : 2;
-       var e = up ? table.rows.length : table.rows.length - 1;
-
-       for (var idx = s; idx < e; idx++)
-       {
-               if (table.rows[idx] == tr)
-               {
-                       if (up)
-                               tr.parentNode.insertBefore(table.rows[idx], table.rows[idx-1]);
-                       else
-                               tr.parentNode.insertBefore(table.rows[idx+1], table.rows[idx]);
+               if (prev && prev.classList.contains('cbi-section-table-row'))
+                       tr.parentNode.insertBefore(tr, prev);
+               else
+                       return;
+       }
+       else {
+               var next = tr.nextElementSibling ? tr.nextElementSibling.nextElementSibling : null;
 
-                       break;
-               }
+               if (next && next.classList.contains('cbi-section-table-row'))
+                       tr.parentNode.insertBefore(tr, next);
+               else if (!next)
+                       tr.parentNode.appendChild(tr);
+               else
+                       return;
        }
 
        var ids = [ ];
-       for (idx = 2; idx < table.rows.length; idx++)
-       {
-               table.rows[idx].className = table.rows[idx].className.replace(
-                       /cbi-rowstyle-[12]/, 'cbi-rowstyle-' + (1 + (idx % 2))
-               );
 
-               if (table.rows[idx].id && table.rows[idx].id.match(/-([^\-]+)$/) )
-                       ids.push(RegExp.$1);
+       for (var i = 0, n = 0; i < tr.parentNode.childNodes.length; i++) {
+               var node = tr.parentNode.childNodes[i];
+               if (node.classList && node.classList.contains('cbi-section-table-row')) {
+                       node.classList.remove('cbi-rowstyle-1');
+                       node.classList.remove('cbi-rowstyle-2');
+                       node.classList.add((n++ % 2) ? 'cbi-rowstyle-2' : 'cbi-rowstyle-1');
+
+                       if (/-([^\-]+)$/.test(node.id))
+                               ids.push(RegExp.$1);
+               }
        }
 
        var input = document.getElementById(store);
        if (input)
                input.value = ids.join(' ');
 
+       window.scrollTo(0, tr.offsetTop);
+       window.setTimeout(function() { tr.classList.add('flash'); }, 1);
+
        return false;
 }
 
@@ -1311,58 +1306,6 @@ function cbi_tag_last(container)
        }
 }
 
-String.prototype.serialize = function()
-{
-       var o = this;
-       switch(typeof(o))
-       {
-               case 'object':
-                       // null
-                       if( o == null )
-                       {
-                               return 'null';
-                       }
-
-                       // array
-                       else if( o.length )
-                       {
-                               var i, s = '';
-
-                               for( var i = 0; i < o.length; i++ )
-                                       s += (s ? ', ' : '') + String.serialize(o[i]);
-
-                               return '[ ' + s + ' ]';
-                       }
-
-                       // object
-                       else
-                       {
-                               var k, s = '';
-
-                               for( k in o )
-                                       s += (s ? ', ' : '') + k + ': ' + String.serialize(o[k]);
-
-                               return '{ ' + s + ' }';
-                       }
-
-                       break;
-
-               case 'string':
-                       // complex string
-                       if( o.match(/[^a-zA-Z0-9_,.: -]/) )
-                               return 'decodeURIComponent("' + encodeURIComponent(o) + '")';
-
-                       // simple string
-                       else
-                               return '"' + o + '"';
-
-                       break;
-
-               default:
-                       return o.toString();
-       }
-}
-
 String.prototype.format = function()
 {
        if (!RegExp)
@@ -1473,10 +1416,6 @@ String.prototype.format = function()
                                                subst = esc(param, quot_esc);
                                                break;
 
-                                       case 'j':
-                                               subst = String.serialize(param);
-                                               break;
-
                                        case 't':
                                                var td = 0;
                                                var th = 0;
@@ -1543,14 +1482,6 @@ String.prototype.nobr = function()
        return this.replace(/[\s\n]+/g, '&#160;');
 }
 
-String.serialize = function()
-{
-       var a = [ ];
-       for (var i = 1; i < arguments.length; i++)
-               a.push(arguments[i]);
-       return ''.serialize.apply(arguments[0], a);
-}
-
 String.format = function()
 {
        var a = [ ];
@@ -1566,3 +1497,631 @@ String.nobr = function()
                a.push(arguments[i]);
        return ''.nobr.apply(arguments[0], a);
 }
+
+
+var dummyElem, domParser;
+
+function isElem(e)
+{
+       return (typeof(e) === 'object' && e !== null && 'nodeType' in e);
+}
+
+function toElem(s)
+{
+       var elem;
+
+       try {
+               domParser = domParser || new DOMParser();
+               elem = domParser.parseFromString(s, 'text/html').body.firstChild;
+       }
+       catch(e) {}
+
+       if (!elem) {
+               try {
+                       dummyElem = dummyElem || document.createElement('div');
+                       dummyElem.innerHTML = s;
+                       elem = dummyElem.firstChild;
+               }
+               catch (e) {}
+       }
+
+       return elem || null;
+}
+
+function findParent(node, selector)
+{
+       while (node)
+               if (node.msMatchesSelector && node.msMatchesSelector(selector))
+                       return node;
+               else if (node.matches && node.matches(selector))
+                       return node;
+               else
+                       node = node.parentNode;
+
+       return null;
+}
+
+function E()
+{
+       var html = arguments[0],
+           attr = (arguments[1] instanceof Object && !Array.isArray(arguments[1])) ? arguments[1] : null,
+           data = attr ? arguments[2] : arguments[1],
+           elem;
+
+       if (isElem(html))
+               elem = html;
+       else if (html.charCodeAt(0) === 60)
+               elem = toElem(html);
+       else
+               elem = document.createElement(html);
+
+       if (!elem)
+               return null;
+
+       if (attr)
+               for (var key in attr)
+                       if (attr.hasOwnProperty(key) && attr[key] !== null && attr[key] !== undefined)
+                               elem.setAttribute(key, attr[key]);
+
+       if (typeof(data) === 'function')
+               data = data(elem);
+
+       if (isElem(data)) {
+               elem.appendChild(data);
+       }
+       else if (Array.isArray(data)) {
+               for (var i = 0; i < data.length; i++)
+                       if (isElem(data[i]))
+                               elem.appendChild(data[i]);
+                       else
+                               elem.appendChild(document.createTextNode('' + data[i]));
+       }
+       else if (data !== null && data !== undefined) {
+               elem.innerHTML = '' + data;
+       }
+
+       return elem;
+}
+
+if (typeof(window.CustomEvent) !== 'function') {
+       function CustomEvent(event, params) {
+               params = params || { bubbles: false, cancelable: false, detail: undefined };
+               var evt = document.createEvent('CustomEvent');
+                   evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
+               return evt;
+       }
+
+       CustomEvent.prototype = window.Event.prototype;
+       window.CustomEvent = CustomEvent;
+}
+
+CBIDropdown = {
+       openDropdown: function(sb) {
+               var st = window.getComputedStyle(sb, null),
+                   ul = sb.querySelector('ul'),
+                   li = ul.querySelectorAll('li'),
+                   sel = ul.querySelector('[selected]'),
+                   rect = sb.getBoundingClientRect(),
+                   h = sb.clientHeight - parseFloat(st.paddingTop) - parseFloat(st.paddingBottom),
+                   mh = this.dropdown_items * h,
+                   eh = Math.min(mh, li.length * h);
+
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+                       s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+               });
+
+               ul.style.maxHeight = mh + 'px';
+               sb.setAttribute('open', '');
+
+               ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
+               ul.querySelectorAll('[selected] input[type="checkbox"]').forEach(function(c) {
+                       c.checked = true;
+               });
+
+               ul.style.top = ul.style.bottom = '';
+               ul.style[((sb.getBoundingClientRect().top + eh) > window.innerHeight) ? 'bottom' : 'top'] = rect.height + 'px';
+               ul.classList.add('dropdown');
+
+               var pv = ul.cloneNode(true);
+                   pv.classList.remove('dropdown');
+                   pv.classList.add('preview');
+
+               sb.insertBefore(pv, ul.nextElementSibling);
+
+               li.forEach(function(l) {
+                       l.setAttribute('tabindex', 0);
+               });
+
+               sb.lastElementChild.setAttribute('tabindex', 0);
+
+               this.setFocus(sb, sel || li[0], true);
+       },
+
+       closeDropdown: function(sb, no_focus) {
+               if (!sb.hasAttribute('open'))
+                       return;
+
+               var pv = sb.querySelector('ul.preview'),
+                   ul = sb.querySelector('ul.dropdown'),
+                   li = ul.querySelectorAll('li');
+
+               li.forEach(function(l) { l.removeAttribute('tabindex'); });
+               sb.lastElementChild.removeAttribute('tabindex');
+
+               sb.removeChild(pv);
+               sb.removeAttribute('open');
+               sb.style.width = sb.style.height = '';
+
+               ul.classList.remove('dropdown');
+
+               if (!no_focus)
+                       this.setFocus(sb, sb);
+
+               this.saveValues(sb, ul);
+       },
+
+       toggleItem: function(sb, li, force_state) {
+               if (li.hasAttribute('unselectable'))
+                       return;
+
+               if (this.multi) {
+                       var cbox = li.querySelector('input[type="checkbox"]'),
+                           items = li.parentNode.querySelectorAll('li'),
+                           label = sb.querySelector('ul.preview'),
+                           sel = li.parentNode.querySelectorAll('[selected]').length,
+                           more = sb.querySelector('.more'),
+                           ndisplay = this.display_items,
+                           n = 0;
+
+                       if (li.hasAttribute('selected')) {
+                               if (force_state !== true) {
+                                       if (sel > 1 || this.optional) {
+                                               li.removeAttribute('selected');
+                                               cbox.checked = cbox.disabled = false;
+                                               sel--;
+                                       }
+                                       else {
+                                               cbox.disabled = true;
+                                       }
+                               }
+                       }
+                       else {
+                               if (force_state !== false) {
+                                       li.setAttribute('selected', '');
+                                       cbox.checked = true;
+                                       cbox.disabled = false;
+                                       sel++;
+                               }
+                       }
+
+                       while (label.firstElementChild)
+                               label.removeChild(label.firstElementChild);
+
+                       for (var i = 0; i < items.length; i++) {
+                               items[i].removeAttribute('display');
+                               if (items[i].hasAttribute('selected')) {
+                                       if (ndisplay-- > 0) {
+                                               items[i].setAttribute('display', n++);
+                                               label.appendChild(items[i].cloneNode(true));
+                                       }
+                                       var c = items[i].querySelector('input[type="checkbox"]');
+                                       if (c)
+                                               c.disabled = (sel == 1 && !this.optional);
+                               }
+                       }
+
+                       if (ndisplay < 0)
+                               sb.setAttribute('more', '');
+                       else
+                               sb.removeAttribute('more');
+
+                       if (ndisplay === this.display_items)
+                               sb.setAttribute('empty', '');
+                       else
+                               sb.removeAttribute('empty');
+
+                       more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
+               }
+               else {
+                       var sel = li.parentNode.querySelector('[selected]');
+                       if (sel) {
+                               sel.removeAttribute('display');
+                               sel.removeAttribute('selected');
+                       }
+
+                       li.setAttribute('display', 0);
+                       li.setAttribute('selected', '');
+
+                       this.closeDropdown(sb, true);
+               }
+
+               this.saveValues(sb, li.parentNode);
+       },
+
+       transformItem: function(sb, li) {
+               var cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' })),
+                   label = E('label');
+
+               while (li.firstChild)
+                       label.appendChild(li.firstChild);
+
+               li.appendChild(cbox);
+               li.appendChild(label);
+       },
+
+       saveValues: function(sb, ul) {
+               var sel = ul.querySelectorAll('[selected]'),
+                   div = sb.lastElementChild;
+
+               while (div.lastElementChild)
+                       div.removeChild(div.lastElementChild);
+
+               sel.forEach(function (s) {
+                       div.appendChild(E('input', {
+                               type: 'hidden',
+                               name: s.hasAttribute('name') ? s.getAttribute('name') : (sb.getAttribute('name') || ''),
+                               value: s.hasAttribute('value') ? s.getAttribute('value') : s.innerText
+                       }));
+               });
+
+               cbi_d_update();
+       },
+
+       setFocus: function(sb, elem, scroll) {
+               if (sb && sb.hasAttribute && sb.hasAttribute('locked-in'))
+                       return;
+
+               document.querySelectorAll('.focus').forEach(function(e) {
+                       if (e.nodeName.toLowerCase() !== 'input') {
+                               e.classList.remove('focus');
+                               e.blur();
+                       }
+               });
+
+               if (elem) {
+                       elem.focus();
+                       elem.classList.add('focus');
+
+                       if (scroll)
+                               elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop;
+               }
+       },
+
+       createItems: function(sb, value) {
+               var sbox = this,
+                   val = (value || '').trim().split(/\s+/),
+                   ul = sb.querySelector('ul');
+
+               if (!sbox.multi)
+                       val.length = Math.min(val.length, 1);
+
+               val.forEach(function(item) {
+                       var new_item = null;
+
+                       ul.childNodes.forEach(function(li) {
+                               if (li.getAttribute && li.getAttribute('value') === item)
+                                       new_item = li;
+                       });
+
+                       if (!new_item) {
+                               var markup,
+                                   tpl = sb.querySelector(sbox.template);
+
+                               if (tpl)
+                                       markup = (tpl.textContent || tpl.innerHTML || tpl.firstChild.data).replace(/^<!--|-->$/, '').trim();
+                               else
+                                       markup = '<li value="{{value}}">{{value}}</li>';
+
+                               new_item = E(markup.replace(/{{value}}/g, item));
+
+                               if (sbox.multi) {
+                                       sbox.transformItem(sb, new_item);
+                               }
+                               else {
+                                       var old = ul.querySelector('li[created]');
+                                       if (old)
+                                               ul.removeChild(old);
+
+                                       new_item.setAttribute('created', '');
+                               }
+
+                               new_item = ul.insertBefore(new_item, ul.lastElementChild);
+                       }
+
+                       sbox.toggleItem(sb, new_item, true);
+                       sbox.setFocus(sb, new_item, true);
+               });
+       },
+
+       closeAllDropdowns: function() {
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+                       s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+               });
+       }
+};
+
+function cbi_dropdown_init(sb) {
+       if (!(this instanceof cbi_dropdown_init))
+               return new cbi_dropdown_init(sb);
+
+       this.multi = sb.hasAttribute('multiple');
+       this.optional = sb.hasAttribute('optional');
+       this.placeholder = sb.getAttribute('placeholder') || '---';
+       this.display_items = parseInt(sb.getAttribute('display-items') || 3);
+       this.dropdown_items = parseInt(sb.getAttribute('dropdown-items') || 5);
+       this.create = sb.getAttribute('item-create') || '.create-item-input';
+       this.template = sb.getAttribute('item-template') || 'script[type="item-template"]';
+
+       var sbox = this,
+           ul = sb.querySelector('ul'),
+           items = ul.querySelectorAll('li'),
+           more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···')),
+           open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, '▾')),
+           canary = sb.appendChild(E('div')),
+           create = sb.querySelector(this.create),
+           ndisplay = this.display_items,
+           n = 0;
+
+       if (this.multi) {
+               for (var i = 0; i < items.length; i++) {
+                       sbox.transformItem(sb, items[i]);
+
+                       if (items[i].hasAttribute('selected') && ndisplay-- > 0)
+                               items[i].setAttribute('display', n++);
+               }
+       }
+       else {
+               var sel = sb.querySelectorAll('[selected]');
+
+               sel.forEach(function(s) {
+                       s.removeAttribute('selected');
+               });
+
+               var s = sel[0] || items[0];
+               if (s) {
+                       s.setAttribute('selected', '');
+                       s.setAttribute('display', n++);
+               }
+
+               ndisplay--;
+
+               if (this.optional && !ul.querySelector('li[value=""]')) {
+                       var placeholder = E('li', { placeholder: '' }, this.placeholder);
+                       ul.firstChild ? ul.insertBefore(placeholder, ul.firstChild) : ul.appendChild(placeholder);
+               }
+       }
+
+       sbox.saveValues(sb, ul);
+
+       ul.setAttribute('tabindex', -1);
+       sb.setAttribute('tabindex', 0);
+
+       if (ndisplay < 0)
+               sb.setAttribute('more', '')
+       else
+               sb.removeAttribute('more');
+
+       if (ndisplay === this.display_items)
+               sb.setAttribute('empty', '')
+       else
+               sb.removeAttribute('empty');
+
+       more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
+
+
+       sb.addEventListener('click', function(ev) {
+               if (!this.hasAttribute('open')) {
+                       if (ev.target.nodeName.toLowerCase() !== 'input')
+                               sbox.openDropdown(this);
+               }
+               else {
+                       var li = findParent(ev.target, 'li');
+                       if (li && li.parentNode.classList.contains('dropdown'))
+                               sbox.toggleItem(this, li);
+               }
+
+               ev.preventDefault();
+               ev.stopPropagation();
+       });
+
+       sb.addEventListener('keydown', function(ev) {
+               if (ev.target.nodeName.toLowerCase() === 'input')
+                       return;
+
+               if (!this.hasAttribute('open')) {
+                       switch (ev.keyCode) {
+                       case 37:
+                       case 38:
+                       case 39:
+                       case 40:
+                               sbox.openDropdown(this);
+                               ev.preventDefault();
+                       }
+               }
+               else
+               {
+                       var active = findParent(document.activeElement, 'li');
+
+                       switch (ev.keyCode) {
+                       case 27:
+                               sbox.closeDropdown(this);
+                               break;
+
+                       case 13:
+                               if (active) {
+                                       if (!active.hasAttribute('selected'))
+                                               sbox.toggleItem(this, active);
+                                       sbox.closeDropdown(this);
+                                       ev.preventDefault();
+                               }
+                               break;
+
+                       case 32:
+                               if (active) {
+                                       sbox.toggleItem(this, active);
+                                       ev.preventDefault();
+                               }
+                               break;
+
+                       case 38:
+                               if (active && active.previousElementSibling) {
+                                       sbox.setFocus(this, active.previousElementSibling);
+                                       ev.preventDefault();
+                               }
+                               break;
+
+                       case 40:
+                               if (active && active.nextElementSibling) {
+                                       sbox.setFocus(this, active.nextElementSibling);
+                                       ev.preventDefault();
+                               }
+                               break;
+                       }
+               }
+       });
+
+       sb.addEventListener('cbi-dropdown-close', function(ev) {
+               sbox.closeDropdown(this, true);
+       });
+
+       if ('ontouchstart' in window) {
+               sb.addEventListener('touchstart', function(ev) { ev.stopPropagation(); });
+               window.addEventListener('touchstart', sbox.closeAllDropdowns);
+       }
+       else {
+               sb.addEventListener('mouseover', function(ev) {
+                       if (!this.hasAttribute('open'))
+                               return;
+
+                       var li = findParent(ev.target, 'li');
+                       if (li) {
+                               if (li.parentNode.classList.contains('dropdown'))
+                                       sbox.setFocus(this, li);
+
+                               ev.stopPropagation();
+                       }
+               });
+
+               sb.addEventListener('focus', function(ev) {
+                       document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+                               if (s !== this || this.hasAttribute('open'))
+                                       s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+                       });
+               });
+
+               canary.addEventListener('focus', function(ev) {
+                       sbox.closeDropdown(this.parentNode);
+               });
+
+               window.addEventListener('mouseover', sbox.setFocus);
+               window.addEventListener('click', sbox.closeAllDropdowns);
+       }
+
+       if (create) {
+               create.addEventListener('keydown', function(ev) {
+                       switch (ev.keyCode) {
+                       case 13:
+                               sbox.createItems(sb, this.value);
+                               ev.preventDefault();
+                               this.value = '';
+                               this.blur();
+                               break;
+                       }
+               });
+
+               create.addEventListener('focus', function(ev) {
+                       var cbox = findParent(this, 'li').querySelector('input[type="checkbox"]');
+                       if (cbox) cbox.checked = true;
+                       sb.setAttribute('locked-in', '');
+               });
+
+               create.addEventListener('blur', function(ev) {
+                       var cbox = findParent(this, 'li').querySelector('input[type="checkbox"]');
+                       if (cbox) cbox.checked = false;
+                       sb.removeAttribute('locked-in');
+               });
+
+               var li = findParent(create, 'li');
+
+               li.setAttribute('unselectable', '');
+               li.addEventListener('click', function(ev) {
+                       this.querySelector(sbox.create).focus();
+               });
+       }
+}
+
+cbi_dropdown_init.prototype = CBIDropdown;
+
+function cbi_update_table(table, data, placeholder) {
+       target = isElem(table) ? table : document.querySelector(table);
+
+       if (!isElem(target))
+               return;
+
+       target.querySelectorAll('.tr.table-titles, .cbi-section-table-titles').forEach(function(thead) {
+               var titles = [];
+
+               thead.querySelectorAll('.th').forEach(function(th) {
+                       titles.push(th);
+               });
+
+               if (Array.isArray(data)) {
+                       var n = 0, rows = target.querySelectorAll('.tr');
+
+                       data.forEach(function(row) {
+                               var trow = E('div', { 'class': 'tr' });
+
+                               for (var i = 0; i < titles.length; i++) {
+                                       var text = titles[i].innerText;
+                                       var td = trow.appendChild(E('div', {
+                                               'class': titles[i].className,
+                                               'data-title': text ? text.trim() : null
+                                       }, row[i] || ''));
+
+                                       td.classList.remove('th');
+                                       td.classList.add('td');
+                               }
+
+                               trow.classList.add('cbi-rowstyle-%d'.format((n++ % 2) ? 2 : 1));
+
+                               if (rows[n])
+                                       target.replaceChild(trow, rows[n]);
+                               else
+                                       target.appendChild(trow);
+                       });
+
+                       while (rows[++n])
+                               target.removeChild(rows[n]);
+
+                       if (placeholder && target.firstElementChild === target.lastElementChild) {
+                               var trow = target.appendChild(E('div', { 'class': 'tr placeholder' }));
+                               var td = trow.appendChild(E('div', { 'class': titles[0].className }, placeholder));
+
+                               td.classList.remove('th');
+                               td.classList.add('td');
+                       }
+               }
+               else {
+                       thead.parentNode.style.display = 'none';
+
+                       thead.parentNode.querySelectorAll('.tr, .cbi-section-table-row').forEach(function(trow) {
+                               if (trow !== thead) {
+                                       var n = 0;
+                                       trow.querySelectorAll('.th, .td').forEach(function(td) {
+                                               if (n < titles.length) {
+                                                       var text = (titles[n++].innerText || '').trim();
+                                                       if (text !== '')
+                                                               td.setAttribute('data-title', text);
+                                               }
+                                       });
+                               }
+                       });
+
+                       thead.parentNode.style.display = '';
+               }
+       });
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+       document.querySelectorAll('.table').forEach(cbi_update_table);
+});
index de4476cdd32412a7bbf45e8c507a5f8025820acc..f1537a448133cb657131bb51ac5b66019ec883de 100644 (file)
@@ -204,7 +204,6 @@ XHR.poll = function(interval, url, data, callback, post)
        };
 
        XHR._q.push(e);
-       XHR.run();
 
        return e;
 }
@@ -260,3 +259,5 @@ XHR.running = function()
 {
        return !!(XHR._r && XHR._i);
 }
+
+document.addEventListener('DOMContentLoaded', XHR.run);
index 4728642118c5d3794a3b5f9d7f25389bcf5c8743..d275c5b27564366041a56fc3010b07d4a938e8dc 100644 (file)
@@ -1226,13 +1226,14 @@ function TypedSection.parse(self, novld)
                local stval = RESORT_PREFIX .. self.config .. "." .. self.sectiontype
                local order = self.map:formvalue(stval)
                if order and #order > 0 then
-                       local sid
-                       local num = 0
+                       local sids, sid = { }, nil
                        for sid in util.imatch(order) do
-                               self.map.uci:reorder(self.config, sid, num)
-                               num = num + 1
+                               sids[#sids+1] = sid
+                       end
+                       if #sids > 0 then
+                               self.map.uci:reorder(self.config, sids)
+                               self.changed = true
                        end
-                       self.changed = (num > 0)
                end
        end
 
@@ -1416,6 +1417,12 @@ function AbstractValue.parse(self, section, novld)
                        self:add_error(section, "invalid", val_err)
                end
 
+               if self.alias then
+                       self.section.aliased = self.section.aliased or {}
+                       self.section.aliased[section] = self.section.aliased[section] or {}
+                       self.section.aliased[section][self.alias] = true
+               end
+
                if fvalue and (self.forcewrite or not (fvalue == cvalue)) then
                        if self:write(section, fvalue) then
                                -- Push events
@@ -1425,10 +1432,16 @@ function AbstractValue.parse(self, section, novld)
                end
        else                                                    -- Unset the UCI or error
                if self.rmempty or self.optional then
-                       if self:remove(section) then
-                               -- Push events
-                               self.section.changed = true
-                               --luci.util.append(self.map.events, self.events)
+                       if not self.alias or
+                          not self.section.aliased or
+                          not self.section.aliased[section] or
+                          not self.section.aliased[section][self.alias]
+                       then
+                               if self:remove(section) then
+                                       -- Push events
+                                       self.section.changed = true
+                                       --luci.util.append(self.map.events, self.events)
+                               end
                        end
                elseif cvalue ~= fvalue and not novld then
                        -- trigger validator with nil value to get custom user error msg.
@@ -1454,7 +1467,7 @@ function AbstractValue.cfgvalue(self, section)
        if self.tag_error[section] then
                value = self:formvalue(section)
        else
-               value = self.map:get(section, self.option)
+               value = self.map:get(section, self.alias or self.option)
        end
 
        if not value then
@@ -1495,12 +1508,12 @@ AbstractValue.transform = AbstractValue.validate
 
 -- Write to UCI
 function AbstractValue.write(self, section, value)
-       return self.map:set(section, self.option, value)
+       return self.map:set(section, self.alias or self.option, value)
 end
 
 -- Remove from UCI
 function AbstractValue.remove(self, section)
-       return self.map:del(section, self.option)
+       return self.map:del(section, self.alias or self.option)
 end
 
 
@@ -1833,6 +1846,15 @@ function DynamicList.formvalue(self, section)
 end
 
 
+DropDown = class(MultiValue)
+
+function DropDown.__init__(self, ...)
+       ListValue.__init__(self, ...)
+       self.template = "cbi/dropdown"
+       self.delimiter = " "
+end
+
+
 --[[
 TextValue - A multi-line value
        rows:   Rows
index 45e1e308f8f6ddebddbc7ee7534e1f677443d9e6..6850d7e3a946ae55f58f7f2066221dee6be132a3 100644 (file)
@@ -358,7 +358,7 @@ function dispatch(request)
                        elseif key == "REQUEST_URI" then
                                return build_url(unpack(ctx.requestpath))
                        elseif key == "FULL_REQUEST_URI" then
-                               local url = { http.getenv("SCRIPT_NAME"), http.getenv("PATH_INFO") }
+                               local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") }
                                local query = http.getenv("QUERY_STRING")
                                if query and #query > 0 then
                                        url[#url+1] = "?"
@@ -507,10 +507,11 @@ function dispatch(request)
                else
                        ok, err = util.copcall(target, unpack(args))
                end
-               assert(ok,
-                      "Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
-                      " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
-                      "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
+               if not ok then
+                       error500("Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
+                                " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
+                                "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
+               end
        else
                local root = node()
                if not root or not root.target then
index 461ba9d5a38efae2c042829dce83d5aaeec13749..92c0d8f69998a19c61d3e1827dd3363b91900298 100644 (file)
@@ -8,7 +8,7 @@ local table = require "table"
 
 local setmetatable, rawget, rawset = setmetatable, rawget, rawset
 local require, getmetatable, assert = require, getmetatable, assert
-local error, pairs, ipairs = error, pairs, ipairs
+local error, pairs, ipairs, select = error, pairs, ipairs, select
 local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
 
 -- The typical workflow for UCI is:  Get a cursor instance from the
@@ -106,7 +106,7 @@ function changes(self, config)
                        local _, change
                        for _, change in ipairs(changes) do
                                local operation, section, option, value = unpack(change)
-                               if option and value and operation ~= "add" then
+                               if option and operation ~= "add" then
                                        res[package][section] = res[package][section] or { }
 
                                        if operation == "list-add" then
@@ -373,15 +373,15 @@ function add(self, config, stype)
        return self:section(config, stype)
 end
 
-function set(self, config, section, option, value)
-       if value == nil then
+function set(self, config, section, option, ...)
+       if select('#', ...) == 0 then
                local sname, err = self:section(config, option, section)
                return (not not sname), err
        else
                local _, err = call("set", {
                        config  = config,
                        section = section,
-                       values  = { [option] = value }
+                       values  = { [option] = select(1, ...) }
                })
                return (err == nil), ERRSTR[err]
        end
index 06a9ad41546ef5d7fc6b849af5ce7684cb9e560a..635995310f640b758fa5d5afd79a0647c66c50ec 100644 (file)
@@ -6,9 +6,25 @@ module("luci.tools.status", package.seeall)
 local uci = require "luci.model.uci".cursor()
 local ipc = require "luci.ip"
 
+local function duid_to_mac(duid)
+       local b1, b2, b3, b4, b5, b6
+
+       -- DUID-LLT / Ethernet
+       if type(duid) == "string" and #duid == 28 then
+               b1, b2, b3, b4, b5, b6 = duid:match("^00010001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)%x%x%x%x%x%x%x%x$")
+
+       -- DUID-LL / Ethernet
+       elseif type(duid) == "string" and #duid == 20 then
+               b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
+       end
+
+       return b1 and ipc.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":"))
+end
+
 local function dhcp_leases_common(family)
        local rv = { }
        local nfs = require "nixio.fs"
+       local sys = require "luci.sys"
        local leasefile = "/tmp/dhcp.leases"
 
        uci:foreach("dhcp", "dnsmasq",
@@ -87,6 +103,22 @@ local function dhcp_leases_common(family)
                fd:close()
        end
 
+       if family == 6 then
+               local _, lease
+               local hosts = sys.net.host_hints()
+               for _, lease in ipairs(rv) do
+                       local mac = duid_to_mac(lease.duid)
+                       local host = mac and hosts[mac]
+                       if host then
+                               if not lease.name then
+                                       lease.host_hint = host.name or host.ipv4 or host.ipv6
+                               elseif host.name and lease.hostname ~= host.name then
+                                       lease.host_hint = host.name
+                               end
+                       end
+               end
+       end
+
        return rv
 end
 
@@ -113,6 +145,11 @@ function wifi_networks()
 
                local net
                for _, net in ipairs(dev:get_wifinets()) do
+                       local a, an = nil, 0
+                       for _, a in pairs(net:assoclist() or {}) do
+                               an = an + 1
+                       end
+
                        rd.networks[#rd.networks+1] = {
                                name       = net:shortname(),
                                link       = net:adminlink(),
@@ -128,10 +165,10 @@ function wifi_networks()
                                noise      = net:noise(),
                                bitrate    = net:bitrate(),
                                ifname     = net:ifname(),
-                               assoclist  = net:assoclist(),
                                country    = net:country(),
                                txpower    = net:txpower(),
                                txpoweroff = net:txpower_offset(),
+                               num_assoc  = an,
                                disabled   = (dev:get("disabled") == "1" or
                                             net:get("disabled") == "1")
                        }
@@ -165,7 +202,6 @@ function wifi_network(id)
                                noise      = net:noise(),
                                bitrate    = net:bitrate(),
                                ifname     = net:ifname(),
-                               assoclist  = net:assoclist(),
                                country    = net:country(),
                                txpower    = net:txpower(),
                                txpoweroff = net:txpower_offset(),
@@ -182,6 +218,52 @@ function wifi_network(id)
        return { }
 end
 
+function wifi_assoclist()
+       local sys = require "luci.sys"
+       local ntm = require "luci.model.network".init()
+       local hosts = sys.net.host_hints()
+
+       local assoc = {}
+       local _, dev, net, bss
+
+       for _, dev in ipairs(ntm:get_wifidevs()) do
+               local radioname = dev:get_i18n()
+
+               for _, net in ipairs(dev:get_wifinets()) do
+                       local netname = net:shortname()
+                       local netlink = net:adminlink()
+                       local ifname  = net:ifname()
+
+                       for _, bss in pairs(net:assoclist() or {}) do
+                               local host = hosts[_]
+
+                               bss.bssid  = _
+                               bss.ifname = ifname
+                               bss.radio  = radioname
+                               bss.name   = netname
+                               bss.link   = netlink
+
+                               bss.host_name = (host) and (host.name or host.ipv4 or host.ipv6)
+                               bss.host_hint = (host and host.name and (host.ipv4 or host.ipv6)) and (host.ipv4 or host.ipv6)
+
+                               assoc[#assoc+1] = bss
+                       end
+               end
+       end
+
+       table.sort(assoc, function(a, b)
+               if a.radio ~= b.radio then
+                       return a.radio < b.radio
+               elseif a.ifname ~= b.ifname then
+                       return a.ifname < b.ifname
+               else
+                       return a.bssid < b.bssid
+               end
+       end)
+
+       return assoc
+end
+
 function switch_status(devs)
        local dev
        local switches = { }
index ce42af2fb00509779d1ef5feb9c124eb083a91cc..10428b0b35f707d26b42ca492fa94bf94713991b 100644 (file)
@@ -100,6 +100,8 @@ end
 -- Scope manipulation routines
 --
 
+coxpt = setmetatable({}, { __mode = "kv" })
+
 local tl_meta = {
        __mode = "k",
 
@@ -697,73 +699,69 @@ function checklib(fullpathexe, wantedlib)
        return false
 end
 
+-------------------------------------------------------------------------------
+-- Coroutine safe xpcall and pcall versions
 --
--- Coroutine safe xpcall and pcall versions modified for Luci
--- original version:
--- coxpcall 1.13 - Copyright 2005 - Kepler Project (www.keplerproject.org)
+-- Encapsulates the protected calls with a coroutine based loop, so errors can
+-- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
+-- yielding inside the call to pcall or xpcall.
 --
--- Copyright © 2005 Kepler Project.
--- Permission is hereby granted, free of charge, to any person obtaining a
--- copy of this software and associated documentation files (the "Software"),
--- to deal in the Software without restriction, including without limitation
--- the rights to use, copy, modify, merge, publish, distribute, sublicense,
--- and/or sell copies of the Software, and to permit persons to whom the
--- Software is furnished to do so, subject to the following conditions:
+-- Authors: Roberto Ierusalimschy and Andre Carregal
+-- Contributors: Thomas Harning Jr., Ignacio Burgueño, Fabio Mascarenhas
 --
--- The above copyright notice and this permission notice shall be
--- included in all copies or substantial portions of the Software.
+-- Copyright 2005 - Kepler Project
 --
--- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
--- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
--- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
--- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
--- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
--- OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-local performResume, handleReturnValue
-local oldpcall, oldxpcall = pcall, xpcall
-coxpt = {}
-setmetatable(coxpt, {__mode = "kv"})
-
--- Identity function for copcall
-local function copcall_id(trace, ...)
-  return ...
-end
-
---                             values of either the function or the error handler
-function coxpcall(f, err, ...)
-       local res, co = oldpcall(coroutine.create, f)
-       if not res then
-               local params = {...}
-               local newf = function() return f(unpack(params)) end
-               co = coroutine.create(newf)
-       end
-       local c = coroutine.running()
-       coxpt[co] = coxpt[c] or c or 0
+-- $Id: coxpcall.lua,v 1.13 2008/05/19 19:20:02 mascarenhas Exp $
+-------------------------------------------------------------------------------
 
-       return performResume(err, co, ...)
-end
-
---                             values of the function or the error object
-function copcall(f, ...)
-       return coxpcall(f, copcall_id, ...)
-end
+-------------------------------------------------------------------------------
+-- Implements xpcall with coroutines
+-------------------------------------------------------------------------------
+local coromap = setmetatable({}, { __mode = "k" })
 
--- Handle return value of protected call
-function handleReturnValue(err, co, status, ...)
+local function handleReturnValue(err, co, status, ...)
        if not status then
                return false, err(debug.traceback(co, (...)), ...)
        end
-
-       if coroutine.status(co) ~= 'suspended' then
+       if coroutine.status(co) == 'suspended' then
+               return performResume(err, co, coroutine.yield(...))
+       else
                return true, ...
        end
-
-       return performResume(err, co, coroutine.yield(...))
 end
 
--- Resume execution of protected function call
 function performResume(err, co, ...)
        return handleReturnValue(err, co, coroutine.resume(co, ...))
 end
+
+local function id(trace, ...)
+       return trace
+end
+
+function coxpcall(f, err, ...)
+       local current = coroutine.running()
+       if not current then
+               if err == id then
+                       return pcall(f, ...)
+               else
+                       if select("#", ...) > 0 then
+                               local oldf, params = f, { ... }
+                               f = function() return oldf(unpack(params)) end
+                       end
+                       return xpcall(f, err)
+               end
+       else
+               local res, co = pcall(coroutine.create, f)
+               if not res then
+                       local newf = function(...) return f(...) end
+                       co = coroutine.create(newf)
+               end
+               coromap[co] = current
+               coxpt[co] = coxpt[current] or current or 0
+               return performResume(err, co, ...)
+       end
+end
+
+function copcall(f, ...)
+       return coxpcall(f, id, ...)
+end
index 543ef0b80ba9015a3de3d285c2f363cc96825aa3..e3090da656e342921f81f651cdaddfcf001a6acb 100644 (file)
@@ -1,59 +1,98 @@
 <% export("cbi_apply_widget", function(redirect_ok) -%>
 <style type="text/css">
-       #cbi_apply_status {
+       .alert-message.notice {
+               background: linear-gradient(#fff 0%, #eee 100%);
+       }
+
+       #cbi_apply_overlay {
+               position: absolute;
+               top: 0;
+               left: 0;
+               bottom: 0;
+               right: 0;
+               background: rgba(0, 0, 0, 0.7);
+               display: none;
+               z-index: 20000;
+       }
+
+       #cbi_apply_overlay .alert-message {
+               position: relative;
+               top: 10%;
+               width: 60%;
+               margin: auto;
                display: flex;
                flex-wrap: wrap;
                min-height: 32px;
                align-items: center;
-               margin: 1.5em 0 1.5em 0;
        }
 
-       #cbi_apply_status > h4,
-       #cbi_apply_status > p,
-       #cbi_apply_status > div {
+       #cbi_apply_overlay .alert-message > h4,
+       #cbi_apply_overlay .alert-message > p,
+       #cbi_apply_overlay .alert-message > div {
                flex-basis: 100%;
        }
 
-       #cbi_apply_status > img {
+       #cbi_apply_overlay .alert-message > img {
                margin-right: 1em;
                flex-basis: 32px;
        }
 
-       #cbi_apply_status + script + .cbi-section {
-               margin-top: -1em;
+       body.apply-overlay-active {
+               overflow: hidden;
+               height: 100vh;
        }
 
-       .alert-message.notice {
-               background: linear-gradient(#fff 0%, #eee 100%);
+       body.apply-overlay-active #cbi_apply_overlay {
+               display: block;
        }
 </style>
 
 <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 <script type="text/javascript">//<![CDATA[
        var xhr = new XHR(),
-           stat, indicator,
            uci_apply_auth = { sid: '<%=luci.dispatcher.context.authsession%>', token: '<%=token%>' },
            uci_apply_rollback = <%=math.max(luci.config and luci.config.apply and luci.config.apply.rollback or 30, 30)%>,
            uci_apply_holdoff = <%=math.max(luci.config and luci.config.apply and luci.config.apply.holdoff or 4, 1)%>,
            uci_apply_timeout = <%=math.max(luci.config and luci.config.apply and luci.config.apply.timeout or 5, 1)%>,
            uci_apply_display = <%=math.max(luci.config and luci.config.apply and luci.config.apply.display or 1.5, 1)%>;
 
+       function uci_status_message(type, content) {
+               var overlay = document.getElementById('cbi_apply_overlay') || document.body.appendChild(E('<div id="cbi_apply_overlay"><div class="alert-message"></div></div>')),
+                   message = overlay.querySelector('.alert-message');
+
+               if (message && type) {
+                       if (!message.classList.contains(type)) {
+                               message.classList.remove('notice');
+                               message.classList.remove('warning');
+                               message.classList.add(type);
+                       }
+
+                       if (content)
+                               message.innerHTML = content;
+
+                       document.body.classList.add('apply-overlay-active');
+               }
+               else {
+                       document.body.classList.remove('apply-overlay-active');
+               }
+       }
+
        function uci_rollback(checked) {
                if (checked) {
-                       stat.classList.remove('notice');
-                       stat.classList.add('warning');
-                       stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                        '<%:Failed to confirm apply within %ds, waiting for rollback…%>'.format(uci_apply_rollback);
+                       uci_status_message('warning',
+                               '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                               '<%:Failed to confirm apply within %ds, waiting for rollback…%>'.format(uci_apply_rollback));
 
                        var call = function(r) {
                                if (r.status === 204) {
-                                       stat.innerHTML = '<h4><%:Configuration has been rolled back!%></h4>' +
+                                       uci_status_message('warning',
+                                               '<h4><%:Configuration has been rolled back!%></h4>' +
                                                '<p><%:The device could not be reached within %d seconds after applying the pending changes, which caused the configuration to be rolled back for safety reasons. If you believe that the configuration changes are correct nonetheless, perform an unchecked configuration apply. Alternatively, you can dismiss this warning and edit changes before attempting to apply again, or revert all pending changes to keep the currently working configuration state.%></p>'.format(uci_apply_rollback) +
                                                '<div class="right">' +
-                                                       '<input type="button" class="btn" onclick="this.parentNode.parentNode.style.display=\'none\'" value="<%:Dismiss%>" /> ' +
+                                                       '<input type="button" class="btn" onclick="uci_status_message(false)" value="<%:Dismiss%>" /> ' +
                                                        '<input type="button" class="btn" onclick="uci_revert()" value="<%:Revert changes%>" /> ' +
                                                        '<input type="button" class="btn danger" onclick="uci_apply(false)" value="<%:Apply unchecked%>" />' +
-                                               '</div>';
+                                               '</div>');
 
                                        return;
                                }
                        call({ status: 0 });
                }
                else {
-                       stat.classList.remove('notice');
-                       stat.classList.add('warning');
-                       stat.innerHTML = '<h4><%:Device unreachable!%></h4>' +
-                               '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>';
+                       uci_status_message('warning',
+                               '<h4><%:Device unreachable!%></h4>' +
+                               '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>');
                }
        }
 
                var tt;
                var ts = Date.now();
 
-               stat = document.getElementById('cbi_apply_status');
-               stat.style.display = '';
-               stat.classList.remove('warning');
-               stat.classList.add('notice');
-
-               indicator = document.querySelector('.uci_change_indicator');
+               uci_status_message('notice');
 
                var call = function(r) {
                        if (Date.now() >= deadline) {
                                return;
                        }
                        else if (r && (r.status === 200 || r.status === 204)) {
-                               if (indicator)
-                                       indicator.style.display = 'none';
+                               var indicator = document.querySelector('.uci_change_indicator');
+                               if (indicator) indicator.style.display = 'none';
 
-                               stat.innerHTML = '<%:Configuration has been applied.%>';
+                               uci_status_message('notice', '<%:Configuration has been applied.%>');
 
                                window.clearTimeout(tt);
                                window.setTimeout(function() {
-                                       stat.style.display = 'none';
-                                       <% if redirect_ok then %>location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');<% end %>
+                                       <% if redirect_ok then -%>
+                                               location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
+                                       <%- else -%>
+                                               window.location = window.location.href.split('#')[0];
+                                       <% end %>
                                }, uci_apply_display * 1000);
 
                                return;
                var tick = function() {
                        var now = Date.now();
 
-                       stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                        '<%:Waiting for configuration to get applied… %ds%>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0));
+                       uci_status_message('notice',
+                               '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                               '<%:Waiting for configuration to get applied… %ds%>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0)));
 
                        if (now >= deadline)
                                return;
        }
 
        function uci_apply(checked) {
-               stat = document.getElementById('cbi_apply_status');
-               stat.style.display = '';
-               stat.classList.remove('warning');
-               stat.classList.add('notice');
-               stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                '<%:Starting configuration apply…%>';
+               uci_status_message('notice',
+                       '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                       '<%:Starting configuration apply…%>');
 
                xhr.post('<%=url("admin/uci")%>/' + (checked ? 'apply_rollback' : 'apply_unchecked'), uci_apply_auth, function(r) {
                        if (r.status === (checked ? 200 : 204)) {
                                uci_confirm(checked, Date.now() + uci_apply_rollback * 1000);
                        }
                        else if (checked && r.status === 204) {
-                               stat.innerHTML = '<%:There are no changes to apply.%>';
+                               uci_status_message('notice', '<%:There are no changes to apply.%>');
                                window.setTimeout(function() {
-                                       stat.style.display = 'none';
-                                       <% if redirect_ok then %>location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');<% end %>
+                                       <% if redirect_ok then -%>
+                                               location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
+                                       <%- else -%>
+                                               uci_status_message(false);
+                                       <%- end %>
                                }, uci_apply_display * 1000);
                        }
                        else {
-                               stat.classList.add('warning');
-                               stat.classList.remove('notice');
-                               stat.innerHTML = '<%_Apply request failed with status <code>%h</code>%>'.format(r.responseText || r.statusText || r.status);
+                               uci_status_message('warning', '<%_Apply request failed with status <code>%h</code>%>'.format(r.responseText || r.statusText || r.status));
+                               window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
                        }
                });
        }
 
        function uci_revert() {
-               stat = document.getElementById('cbi_apply_status');
-               stat.style.display = '';
-               stat.classList.remove('warning');
-               stat.classList.add('notice');
-               stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                '<%:Reverting configuration…%>';
+               uci_status_message('notice',
+                       '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                       '<%:Reverting configuration…%>');
 
                xhr.post('<%=url("admin/uci/revert")%>', uci_apply_auth, function(r) {
                        if (r.status === 200) {
-                               stat.innerHTML = '<%:Changes have been reverted.%>';
+                               uci_status_message('notice', '<%:Changes have been reverted.%>');
                                window.setTimeout(function() {
                                        <% if redirect_ok then -%>
                                                location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
                                }, uci_apply_display * 1000);
                        }
                        else {
-                               stat.classList.add('warning');
-                               stat.classList.remove('notice');
-                               stat.innerHTML = '<%_Revert request failed with status <code>%h</code>%>'.format(r.statusText || r.status);
+                               uci_status_message('warning', '<%_Revert request failed with status <code>%h</code>%>'.format(r.statusText || r.status));
+                               window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
                        }
                });
        }
index 30f8ddfda54deb427414d14a5ad2d72739a3f938..6ccba58f23d465cfc90bb489dd56844879b07290 100644 (file)
@@ -1,6 +1,6 @@
 <%+cbi/valueheader%>
        <% if self:cfgvalue(section) ~= false then %>
-               <input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> />
+               <input class="cbi-button cbi-button-<%=self.inputstyle or "button" %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> />
        <% else %>
                -
        <% end %>
index 786ee43d1089710d0c7825eef03af2c92cda8c76..bdd6bc968750c1773093477e2dc4e7ac7286f587 100644 (file)
@@ -1,2 +1,2 @@
 </div>
-</td>
+</div>
index 9c9c21814beb6a79bf4c0c7da730e73066be2fe5..dbb0e1120b83700ba030f9b13bd560caf0bdb5b2 100644 (file)
@@ -1,2 +1,10 @@
-<td class="cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %>">
+<%-
+       local title = luci.util.trim(striptags(self.title))
+       local ftype = self.template and self.template:gsub("^.+/", "")
+-%>
+<div class="td cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %>"<%=
+       attr("data-name", self.option) ..
+       ifattr(ftype and #ftype > 0, "data-type", ftype) ..
+       ifattr(title and #title > 0, "data-title", title)
+%>>
 <div id="cbi-<%=self.config.."-"..section.."-"..self.option%>" data-index="<%=self.index%>" data-depends="<%=pcdata(self:deplist2json(section))%>">
diff --git a/modules/luci-base/luasrc/view/cbi/dropdown.htm b/modules/luci-base/luasrc/view/cbi/dropdown.htm
new file mode 100644 (file)
index 0000000..cf8c03d
--- /dev/null
@@ -0,0 +1,54 @@
+<%+cbi/valueheader%>
+
+<%-
+       local selected = { }
+
+       if self.multiple then
+               local val
+               for val in luci.util.imatch(self:cfgvalue(section)) do
+                       selected[val] = true
+               end
+       else
+               selected[self:cfgvalue(section)] = true
+       end
+
+       if not next(selected) and self.default then
+               selected[self.default] = true
+       end
+-%>
+
+<div class="cbi-dropdown"<%=
+       attr("name", cbid) ..
+       attr("display-items", self.display or self.size or 3) ..
+       attr("dropdown-items", self.dropdown or self.display or self.size or 5) ..
+       attr("placeholder", self.placeholder or translate("-- please select --")) ..
+       ifattr(self.multiple, "multiple", "multiple") ..
+       ifattr(self.optional or self.rmempty, "optional", "optional")
+%>>
+       <ul>
+               <% local i, key; for i, key in pairs(self.keylist) do %>
+                       <li<%=
+                               attr("data-index", i) ..
+                               attr("data-depends", self:deplist2json(section, self.deplist[i])) ..
+                               attr("value", key) ..
+                               ifattr(selected[key], "selected", "selected")
+                       %>>
+                               <%=pcdata(self.vallist[i])%>
+                       </li>
+               <% end %>
+               <% if self.custom then %>
+                       <li>
+                               <input type="password" style="display:none" />
+                               <input class="create-item-input" type="text"<%=
+                                       attr("placeholder", self.custom ~= true and
+                                               self.custom or
+                                               (self.multiple and
+                                                       translate("Enter custom values") or
+                                                       translate("Enter custom value")))
+                               %> />
+                       </li>
+               <% end %>
+       </ul>
+</div>
+
+<%+cbi/valuefooter%>
index 546fd8e85a53c4edfaeefff9fb3c0f405ffb8a0c..b38e4b13dbd229a5267e44904260b3860fe87efe 100644 (file)
        local def  = fwm:get_defaults()
        local zone = fwm:get_zone(value)
        local empty = true
+
+       local function render_zone(zone)
+-%>
+               <label class="zonebadge" style="background-color:<%=zone:get_color()%>">
+                       <strong><%=zone:name()%></strong>
+                       <div class="cbi-tooltip">
+                       <%-
+                               local zempty = true
+                               for _, net in ipairs(zone:get_networks()) do
+                                       net = nwm:get_network(net)
+                                       if net then
+                                               zempty = false
+                       -%>
+                               <span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:&#160;
+                               <%
+                                       local nempty = true
+                                       for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
+                                               nempty = false
+                                %>
+                                       <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+                               <% end %>
+                               <% if nempty then %><em><%:(empty)%></em><% end %>
+                               </span>
+                       <%- end end -%>
+                       <% if zempty then %><span class="ifacebadge"><em><%:(empty)%></em></span><% end %>
+                       </div>
+               </label>
+<%-
+       end
 -%>
 
 <% if zone then %>
-<div style="white-space:nowrap">
-       <label class="zonebadge" style="background-color:<%=zone:get_color()%>">
-               <strong><%=zone:name()%>:</strong>
-               <%-
-                       local zempty = true
-                       for _, net in ipairs(zone:get_networks()) do
-                               net = nwm:get_network(net)
-                               if net then
-                                       zempty = false
-               -%>
-                       <span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:
-                       <%
-                               local nempty = true
-                               for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
-                                       nempty = false
-                        %>
-                               <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
-                       <% end %>
-                       <% if nempty then %><em><%:(empty)%></em><% end %>
-                       </span>
-               <%- end end -%>
-               <%- if zempty then %><em><%:(empty)%></em><% end -%>
-       </label>
-       &#160;&#8658;&#160;
-       <% for _, fwd in ipairs(zone:get_forwardings_by("src")) do
-               fz = fwd:dest_zone()
-               if fz then
-                       empty = false %>
-               <label class="zonebadge" style="background-color:<%=fz:get_color()%>">
-                       <strong><%=fz:name()%></strong>
-               </label>&#160;
-       <% end end %>
-       <% if empty then %>
+<div class="zone-forwards">
+       <div class="zone-src">
+               <%=render_zone(zone)%>
+       </div>
+       <span>&#8658;</span>
+       <div class="zone-dest">
+       <%
+               for _, fwd in ipairs(zone:get_forwardings_by("src")) do
+                       fz = fwd:dest_zone()
+                       if fz then
+                               empty = false
+                               render_zone(fz)
+                       end
+               end
+               if empty then
+       %>
                <label class="zonebadge zonebadge-empty">
                        <strong><%=zone:forward():upper()%></strong>
                </label>
        <% end %>
+       </div>
 </div>
 <% end %>
 
index b4260707ef1293326139e67b090aa9ce014967f6..3a108020b6062907cbcaddc2f10ae21ef80e5bde 100644 (file)
        end
 -%>
 
-<span>
-       <ul style="margin:0; list-style-type:none; text-align:left">
+<div class="cbi-dropdown" dropdown-items="5" placeholder="<%:-- please select -- %>"<%=
+       attr("name", cbid) ..
+       ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+       ifattr(self.rmempty or self.optional, "optional", "optional")
+%>>
+       <script type="item-template"><!--
+               <li value="{{value}}">
+                       <span class="zonebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">
+                               <strong>{{value}}:</strong><em>(<%:create%>)</em>
+                       </span>
+               </li>
+       --></script>
+       <ul>
                <% if self.allowlocal then %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_empty") .. attr("name", cbid) .. attr("value", "") .. ifattr(checked[""], "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "_empty")%>></label>
-                       <label<%=attr("for", cbid .. "_empty")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
+               <li value=""<%=ifattr(checked[""], "selected", "selected")%>>
+                       <span style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
                                <strong><%:Device%></strong>
-                               <% if self.allowany and self.allowlocal then %>(<%:input%>)<% end %>
-                       </label>
+                               <% if self.allowany and self.allowlocal then -%>
+                                       (<%= self.alias ~= "dest"
+                                               and translate("output") or translate("input") %>)
+                               <%- end %>
+                       </span>
+               </li>
+               <% elseif self.widget ~= "checkbox" and (self.rmempty or self.optional) then %>
+               <li value=""<%=ifattr(checked[""], "selected", "selected")%>>
+                       <span class="zonebadge">
+                               <em><%:unspecified%></em>
+                       </span>
                </li>
                <% end %>
                <% if self.allowany then %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_any") .. attr("name", cbid) .. attr("value", "*") .. ifattr(checked["*"], "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "_any")%>></label>
-                       <label<%=attr("for", cbid .. "_any")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
+               <li value="*"<%=ifattr(checked["*"], "selected", "selected")%>>
+                       <span style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
                                <strong><%:Any zone%></strong>
                                <% if self.allowany and self.allowlocal then %>(<%:forward%>)<% end %>
-                       </label>
+                       </span>
                </li>
                <% end %>
                <%
                                if zone:name() ~= self.exclude then
                                        selected = selected or (value == zone:name())
                %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "." .. zone:name()) .. attr("name", cbid) .. attr("value", zone:name()) .. ifattr(checked[zone:name()], "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "." .. zone:name())%>></label>
-                       <label<%=attr("for", cbid .. "." .. zone:name())%> style="background-color:<%=zone:get_color()%>" class="zonebadge">
+               <li<%=attr("value", zone:name()) .. ifattr(checked[zone:name()], "selected", "selected")%>>
+                       <span style="background-color:<%=zone:get_color()%>" class="zonebadge">
                                <strong><%=zone:name()%>:</strong>
-                               <%
+                               <%-
                                        local zempty = true
                                        for _, net in ipairs(zone:get_networks()) do
                                                net = nwm:get_network(net)
                                                if net then
                                                        zempty = false
-                               %>
+                               -%>
                                        <span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:
-                                       <%
+                                       <%-
                                                local nempty = true
                                                for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
                                                        nempty = false
                                        %>
-                                               <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+                                               <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
                                        <% end %>
-                                       <% if nempty then %><em><%:(empty)%></em><% end %>
+                                       <% if nempty then %><em><%:(empty)%></em><% end -%>
                                        </span>
-                               <% end end %>
-                               <% if zempty then %><em><%:(empty)%></em><% end %>
-                       </label>
+                               <%- end end -%>
+                               <%- if zempty then %><em><%:(empty)%></em><% end -%>
+                       </span>
                </li>
                <% end end %>
 
                <% if self.widget ~= "checkbox" and not self.nocreate then %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change" type="radio"<%=attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not selected, "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "_new")%>></label>
-                       <div onclick="document.getElementById('<%=cbid%>_new').checked=true" class="zonebadge" style="background-color:<%=fwm.zone.get_color()%>">
-                               <em><%:unspecified -or- create:%>&#160;</em>
-                               <input type="text"<%=attr("name", cbid .. ".newzone") .. ifattr(not selected, "value", luci.http.formvalue(cbid .. ".newzone") or self.default)%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
-                       </div>
+               <li value="-">
+                       <span class="zonebadge">
+                               <em><%:create%>:</em>
+                               <input type="password" style="display:none" />
+                               <input class="create-item-input" type="text" />
+                       </span>
                </li>
                <% end %>
        </ul>
-</span>
+</div>
 
 <%+cbi/valuefooter%>
index e6acfb0697c043df477c50dcb95239dbf34beff8..5f939b646975b5cbf3cd6df43fbfced9cbbd3a0d 100644 (file)
@@ -1,9 +1,7 @@
        <%- if pageaction then -%>
        <div class="cbi-page-actions">
                <% if redirect and not flow.hidebackbtn then %>
-               <div style="float:left">
                        <input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
-               </div>
                <% end %>
 
                <% if flow.skip then %>
index f7809367665d9b57a9935f7f94bd38edd16d700a..d4ad093efa303795115ed9b1224b1bcedf543667 100644 (file)
@@ -3,7 +3,6 @@
                                <br />
                        <%- end %>
                        <div class="cbi-value-description">
-                               <span class="cbi-value-helpicon"><img src="<%=resource%>/cbi/help.gif" alt="<%:help%>" /></span>
                                <%=self.description%>
                        </div>
                <%- end %>
index 69ef3615a28665925cd84946e86da6ec140fd488..83c3cb2170adaf8330bcf0b8bde86a0a5d43ab8c 100644 (file)
@@ -1,5 +1,5 @@
 <%- if firstmap and messages then local msg; for _, msg in ipairs(messages) do -%>
-       <div class="errorbox"><%=pcdata(msg)%></div>
+       <div class="alert-message warning"><%=pcdata(msg)%></div>
 <%- end end -%>
 
 <div class="cbi-map" id="cbi-<%=self.config%>">
@@ -31,7 +31,6 @@
                                </li>
                        <% end %>
                </ul>
-               <br />
                <% for i, section in ipairs(self.children) do %>
                        <div class="cbi-tabcontainer" id="container.m-<%=self.config%>.<%=section.section or section.sectiontype%>"<% if section.sectiontype ~= self.selected_tab then %> style="display:none"<% end %>>
                                <% section:render() %>
@@ -53,6 +52,4 @@
        <% else %>
                <%- self:render_children() %>
        <% end %>
-
-       <br />
 </div>
index 62dbde7dd4fd863116f08ff5a9547f44f216fce2..abfa33e1edca600a7918db83f96427fe3c43edef 100644 (file)
@@ -19,7 +19,9 @@
 
        if value then
                for value in utl.imatch(value) do
-                       checked[value] = true
+                       for value in utl.imatch(value) do
+                               checked[value] = true
+                       end
                end
        else
                local n = self.network and net:get_network(self.network)
 -%>
 
 <input type="hidden" name="<%=cbeid%>" value="1" />
-<ul style="margin:0; list-style-type:none">
-       <% for _, iface in ipairs(ifaces) do
-            local link = iface:adminlink()
-         if (not self.nobridges  or not iface:is_bridge()) and
-                   (not self.noinactive or iface:is_up()) and
-                   iface:name() ~= self.exclude
-                then %>
-       <li>
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "." .. iface:name()) ..
-                       attr("name", cbid) .. attr("value", iface:name()) ..
-                       ifattr(checked[iface:name()], "checked", "checked")
-               %> />
-               <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
-                       <label<%=attr("for", cbid .. "." .. iface:name())%>></label>
-               <%- end -%>
-               &#160;
-               <label<%=attr("for", cbid .. "." .. iface:name())%>>
-                       <% if link then -%><a href="<%=link%>"><% end -%>
-                       <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
-                       <% if link then -%></a><% end -%>
-                       <%=pcdata(iface:get_i18n())%>
-                       <% local ns = iface:get_networks(); if #ns > 0 then %>(
-                               <%- local i, n; for i, n in ipairs(ns) do -%>
-                                       <%-= (i>1) and ', ' -%>
-                                       <a href="<%=n:adminlink()%>"><%=n:name()%></a>
-                               <%- end -%>
-                       )<% end %>
-               </label>
-       </li>
-       <% end end %>
-       <% if not self.nocreate then %>
-       <li>
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "_custom") ..
-                       attr("name", cbid) ..
-                       attr("value", " ")
-               %> />
-               <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
-                       <label<%=attr("for", cbid .. "_custom")%>></label>
-               <%- end -%>
-               &#160;
-               <label<%=attr("for", cbid .. "_custom")%>>
-                       <img title="<%:Custom Interface%>" style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/ethernet_disabled.png" />
-                       <%:Custom Interface%>:
-               </label>
-               <input type="text" style="width:50px" onfocus="document.getElementById('<%=cbid%>_custom').checked=true" onblur="var x=document.getElementById('<%=cbid%>_custom'); x.value=this.value; x.checked=true" />
-       </li>
-       <% end %>
-</ul>
+
+<div class="cbi-dropdown" display-items="5" placeholder="<%:-- please select -- %>"<%=
+       attr("name", cbid) ..
+       ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+       ifattr(self.widget == "checkbox", "optional", "optional")
+%>>
+       <script type="item-template"><!--
+               <li value="{{value}}">
+                       <img title="<%:Custom Interface%>: &quot;{{value}}&quot;" src="<%=resource%>/icons/ethernet_disabled.png" />
+                       <span class="hide-open">{{value}}</span>
+                       <span class="hide-close"><%:Custom Interface%>: "{{value}}"</span>
+               </li>
+       --></script>
+       <ul>
+               <% for _, iface in ipairs(ifaces) do
+                       if (not self.nobridges  or not iface:is_bridge()) and
+                          (not self.noinactive or iface:is_up()) and
+                          iface:name() ~= self.exclude
+                       then %>
+               <li<%=
+                       attr("value", iface:name()) ..
+                       ifattr(checked[iface:name()], "selected", "selected")
+               %>>
+                       <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+                       <span class="hide-open"><%=pcdata(iface:name())%></span>
+                       <span class="hide-close">
+                               <%=pcdata(iface:get_i18n())%>
+                               <% local ns = iface:get_networks(); if #ns > 0 then %>(
+                                       <%- local i, n; for i, n in ipairs(ns) do -%>
+                                               <%-= (i>1) and ', ' -%>
+                                               <a href="<%=n:adminlink()%>"><%=n:name()%></a>
+                                       <%- end -%>
+                               )<% end %>
+                       </span>
+               </li>
+               <% end end %>
+               <% if not self.nocreate then %>
+               <li value="">
+                       <img title="<%:Custom Interface%>" src="<%=resource%>/icons/ethernet_disabled.png" />
+                       <span><%:Custom Interface%>:</span>
+                       <input type="password" style="display:none" />
+                       <input class="create-item-input" type="text" />
+               </li>
+               <% end %>
+       </ul>
+</div>
 
 <%+cbi/valuefooter%>
index 8bf1a70a2058e99ab22cbe789ab0e08b94524434..ba6ebb843456f5e40dffad2139f806cca09feb8f 100644 (file)
        end
 -%>
 
-<ul style="margin:0; list-style-type:none; text-align:left">
-       <% for _, net in ipairs(networks) do
-              if (net:name() ~= "loopback") and
-                     (net:name() ~= self.exclude) and
-                     (not self.novirtual or not net:is_virtual())
-                  then %>
-       <li style="padding:0.25em 0">
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "." .. net:name()) ..
-                       attr("name", cbid) .. attr("value", net:name()) ..
-                       ifattr(checked[net:name()], "checked", "checked")
-               %> /> &#160;
-               <label<%=attr("for", cbid .. "." .. net:name())%>>
+<div class="cbi-dropdown" display-items="5" placeholder="<%:-- please select -- %>"<%=
+       attr("name", cbid) ..
+       ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+       ifattr(self.widget == "checkbox", "optional", "optional")
+%>>
+       <script type="item-template"><!--
+               <li value="{{value}}">
+                       <span class="ifacebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">
+                               {{value}}: <em>(<%:create%>)</em>
+                       </span>
+               </li>
+       --></script>
+       <ul>
+               <% if self.widget ~= "checkbox" then %>
+               <li value=""<%= ifattr(not value, "selected", "selected") %>>
+                       <em><%:unspecified%></em>
+               </li>
+               <% end %>
+
+               <% for _, net in ipairs(networks) do
+                      if (net:name() ~= "loopback") and
+                             (net:name() ~= self.exclude) and
+                             (not self.novirtual or not net:is_virtual())
+                          then %>
+               <li<%= attr("value", net:name()) .. ifattr(checked[net:name()], "selected", "selected") %>>
                        <span class="ifacebadge"><%=net:name()%>:
                                <%
                                        local empty = true
                                        for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
                                                if not iface:is_bridge() then
                                                        empty = false
-                                %>
+                               -%>
                                        <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
-                               <% end end %>
-                               <% if empty then %><em><%:(no interfaces attached)%></em><% end %>
+                               <%- end end %>
+                               <% if empty then %>
+                                       <em class="hide-close"><%:(no interfaces attached)%></em>
+                                       <em class="hide-open">-</em>
+                               <% end %>
                        </span>
-               </label>
-       </li>
-       <% end end %>
+               </li>
+               <% end end %>
 
-       <% if not self.nocreate then %>
-       <li style="padding:0.25em 0">
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not value and self.widget ~= "checkbox", "checked", "checked")%> /> &#160;
-               <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
-                       <label<%=attr("for", cbid .. "_new")%>></label>
-               <%- end -%>
-               <div style="padding:0.5em; display:inline">
-                       <label<%=attr("for", cbid .. "_new")%>><em>
+               <% if not self.nocreate then %>
+               <li value="-"<%= ifattr(not value and self.widget ~= "checkbox", "selected", "selected") %>>
+                       <em>
                                <%- if self.widget == "checkbox" then -%>
                                        <%:create:%>
                                <%- else -%>
                                        <%:unspecified -or- create:%>
-                               <%- end -%>&#160;</em></label>
+                               <%- end -%>
+                       </em>
                        <input style="display:none" type="password" />
-                       <input style="width:6em" type="text"<%=attr("name", cbid .. ".newnet")%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
-               </div>
-       </li>
-       <% elseif self.widget ~= "checkbox" and self.unspecified then %>
-       <li style="padding:0.25em 0">
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "_uns") ..
-                       attr("name", cbid) ..
-                       attr("value", "") ..
-                       ifattr(not value or #value == 0, "checked", "checked")
-               %> /> &#160;
-               <div style="padding:0.5em; display:inline">
-                       <label<%=attr("for", cbid .. "_uns")%>><em><%:unspecified%></em></label>
-               </div>
-       </li>
-       <% end %>
-</ul>
+                       <input class="create-item-input" type="text" />
+               </li>
+               <% end %>
+       </ul>
+</div>
 
 <%+cbi/valuefooter%>
index abf67596f01c8434bb7a2c0bf3ce391b9d3bdc88..63abc577342687645f9630c2934541ee3ef34816 100644 (file)
@@ -1,5 +1,5 @@
 <% if self:cfgvalue(self.section) then section = self.section %>
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <% if self.title and #self.title > 0 then -%>
                        <legend><%=self.title%></legend>
                <%- end %>
                <div class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
                        <%+cbi/ucisection%>
                </div>
-               <br />
-       </fieldset>
+       </div>
 <% elseif self.addremove then %>
        <% if self.template_addremove then include(self.template_addremove) else -%>
-       <fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.section%>">
+       <div class="cbi-section" id="cbi-<%=self.config%>-<%=self.section%>">
                <% if self.title and #self.title > 0 then -%>
                        <legend><%=self.title%></legend>
                <%- end %>
                <div class="cbi-section-descr"><%=self.description%></div>
                <input type="submit" class="cbi-button cbi-button-add" name="cbi.cns.<%=self.config%>.<%=self.section%>" value="<%:Add%>" />
-       </fieldset>
+       </div>
        <%- end %>
 <% end %>
 <!-- /nsection -->
index ef169593afac785d2617a825dddb180bb465ecd1..7230719d19b3c591489ae1b1dc6a40fbdacf8b9c 100644 (file)
@@ -1,4 +1,4 @@
-<fieldset class="cbi-section">
+<div class="cbi-section">
        <% if self.title and #self.title > 0 then -%>
                <legend><%=self.title%></legend>
        <%- end %>
@@ -25,8 +25,7 @@
                        </div>
                <%- end %>
        </div>
-       <br />
-</fieldset>
+</div>
 <%-
        if type(self.hidden) == "table" then
                for k, v in pairs(self.hidden) do
index 3b758d70ee487997814d9e6d4f1288a50fe32d4c..c6000d22b344c3cb98d577fd780c63750cb6bc4a 100644 (file)
@@ -10,7 +10,6 @@
                <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
                <% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
                <% self:render_children() %>
-               <br />
        </div>
 <%- if self.message then %>
        <div><%=self.message%></div>
        end
 %>
 <% if redirect then %>
-       <div style="float:left">
-               <input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
-       </div>
+       <input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
+<% end %>
+<%- if self.cancel ~= false and self.on_cancel then %>
+       <input class="cbi-button cbi-button-link" type="submit" name="cbi.cancel" value="
+               <%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
+       " />
 <% end %>
 <%- if self.flow and self.flow.skip then %>
        <input class="cbi-button cbi-button-skip" type="submit" name="cbi.skip" value="<%:Skip%>" />
        <input class="cbi-button cbi-button-reset" type="reset" value="
                <%- if not self.reset then -%><%-:Reset-%><%-else-%><%=self.reset%><%end-%>
        " />
-<% end %>
-<%- if self.cancel ~= false and self.on_cancel then %>
-       <input class="cbi-button cbi-button-reset" type="submit" name="cbi.cancel" value="
-               <%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
-       " />
 <% end %>
        </div>
 </form>
index 3cb87563f130bb3c4d6a34b1b2274a53529458da..ab13922040ea93bf5392af595e829379bc283173 100644 (file)
@@ -14,10 +14,14 @@ function width(o)
        end
        return ''
 end
+
+local anonclass = (not self.anonymous or self.sectiontitle) and "named" or "anonymous"
+local titlename = ifattr(not self.anonymous or self.sectiontitle, "data-title", translate("Name"))
+
 -%>
 
 <!-- tblsection -->
-<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
+<div class="cbi-section cbi-tblsection" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
        <% if self.title and #self.title > 0 then -%>
                <legend><%=self.title%></legend>
        <%- end %>
@@ -25,121 +29,107 @@ end
                <input type="hidden" id="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" name="cbi.sts.<%=self.config%>.<%=self.sectiontype%>" value="" />
        <%- end -%>
        <div class="cbi-section-descr"><%=self.description%></div>
-       <div class="cbi-section-node">
-               <%- local count = 0 -%>
-               <table class="cbi-section-table">
-                       <tr class="cbi-section-table-titles">
-                       <%- if not self.anonymous then -%>
-                               <%- if self.sectionhead then -%>
-                                       <th class="cbi-section-table-cell"><%=self.sectionhead%></th>
-                               <%- else -%>
-                                       <th>&#160;</th>
-                               <%- end -%>
-                       <%- count = count +1; end -%>
-                       <%- for i, k in pairs(self.children) do if not k.optional then -%>
-                               <th class="cbi-section-table-cell"<%=width(k)%>>
-                               <%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
-                                       <%-=k.title-%>
-                               <%- if k.titleref then -%></a><%- end -%>
-                               </th>
-                       <%- count = count + 1; end; end; if self.sortable then -%>
-                               <th class="cbi-section-table-cell"><%:Sort%></th>
-                       <%- count = count + 1; end; if self.extedit or self.addremove then -%>
-                               <th class="cbi-section-table-cell">&#160;</th>
-                       <%- count = count + 1; end -%>
-                       </tr>
-                       <tr class="cbi-section-table-descr">
-                       <%- if not self.anonymous then -%>
-                               <%- if self.sectiondesc then -%>
-                                       <th class="cbi-section-table-cell"><%=self.sectiondesc%></th>
-                               <%- else -%>
-                                       <th></th>
-                               <%- end -%>
-                       <%- end -%>
-                       <%- for i, k in pairs(self.children) do if not k.optional then -%>
-                               <th class="cbi-section-table-cell"<%=width(k)%>><%=k.description%></th>
-                       <%- end; end; if self.sortable then -%>
-                               <th class="cbi-section-table-cell"></th>
-                       <%- end; if self.extedit or self.addremove then -%>
-                               <th class="cbi-section-table-cell"></th>
-                       <%- end -%>
-                       </tr>
-                       <%- local isempty = true
-                           for i, k in ipairs(self:cfgsections()) do
-                                       section = k
-                                       isempty = false
-                                       scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
-                       -%>
-                       <tr class="cbi-section-table-row<% if self.extedit or self.rowcolors then %> cbi-rowstyle-<%=rowstyle()%><% end %>" id="cbi-<%=self.config%>-<%=section%>">
-                               <% if not self.anonymous then -%>
-                                       <th><h3><%=(type(self.sectiontitle) == "function") and self:sectiontitle(section) or k%></h3></th>
-                               <%- end %>
-
+       <%- local count = 0 -%>
+       <div class="table cbi-section-table">
+               <div class="tr cbi-section-table-titles <%=anonclass%>"<%=titlename%>>
+               <%- for i, k in pairs(self.children) do if not k.optional then -%>
+                       <div class="th cbi-section-table-cell"<%=
+                               width(k) ..
+                               attr("data-type", k.template and k.template:gsub("^.+/", "") or "")
+                       %>>
+                       <%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
+                               <%-=k.title-%>
+                       <%- if k.titleref then -%></a><%- end -%>
+                       </div>
+               <%- count = count + 1; end; end; if self.sortable or self.extedit or self.addremove then -%>
+                       <div class="th cbi-section-table-cell cbi-section-actions"></div>
+               <%- count = count + 1; end -%>
+               </div>
+               <div class="tr cbi-section-table-descr <%=anonclass%>">
+               <%- for i, k in pairs(self.children) do if not k.optional then -%>
+                       <div class="th cbi-section-table-cell"<%=
+                       width(k) ..
+                       attr("data-type", k.template and k.template:gsub("^.+/", "") or "")
+               %>><%=k.description%></div>
+               <%- end; end; if self.sortable or self.extedit or self.addremove then -%>
+                       <div class="th cbi-section-table-cell cbi-section-actions"></div>
+               <%- end -%>
+               </div>
+               <%- local isempty, i, k = true, nil, nil
+                   for i, k in ipairs(self:cfgsections()) do
+                               isempty = false
 
-                               <%-
-                                       for k, node in ipairs(self.children) do
-                                               if not node.optional then
-                                                       node:render(section, scope or {})
-                                               end
+                               local section = k
+                               local sectionname = striptags((type(self.sectiontitle) == "function") and self:sectiontitle(section) or k)
+                               local sectiontitle = ifattr(sectionname and (not self.anonymous or self.sectiontitle), "data-title", sectionname)
+                               local colorclass = (self.extedit or self.rowcolors) and " cbi-rowstyle-%d" % rowstyle() or ""
+                               local scope = {
+                                       valueheader = "cbi/cell_valueheader",
+                                       valuefooter = "cbi/cell_valuefooter"
+                               }
+               -%>
+               <div class="tr cbi-section-table-row<%=colorclass%>" id="cbi-<%=self.config%>-<%=section%>"<%=sectiontitle%>>
+                       <%-
+                               local node
+                               for k, node in ipairs(self.children) do
+                                       if not node.optional then
+                                               node:render(section, scope or {})
                                        end
-                               -%>
-
-                               <%- if self.sortable then -%>
-                                       <td class="cbi-section-table-cell">
-                                               <input class="cbi-button cbi-button-up" type="button" value=""  onclick="return cbi_row_swap(this, true, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move up%>" title="<%:Move up%>" />
-                                               <input class="cbi-button cbi-button-down" type="button" value=""  onclick="return cbi_row_swap(this, false, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" alt="<%:Move down%>" title="<%:Move down%>" />
-                                       </td>
-                               <%- end -%>
-
-                               <%- if self.extedit or self.addremove then -%>
-                                       <td class="cbi-section-table-cell">
-                                               <%- if self.extedit then -%>
-                                                       <input class="cbi-button cbi-button-edit" type="button" value="<%:Edit%>"
-                                                       <%- if type(self.extedit) == "string" then
-                                                       %> onclick="location.href='<%=self.extedit:format(section)%>'"
-                                                       <%- elseif type(self.extedit) == "function" then
-                                                       %> onclick="location.href='<%=self:extedit(section)%>'"
-                                                       <%- end
-                                                       %> alt="<%:Edit%>" title="<%:Edit%>" />
-                                               <%- end; if self.addremove then %>
-                                                       <input class="cbi-button cbi-button-remove" type="submit" value="<%:Delete%>"  onclick="this.form.cbi_state='del-section'; return true" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" />
-                                               <%- end -%>
-                                       </td>
-                               <%- end -%>
-                       </tr>
-                       <%- end -%>
+                               end
+                       -%>
 
-                       <%- if isempty then -%>
-                       <tr class="cbi-section-table-row">
-                               <td colspan="<%=count%>"><em><br /><%:This section contains no values yet%></em></td>
-                       </tr>
+                       <%- if self.sortable or self.extedit or self.addremove then -%>
+                               <div class="td cbi-section-table-cell nowrap cbi-section-actions">
+                                       <%- if self.sortable then -%>
+                                               <input class="cbi-button cbi-button-up" type="button" value="<%:Up%>" onclick="return cbi_row_swap(this, true, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" title="<%:Move up%>" />
+                                               <input class="cbi-button cbi-button-down" type="button" value="<%:Down%>" onclick="return cbi_row_swap(this, false, 'cbi.sts.<%=self.config%>.<%=self.sectiontype%>')" title="<%:Move down%>" />
+                                       <% end; if self.extedit then -%>
+                                               <input class="cbi-button cbi-button-edit" type="button" value="<%:Edit%>"
+                                               <%- if type(self.extedit) == "string" then
+                                               %> onclick="location.href='<%=self.extedit:format(section)%>'"
+                                               <%- elseif type(self.extedit) == "function" then
+                                               %> onclick="location.href='<%=self:extedit(section)%>'"
+                                               <%- end
+                                               %> alt="<%:Edit%>" title="<%:Edit%>" />
+                                       <% end; if self.addremove then %>
+                                               <input class="cbi-button cbi-button-remove" type="submit" value="<%:Delete%>"  onclick="this.form.cbi_state='del-section'; return true" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" />
+                                       <%- end -%>
+                               </div>
                        <%- end -%>
-               </table>
-
-               <% if self.error then %>
-                       <div class="cbi-section-error">
-                               <ul><% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%>
-                                       <li><%=pcdata(e):gsub("\n","<br />")%></li>
-                               <%- end end %></ul>
-                       </div>
-               <% end %>
+               </div>
+               <%- end -%>
 
-               <%- if self.addremove then -%>
-                       <% if self.template_addremove then include(self.template_addremove) else -%>
-                       <div class="cbi-section-create cbi-tblsection-create">
-                               <% if self.anonymous then %>
-                                       <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" title="<%:Add%>" />
-                               <% else %>
-                                       <% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
-                                       <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" data-type="uciname" data-optional="true" />
-                                       <input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
-                                       <% if self.invalid_cts then -%>
-                                               <br /><%:Invalid%></div>
-                                       <%- end %>
-                               <% end %>
-                       </div>
-                       <%- end %>
+               <%- if isempty then -%>
+               <div class="tr cbi-section-table-row placeholder">
+                       <div class="td"><em><%:This section contains no values yet%></em></div>
+               </div>
                <%- end -%>
        </div>
-</fieldset>
+
+       <% if self.error then %>
+               <div class="cbi-section-error">
+                       <ul><% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%>
+                               <li><%=pcdata(e):gsub("\n","<br />")%></li>
+                       <%- end end %></ul>
+               </div>
+       <% end %>
+
+       <%- if self.addremove then -%>
+               <% if self.template_addremove then include(self.template_addremove) else -%>
+               <div class="cbi-section-create cbi-tblsection-create">
+                       <% if self.anonymous then %>
+                               <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" title="<%:Add%>" />
+                       <% else %>
+                               <% if self.invalid_cts then -%>
+                                       <div class="cbi-section-error"><%:Invalid%></div>
+                               <%- end %>
+                               <div>
+                                       <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." data-type="uciname" data-optional="true" />
+                               </div>
+                               <input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
+                       <% end %>
+               </div>
+               <%- end %>
+       <%- end -%>
+</div>
 <!-- /tblsection -->
index 726521ae3f97193cd0c244eed1b07ef299e525ab..1a13df0c0402f88521818ab6589dc7faaeae4792 100644 (file)
@@ -1,4 +1,4 @@
-<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
+<div class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
        <% if self.title and #self.title > 0 then -%>
                <legend><%=self.title%></legend>
        <%- end %>
 
                <%+cbi/tabmenu%>
 
-               <fieldset class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
+               <div class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
                        <%+cbi/ucisection%>
-               </fieldset>
-               <br />
+               </div>
        <%- end %>
 
        <% if isempty then -%>
                        <% if self.anonymous then -%>
                                <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
                        <%- else -%>
-                               <% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
-                               <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" data-type="uciname" data-optional="true" />
-                               <input type="submit" class="cbi-button cbi-button-add" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" />
                                <% if self.invalid_cts then -%>
-                                       <br /><%:Invalid%></div>
+                                       <div class="cbi-section-error"><%:Invalid%></div>
                                <%- end %>
+                               <div>
+                                       <input type="text" class="cbi-section-create-name" id="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>." data-type="uciname" data-optional="true" />
+                               </div>
+                               <input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" value="<%:Add%>" title="<%:Add%>" />
                        <%- end %>
                </div>
                <%- end %>
        <%- end %>
-</fieldset>
+</div>
index 4fb5201aacf3272a9fdca61b8a43e59e3a874227..3c3d82b653885079b4755d06f3f2d37ae52a4784 100644 (file)
@@ -8,7 +8,7 @@
                <%:Uploaded File%> (<%=t.byte_format(s.size)%>)
                 <% if self.unsafeupload then %>
                    <input type="hidden"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
-                   <input class="cbi-button cbi-input-image" type="image" value="<%:Replace entry%>" name="cbi.rlf.<%=section .. "." .. self.option%>" alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" />
+                   <input class="cbi-button cbi-button-image" type="image" value="<%:Replace entry%>" name="cbi.rlf.<%=section .. "." .. self.option%>" alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" />
                 <% end %>
        <% end %>
 
index b3ec9b761705e2fe1c8fca5237362b3d152e1497..9b0e2de780b1cd8881ed83db77b4b30f7161765e 100644 (file)
@@ -8,7 +8,9 @@
 
 <form method="post" action="<%=pcdata(FULL_REQUEST_URI)%>">
        <%- if fuser then %>
-       <div class="errorbox"><%:Invalid username and/or password! Please try again.%></div>
+               <div class="alert-message warning">
+                       <p><%:Invalid username and/or password! Please try again.%></p>
+               </div>
        <% end -%>
 
        <div class="cbi-map">
                <div class="cbi-map-descr">
                        <%:Please enter your username and password.%>
                </div>
-               <fieldset class="cbi-section"><fieldset class="cbi-section-node">
+               <div class="cbi-section"><div class="cbi-section-node">
                        <div class="cbi-value">
                                <label class="cbi-value-title"><%:Username%></label>
                                <div class="cbi-value-field">
-                                       <input class="cbi-input-user" type="text" name="luci_username" value="<%=duser%>" />
+                                       <input class="cbi-input-text" type="text" name="luci_username" value="<%=duser%>" />
                                </div>
                        </div>
                        <div class="cbi-value cbi-value-last">
                                <label class="cbi-value-title"><%:Password%></label>
                                <div class="cbi-value-field">
-                                       <input class="cbi-input-password" type="password" name="luci_password" />
+                                       <input class="cbi-input-text" type="password" name="luci_password" />
                                </div>
                        </div>
-               </fieldset></fieldset>
+               </div></div>
        </div>
 
-       <div>
+       <div class="cbi-page-actions">
                <input type="submit" value="<%:Login%>" class="cbi-button cbi-button-apply" />
                <input type="reset" value="<%:Reset%>" class="cbi-button cbi-button-reset" />
        </div>
index b08344b404cd6fee2ab92897e96bf8f7388c543e..32cee9f50c3aac43da684fd8454de0fa8e675b26 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Càrrega d'1 minut:"
 
@@ -174,9 +177,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -213,9 +213,6 @@ msgstr "Número de dispositiu ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Concentrador d'accés"
 
@@ -323,11 +320,6 @@ msgstr "Permet respostes del rang 127.0.0.0/8, p.e. per serveis RBL"
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -406,11 +398,14 @@ msgstr "Configuració d'antena"
 msgid "Any zone"
 msgstr "Qualsevol zona"
 
-msgid "Apply"
-msgstr "Aplica"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Aplicant els canvis"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -426,6 +421,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estacions associades"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -517,9 +515,6 @@ msgstr "Adreça mal especificada!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -593,12 +588,20 @@ msgstr "Canvis"
 msgid "Changes applied."
 msgstr "Canvis aplicats."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Canvia la paraula clau de l'administrador per accedir al dispositiu"
 
 msgid "Channel"
 msgstr "Canal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Comprovació"
 
@@ -678,12 +681,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configuració"
 
-msgid "Configuration applied."
-msgstr "S'ha aplicat la configuració."
-
 msgid "Configuration files will be kept."
 msgstr "Es mantindran els fitxers de configuració."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmació"
 
@@ -696,12 +702,15 @@ msgstr "Connectat"
 msgid "Connection Limit"
 msgstr "Límit de connexió"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Connexions"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "País"
 
@@ -830,9 +839,6 @@ msgstr "Passarel·la per defecte"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Estat per defecte"
 
@@ -872,6 +878,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnòstics"
 
@@ -906,6 +915,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Descarta les respostes RFC1918 des de dalt"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Mostrant només els paquets que contenen"
 
@@ -1160,6 +1172,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fitxer"
 
@@ -1281,7 +1296,7 @@ msgstr "Espai lliure"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1355,9 +1370,6 @@ msgstr "Penja"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1418,8 +1430,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Tallafocs IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estat WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Adreça IPv4"
@@ -1469,15 +1481,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Estat WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Adreça IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2056,9 +2065,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Candidats de servidor NTP"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nom"
 
@@ -2182,6 +2188,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2233,12 +2242,6 @@ msgstr "Opció treta"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2590,12 +2593,12 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2603,12 +2606,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2699,9 +2702,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2760,6 +2760,15 @@ msgstr "Mostra/amaga la contrasenya"
 msgid "Revert"
 msgstr "Reverteix"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Arrel"
 
@@ -2775,9 +2784,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2803,14 +2809,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2838,9 +2836,6 @@ msgstr "Desa"
 msgid "Save & Apply"
 msgstr "Desa i aplica"
 
-msgid "Save &#38; Apply"
-msgstr "Desa i aplica"
-
 msgid "Scan"
 msgstr "Escaneja"
 
@@ -2867,17 +2862,6 @@ msgstr "Clients separats"
 msgid "Server Settings"
 msgstr "Ajusts de servidor"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Nom de servei"
 
@@ -2971,9 +2955,6 @@ msgstr "Ordena"
 msgid "Source"
 msgstr "Origen"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Especifica el directori a que el dispositiu està adjuntat"
 
@@ -3012,6 +2993,9 @@ msgstr "Inici"
 msgid "Start priority"
 msgstr "Prioritat d'inici"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Arrencada"
 
@@ -3165,6 +3149,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3191,9 +3185,6 @@ msgstr ""
 "<br />Fes clic a \"Procedeix\" a continuació per començar el procés "
 "d'escriptura a la memòria flaix."
 
-msgid "The following changes have been committed"
-msgstr "S'han comès els següents canvis"
-
 msgid "The following changes have been reverted"
 msgstr "S&#39;han desfet els següents canvis"
 
@@ -3258,11 +3249,6 @@ msgstr ""
 "connectar-te de nou a l'encaminador, depenent de la configuració que hi "
 "tinguis."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3273,8 +3259,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "No hi ha arrendaments actius."
 
-msgid "There are no pending changes to apply!"
-msgstr "No hi ha canvis pendents per aplicar!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "No hi ha canvis pendents per revertir!"
@@ -3423,15 +3409,6 @@ msgstr "Interfície del túnel"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Potència Tx"
 
@@ -3607,12 +3584,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Classe de venidor per enviar al sol·licitar DHCP"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Verifica"
 
@@ -3644,16 +3615,15 @@ msgstr ""
 "La xifratge WPA requereix que sigui instal·lat el wpa_supplicant (pel mode "
 "client) o el hostapd (pels modes AP i ad hoc)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Esperant que s'apliquin els canvis..."
 
 msgid "Waiting for command to complete..."
 msgstr "Esperant que s'acabi l'ordre..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr "Esperant el dispositiu..."
 
@@ -3668,12 +3638,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3753,6 +3717,9 @@ msgstr ""
 msgid "bridged"
 msgstr "pontejat"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "crea:"
 
@@ -3817,9 +3784,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "fitxer <abbr title=\"Domain Name System\">DNS</abbr> local"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3844,6 +3808,9 @@ msgstr "engegat"
 msgid "open"
 msgstr "obert"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3895,6 +3862,30 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Enrere"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estat WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estat WAN IPv6"
+
+#~ msgid "Apply"
+#~ msgstr "Aplica"
+
+#~ msgid "Applying changes"
+#~ msgstr "Aplicant els canvis"
+
+#~ msgid "Configuration applied."
+#~ msgstr "S'ha aplicat la configuració."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Desa i aplica"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "S'han comès els següents canvis"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "No hi ha canvis pendents per aplicar!"
+
 #~ msgid "Action"
 #~ msgstr "Acció"
 
index aa4144758b6704908dfafceb1919caed28733148..673ca6fd440d28ff5613dd1d8a05e37898c3d272 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Zatížení za 1 minutu:"
 
@@ -169,9 +172,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -208,9 +208,6 @@ msgstr "číslo ATM zařízení"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Přístupový koncentrátor"
 
@@ -319,11 +316,6 @@ msgstr "Povolit upstream odpovědi na 127.0.0.0/8 rozsah, např. pro RBL služby
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -402,11 +394,14 @@ msgstr "Konfigurace antén"
 msgid "Any zone"
 msgstr "Libovolná zóna"
 
-msgid "Apply"
-msgstr "Použít"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Probíhá uplatňování nastavení"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -422,6 +417,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Připojení klienti"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -512,9 +510,6 @@ msgstr "Zadána neplatná adresa!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -586,12 +581,20 @@ msgstr "Změny"
 msgid "Changes applied."
 msgstr "Změny aplikovány."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Změní administrátorské heslo pro přístup k zařízení"
 
 msgid "Channel"
 msgstr "Kanál"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Kontrola"
 
@@ -672,12 +675,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Nastavení"
 
-msgid "Configuration applied."
-msgstr "Nastavení uplatněno."
-
 msgid "Configuration files will be kept."
 msgstr "Konfigurační soubory budou zachovány."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Ověření"
 
@@ -690,12 +696,15 @@ msgstr "Připojeno"
 msgid "Connection Limit"
 msgstr "Omezení počtu připojení"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Připojení"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Země"
 
@@ -824,9 +833,6 @@ msgstr "Výchozí brána"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Výchozí stav"
 
@@ -868,6 +874,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostika"
 
@@ -902,6 +911,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Vyřadit upstream RFC1918 odpovědi"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Zobrazeny pouze balíčky obsahující"
 
@@ -1162,6 +1174,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Soubor"
 
@@ -1283,7 +1298,7 @@ msgstr "Volné místo"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1355,9 +1370,6 @@ msgstr "Zavěsit"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1417,8 +1429,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 firewall"
 
-msgid "IPv4 WAN Status"
-msgstr "Stav IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 adresa"
@@ -1468,15 +1480,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Stav IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 adresa"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2064,9 +2073,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Kandidáti NTP serveru"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Název"
 
@@ -2190,6 +2196,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Vypnutí prodlevy"
 
@@ -2240,12 +2249,6 @@ msgstr "Volba odstraněna"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2601,15 +2604,15 @@ msgstr ""
 "Host Configuration Protocol\">DHCP</abbr> Serveru"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Opravdu odstranit toto rozhraní? Odstranění nelze vrátit zpět!\n"
 "Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
 "tohoto rozhraní."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Opravdu odstranit bezdrátovou síť? Odstranění nelze vrátit zpět!\n"
@@ -2621,7 +2624,7 @@ msgstr "Opravdu resetovat všechny změny?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Opravdu vypnout síť ?\n"
@@ -2629,7 +2632,7 @@ msgstr ""
 "tohoto rozhraní."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Opravdu vypnout rozhraní \"%s\" ?\n"
@@ -2723,9 +2726,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2785,6 +2785,15 @@ msgstr "Odhalit/skrýt heslo"
 msgid "Revert"
 msgstr "Vrátit zpět"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Root"
 
@@ -2800,9 +2809,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2827,14 +2833,6 @@ msgstr "Spustit kontrolu souborového systému"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2862,9 +2860,6 @@ msgstr "Uložit"
 msgid "Save & Apply"
 msgstr "Uložit & použít"
 
-msgid "Save &#38; Apply"
-msgstr "Uložit &#38; použít"
-
 msgid "Scan"
 msgstr "Skenovat"
 
@@ -2893,17 +2888,6 @@ msgstr "Oddělovat klienty"
 msgid "Server Settings"
 msgstr "Nastavení serveru"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Název služby"
 
@@ -3000,9 +2984,6 @@ msgstr "Seřadit"
 msgid "Source"
 msgstr "Zdroj"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -3043,6 +3024,9 @@ msgstr "Start"
 msgid "Start priority"
 msgstr "Priorita spouštění"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Po spuštění"
 
@@ -3205,6 +3189,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3230,9 +3224,6 @@ msgstr ""
 "souboru s originálním souborem pro zajištění integrity dat.<br /> Kliknutím "
 "na \"Pokračovat\" spustíte proceduru flashování."
 
-msgid "The following changes have been committed"
-msgstr "Následující změny byly provedeny"
-
 msgid "The following changes have been reverted"
 msgstr "Následující změny byly vráceny"
 
@@ -3301,11 +3292,6 @@ msgstr ""
 "nastavení, bude možná nutné obnovit adresu vašeho počítače, aby jste se "
 "mohli znovu připojit."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3314,8 +3300,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Nejsou žádné aktivní zápůjčky."
 
-msgid "There are no pending changes to apply!"
-msgstr "Nejsou zde žádné nevyřízené změny k aplikaci!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Nejsou zde žádné nevyřízené změny k navrácení!"
@@ -3463,15 +3449,6 @@ msgstr "Rozhraní tunelu"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Tx-Power"
 
@@ -3650,12 +3627,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Ověřit"
 
@@ -3687,16 +3658,15 @@ msgstr ""
 "Šifrování WPA vyžaduje nainstalovaný wpa_supplicant (pro klientský režim) "
 "nebo hostapd (pro AP a ad-hoc režim)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Čekání na realizaci změn..."
 
 msgid "Waiting for command to complete..."
 msgstr "Čekání na dokončení příkazu..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3711,12 +3681,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3794,6 +3758,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "přemostěný"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3858,9 +3825,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "místní <abbr title=\"Domain Name System\">DNS</abbr> soubor"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3885,6 +3849,9 @@ msgstr "on"
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3936,6 +3903,30 @@ msgstr "ano"
 msgid "« Back"
 msgstr "« Zpět"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Stav IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Stav IPv6 WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Použít"
+
+#~ msgid "Applying changes"
+#~ msgstr "Probíhá uplatňování nastavení"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Nastavení uplatněno."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Uložit &#38; použít"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Následující změny byly provedeny"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Nejsou zde žádné nevyřízené změny k aplikaci!"
+
 #~ msgid "Action"
 #~ msgstr "Akce"
 
index 574ddf184a4bf9b6f6c9d8d0c561afe5f16a0cc4..c0e0f914d17d6bfed66200804f58671222206006 100644 (file)
@@ -49,6 +49,9 @@ msgstr "-- anhand Label selektieren --"
 msgid "-- match by uuid --"
 msgstr "-- UUID vergleichen --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Systemlast (1 Minute):"
 
@@ -172,9 +175,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -211,9 +211,6 @@ msgstr "ATM Geräteindex"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Access Concentrator"
 
@@ -322,13 +319,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr "Erlaubte IP-Adressen"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"Siehe auch <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> bei SIXXS."
-
 msgid "Always announce default router"
 msgstr "Immer Defaultrouter ankündigen"
 
@@ -409,11 +399,14 @@ msgstr "Antennenkonfiguration"
 msgid "Any zone"
 msgstr "Beliebige Zone"
 
-msgid "Apply"
-msgstr "Anwenden"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Änderungen werden angewandt"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -433,6 +426,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Assoziierte Clients"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Berechtigungsgruppe"
 
@@ -523,9 +519,6 @@ msgstr "Ungültige Adresse angegeben!"
 msgid "Band"
 msgstr "Frequenztyp"
 
-msgid "Behind NAT"
-msgstr "NAT"
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -604,12 +597,20 @@ msgstr "Änderungen"
 msgid "Changes applied."
 msgstr "Änderungen angewendet."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Ändert das Administratorpasswort für den Zugriff auf dieses Gerät"
 
 msgid "Channel"
 msgstr "Kanal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Prüfen"
 
@@ -696,12 +697,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Konfiguration"
 
-msgid "Configuration applied."
-msgstr "Konfiguration angewendet."
-
 msgid "Configuration files will be kept."
 msgstr "Konfigurationsdateien sichern"
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Bestätigung"
 
@@ -714,12 +718,15 @@ msgstr "Verbunden"
 msgid "Connection Limit"
 msgstr "Verbindungslimit"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "TLS zwingend vorraussetzen und abbrechen wenn TLS fehlschlägt."
-
 msgid "Connections"
 msgstr "Verbindungen"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Land"
 
@@ -848,9 +855,6 @@ msgstr "Default Gateway"
 msgid "Default is stateless + stateful"
 msgstr "Der Standardwert ist zustandslos und zustandsorientiert"
 
-msgid "Default route"
-msgstr "Default Route"
-
 msgid "Default state"
 msgstr "Ausgangszustand"
 
@@ -892,6 +896,9 @@ msgstr "Das Gerät startet neu..."
 msgid "Device unreachable"
 msgstr "Das Gerät ist nicht erreichbar"
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnosen"
 
@@ -926,6 +933,9 @@ msgstr "Deaktiviert (Standard)"
 msgid "Discard upstream RFC1918 responses"
 msgstr "Eingehende RFC1918-Antworten verwerfen"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Nur Pakete mit folgendem Inhalt anzeigen"
 
@@ -1192,6 +1202,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Datei"
 
@@ -1318,10 +1331,10 @@ msgstr "Freier Platz"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "Weitere Informationen zu WireGuard-Schnittstellen und Peers unter <a href="
-"\"http://wireguard.io\">wireguard.io</a>."
+"\"http://wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "GHz"
@@ -1394,9 +1407,6 @@ msgstr "Auflegen"
 msgid "Header Error Code Errors (HEC)"
 msgstr "Anzahl Header-Error-Code-Fehler (HEC)"
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1455,8 +1465,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Firewall"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN Status"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 Adresse"
@@ -1506,15 +1516,12 @@ msgstr "IPv6 Einstellungen"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA-Präfix"
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN Status"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 Adresse"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr "Zum lokalen Tunnelendpunkt delegierte IPv6-Adresse (optional)"
-
 msgid "IPv6 assignment hint"
 msgstr "IPv6 Zuweisungshinweis"
 
@@ -2129,9 +2136,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "NTP Server Kandidaten"
 
-msgid "NTP sync time-out"
-msgstr "NTP Synchronisierungstimeout"
-
 msgid "Name"
 msgstr "Name"
 
@@ -2256,6 +2260,9 @@ msgstr "Chiffriertes Gruppenpasswort"
 msgid "Obfuscated Password"
 msgstr "Chiffriertes Passwort"
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Verzögerung für Ausschalt-Zustand"
 
@@ -2307,14 +2314,6 @@ msgstr "Option entfernt"
 msgid "Optional"
 msgstr "Optional"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-"Optional, angeben um den Standardserver (tic.sixxs.net) zu überschreiben"
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-"Optional, angeben wenn das SIXSS Konto mehr als einen Tunnel beinhaltet"
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2685,8 +2684,8 @@ msgid ""
 msgstr "Lese Informationen aus /etc/ethers um den DHCP-Server zu konfigurieren"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig "
 "gemacht werden!\n"
@@ -2694,7 +2693,7 @@ msgstr ""
 "Schnittstelle verbunden sind."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Dieses Drahtlosnetzwerk wirklich löschen? Der Schritt kann nicht rückgängig "
@@ -2707,7 +2706,7 @@ msgstr "Sollen wirklich alle Änderungen verworfen werden?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Das Netzwerk wirklich herunterfahren?\n"
@@ -2715,7 +2714,7 @@ msgstr ""
 "Schnittstelle verbunden sind."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Die Schnitstelle \"%s\" wirklich herunterfahren?\n"
@@ -2809,9 +2808,6 @@ msgstr "IPv6-Adresse anfordern"
 msgid "Request IPv6-prefix of length"
 msgstr "IPv6-Präfix dieser Länge anfordern"
 
-msgid "Require TLS"
-msgstr "TLS erfordern"
-
 msgid "Required"
 msgstr "Benötigt"
 
@@ -2879,6 +2875,15 @@ msgstr "Passwort zeigen/verstecken"
 msgid "Revert"
 msgstr "Verwerfen"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Root"
 
@@ -2894,9 +2899,6 @@ msgstr "Erlaubte IP-Addressen routen"
 msgid "Route type"
 msgstr "Routen-Typ"
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "Geroutetes IPv6-Präfix für nachgelagerte Schnittstellen"
-
 msgid "Router Advertisement-Service"
 msgstr "Router-Advertisement-Dienst"
 
@@ -2922,14 +2924,6 @@ msgstr "Dateisystemprüfung durchführen"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2957,9 +2951,6 @@ msgstr "Speichern"
 msgid "Save & Apply"
 msgstr "Speichern & Anwenden"
 
-msgid "Save &#38; Apply"
-msgstr "Speichern &#38; Anwenden"
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2988,19 +2979,6 @@ msgstr "Clients isolieren"
 msgid "Server Settings"
 msgstr "Servereinstellungen"
 
-msgid "Server password"
-msgstr "Server Passwort"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-"Server Passwort bzw. das tunnelspezifische Passwort wenn der Benutzername "
-"eine Tunnel-ID beinhaltet."
-
-msgid "Server username"
-msgstr "Server Benutzername"
-
 msgid "Service Name"
 msgstr "Service-Name"
 
@@ -3101,9 +3079,6 @@ msgstr "Sortieren"
 msgid "Source"
 msgstr "Quelle"
 
-msgid "Source routing"
-msgstr "Quell-Routing"
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Nennt das Verzeichnis, an welches das Gerät angebunden ist"
 
@@ -3150,6 +3125,9 @@ msgstr "Start"
 msgid "Start priority"
 msgstr "Startpriorität"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Systemstart"
 
@@ -3324,6 +3302,16 @@ msgstr ""
 "Die Konfigurationsdatei konnte aufgrund der folgenden Fehler nicht geladen "
 "werden:"
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3345,9 +3333,6 @@ msgstr ""
 "Integrität sicherzustellen.<br /> Klicken Sie \"Fortfahren\" um die Flash-"
 "Prozedur zu starten."
 
-msgid "The following changes have been committed"
-msgstr "Die folgenden Änderungen wurden angewendet"
-
 msgid "The following changes have been reverted"
 msgstr "Die folgenden Änderungen wurden verworfen"
 
@@ -3421,13 +3406,6 @@ msgstr ""
 "Konfiguration ist es notwendig, dass Sie auf Ihrem Computer eine neue IP-"
 "Adresse beziehen müssen um auf das Gerät zugreifen zu können."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-"Der lokale Tunnel-Endpunkt ist hinter einem NAT. Standard ist deaktiviert, "
-"nur auf AYIYA anwendbar."
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3438,8 +3416,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Es gibt z.Z. keine aktiven Leases."
 
-msgid "There are no pending changes to apply!"
-msgstr "Es gibt keine ausstehenen Änderungen anzuwenden!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Es gibt keine ausstehenen Änderungen zurückzusetzen!"
@@ -3600,15 +3578,6 @@ msgstr "Tunnelschnittstelle"
 msgid "Tunnel Link"
 msgstr "Basisschnittstelle"
 
-msgid "Tunnel broker protocol"
-msgstr "Tunnel-Boker-Protokoll"
-
-msgid "Tunnel setup server"
-msgstr "Tunnel-Setup-Server"
-
-msgid "Tunnel type"
-msgstr "Tunneltyp"
-
 msgid "Tx-Power"
 msgstr "Sendestärke"
 
@@ -3790,12 +3759,6 @@ msgstr "Hersteller"
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Bei DHCP-Anfragen gesendete Vendor-Klasse"
 
-msgid "Verbose"
-msgstr "Umfangreiche Ausgaben"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Aktiviert erweiterte Protokollierung durch den AICCU-Prozess"
-
 msgid "Verify"
 msgstr "Verifizieren"
 
@@ -3827,18 +3790,15 @@ msgstr ""
 "WPA-Verschlüsselung benötigt wpa_supplicant (für Client-Modus) oder hostapd "
 "(für AP oder Ad-Hoc Modus)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Warte die angegebene Anzahl an Sekunden auf NTP-Synchronisierung, der Wert 0 "
-"deaktiviert das Warten (optional)"
-
 msgid "Waiting for changes to be applied..."
 msgstr "Änderungen werden angewandt..."
 
 msgid "Waiting for command to complete..."
 msgstr "Der Befehl wird ausgeführt..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr "Warte auf Gerät..."
 
@@ -3857,13 +3817,6 @@ msgstr ""
 "Wenn PSK in Verwendung ist, können PMK-Schlüssel lokal ohne Inter-Access-"
 "Point-Kommunikation erzeugt werden."
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-"Gibt an, ob eine IPv6-Default-Route durch den Tunnel etabliert werden soll"
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "Gibt an, ob nur Pakete von delegierten Präfixen geroutet werden sollen"
-
 msgid "Width"
 msgstr "Breite"
 
@@ -3943,6 +3896,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "bridged"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "erstelle:"
 
@@ -4005,9 +3961,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "Lokale DNS-Datei"
 
-msgid "minimum 1280, maximum 1480"
-msgstr "Minimum 1280, Maximum 1480"
-
 msgid "minutes"
 msgstr "Minuten"
 
@@ -4032,6 +3985,9 @@ msgstr "ein"
 msgid "open"
 msgstr "offen"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "Overlay"
 
@@ -4083,107 +4039,8 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Zurück"
 
-#~ msgid "Action"
-#~ msgstr "Aktion"
-
-#~ msgid "Buttons"
-#~ msgstr "Knöpfe"
-
-#~ msgid "Handler"
-#~ msgstr "Handler"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Maximalzeit zum Halten der Verbindung"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Minimalzeit zum Halten der Verbindung"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "Ausführbare Datei welche das Schalter-Ereignis verarbeitet"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Gibt den zu behandelnden Tastenstatus an"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr ""
-#~ "Diese Seite ermöglicht die Konfiguration benutzerdefinierter "
-#~ "Tastenaktionen"
-
-#~ msgid "Leasetime"
-#~ msgstr "Laufzeit"
-
-#~ msgid "Optional."
-#~ msgstr "Optional"
-
-#~ msgid "AuthGroup"
-#~ msgstr "Berechtigungsgruppe"
-
-#~ msgid "automatic"
-#~ msgstr "automatisch"
-
-#~ msgid "AR Support"
-#~ msgstr "AR-Unterstützung"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Atheros 802.11%s W-LAN Adapter"
-
-#~ msgid "Background Scan"
-#~ msgstr "Hintergrundscan"
-
-#~ msgid "Compression"
-#~ msgstr "Kompression"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Deaktiviere Hardware-Beacon Zeitgeber"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Scan-Anforderungen nicht beantworten"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Schnelle Frames"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Höchstübertragungsrate"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Mindestübertragungsrate"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Multicastrate"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Funkkanal für den Ausseneinsatz"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Geltungsbereich (Regulatory Domain)"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Separates WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Statisches WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Turbo Modus"
-
-#~ msgid "XR Support"
-#~ msgstr "XR-Unterstützung"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr ""
-#~ "Erzeugt ein zusätzliches Netzwerk wenn diese Option nicht ausgewählt ist"
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Netzwerk beitreten: Einstellungen"
-
-#~ msgid "CPU"
-#~ msgstr "Prozessor"
-
-#~ msgid "Port %d"
-#~ msgstr "Port %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Port %d ist untagged in mehreren VLANs!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN Status"
 
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN Schnittstelle"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN Status"
index f746db32a4a521b3ef9f1b787f86dddfeb85308c..3d3c765409c4eff8c191a96affbb209a4bb1fd2a 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Φορτίο 1 λεπτού:"
 
@@ -172,9 +175,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -211,9 +211,6 @@ msgstr "Αριθμός συσκευής ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Συγκεντρωτής Πρόσβασης "
 
@@ -326,11 +323,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -409,11 +401,14 @@ msgstr ""
 msgid "Any zone"
 msgstr "Οιαδήποτε ζώνη"
 
-msgid "Apply"
-msgstr "Εφαρμογή"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Εφαρμογή αλλαγών"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -429,6 +424,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Συνδεδεμένοι Σταθμοί"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -520,9 +518,6 @@ msgstr "Μη έγκυρη διεύθυνση!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -595,12 +590,20 @@ msgstr "Αλλαγές"
 msgid "Changes applied."
 msgstr "Αλλαγές εφαρμόστηκαν."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Αλλάζει τον κωδικό διαχειριστή για πρόσβαση στη συσκευή"
 
 msgid "Channel"
 msgstr "Κανάλι"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Έλεγχος"
 
@@ -681,12 +684,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Παραμετροποίηση"
 
-msgid "Configuration applied."
-msgstr "Η Παραμετροποίηση εφαρμόστηκε."
-
 msgid "Configuration files will be kept."
 msgstr "Τα αρχεία παραμετροποίησης θα διατηρηθούν."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Επιβεβαίωση"
 
@@ -699,12 +705,15 @@ msgstr "Συνδεδεμένος"
 msgid "Connection Limit"
 msgstr "Όριο Συνδέσεων"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Συνδέσεις"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Χώρα"
 
@@ -833,9 +842,6 @@ msgstr "Προεπιλεγμένη πύλη"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Προεπιλεγμένη κατάσταση"
 
@@ -877,6 +883,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Διαγνωστικά"
 
@@ -911,6 +920,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Αγνόησε τις απαντήσεις ανοδικής ροής RFC1918"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Εμφάνιση μόνο πακέτων που περιέχουν"
 
@@ -1175,6 +1187,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Αρχείο"
 
@@ -1297,7 +1312,7 @@ msgstr "Ελεύθερος χώρος"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1369,9 +1384,6 @@ msgstr "Κρέμασμα"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1430,7 +1442,7 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Τείχος Προστασίας"
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1481,15 +1493,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Κατάσταση IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Διεύθυνση IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2072,9 +2081,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Όνομα"
 
@@ -2198,6 +2204,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2249,12 +2258,6 @@ msgstr "Η επιλογή αφαιρέθηκε"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2607,12 +2610,12 @@ msgstr ""
 "εξυπηρετητή <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2620,12 +2623,12 @@ msgid "Really reset all changes?"
 msgstr "Αρχικοποίηση όλων των αλλαγών;"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2716,9 +2719,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2777,6 +2777,15 @@ msgstr ""
 msgid "Revert"
 msgstr "Αναίρεση"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Root"
 
@@ -2792,9 +2801,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2821,14 +2827,6 @@ msgstr "Εκτέλεση ελέγχου συστήματος αρχείων"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2856,9 +2854,6 @@ msgstr "Αποθήκευση"
 msgid "Save & Apply"
 msgstr "Αποθήκευση & Εφαρμογή"
 
-msgid "Save &#38; Apply"
-msgstr "Αποθήκευση &#38; Εφαρμογή"
-
 msgid "Scan"
 msgstr "Σάρωση"
 
@@ -2886,17 +2881,6 @@ msgstr "Απομόνωση Πελατών"
 msgid "Server Settings"
 msgstr "Ρυθμίσεις Εξυπηρετητή"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Όνομα Υπηρεσίας"
 
@@ -2989,9 +2973,6 @@ msgstr "Ταξινόμηση"
 msgid "Source"
 msgstr "Πηγή"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -3032,6 +3013,9 @@ msgstr "Αρχή"
 msgid "Start priority"
 msgstr "Προτεραιότητα εκκίνησης"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Εκκίνηση"
 
@@ -3183,6 +3167,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3205,9 +3199,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr "Οι παρακάτω αλλαγές έχουν υποβληθεί"
-
 msgid "The following changes have been reverted"
 msgstr "Οι παρακάτω αλλαγές έχουν αναιρεθεί"
 
@@ -3265,11 +3256,6 @@ msgstr ""
 "είναι πιθανό να χρειαστεί να ανανεώσετε την διεύθυνση του υπολογιστή σας για "
 "να αποκτήσετε ξανά πρόσβαση στη συσκευή."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3280,7 +3266,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Δεν υπάρχουν ενεργά leases."
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3422,15 +3408,6 @@ msgstr "Διεπαφή Τούνελ"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Ισχύς Εκπομπής"
 
@@ -3603,12 +3580,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3638,16 +3609,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3662,12 +3632,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3745,6 +3709,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3810,9 +3777,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "τοπικό αρχείο <abbr title=\"Domain Name System\">DNS</abbr>"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3837,6 +3801,9 @@ msgstr "ανοιχτό"
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3888,6 +3855,24 @@ msgstr "ναι"
 msgid "« Back"
 msgstr "« Πίσω"
 
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Κατάσταση IPv6 WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Εφαρμογή"
+
+#~ msgid "Applying changes"
+#~ msgstr "Εφαρμογή αλλαγών"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Η Παραμετροποίηση εφαρμόστηκε."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Αποθήκευση &#38; Εφαρμογή"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Οι παρακάτω αλλαγές έχουν υποβληθεί"
+
 #~ msgid "Action"
 #~ msgstr "Ενέργεια"
 
index 50a7c928156f903a6d2a9faa7f7188084024e6ff..49cf819cd9118fd749480a5f00af03b831ccbf6d 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 Minute Load:"
 
@@ -172,9 +175,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -211,9 +211,6 @@ msgstr "ATM device number"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Access Concentrator"
 
@@ -317,11 +314,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -400,11 +392,14 @@ msgstr ""
 msgid "Any zone"
 msgstr "Any zone"
 
-msgid "Apply"
-msgstr "Apply"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Applying changes"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -420,6 +415,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Associated Stations"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -510,9 +508,6 @@ msgstr "Bad address specified!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -584,12 +579,20 @@ msgstr "Changes"
 msgid "Changes applied."
 msgstr "Changes applied."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Changes the administrator password for accessing the device"
 
 msgid "Channel"
 msgstr "Channel"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Check"
 
@@ -668,12 +671,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configuration"
 
-msgid "Configuration applied."
-msgstr "Configuration applied."
-
 msgid "Configuration files will be kept."
 msgstr "Configuration files will be kept."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmation"
 
@@ -686,12 +692,15 @@ msgstr "Connected"
 msgid "Connection Limit"
 msgstr "Connection Limit"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Connections"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Country"
 
@@ -820,9 +829,6 @@ msgstr "Default gateway"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Default state"
 
@@ -865,6 +871,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostics"
 
@@ -897,6 +906,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1151,6 +1163,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1272,7 +1287,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1344,9 +1359,6 @@ msgstr "Hang Up"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1404,7 +1416,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1455,15 +1467,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2039,9 +2048,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Name"
 
@@ -2165,6 +2171,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2216,12 +2225,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2573,12 +2576,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2586,12 +2589,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2682,9 +2685,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2743,6 +2743,15 @@ msgstr ""
 msgid "Revert"
 msgstr "Revert"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2758,9 +2767,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2786,14 +2792,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2821,9 +2819,6 @@ msgstr "Save"
 msgid "Save & Apply"
 msgstr "Save & Apply"
 
-msgid "Save &#38; Apply"
-msgstr ""
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2850,17 +2845,6 @@ msgstr "Separate Clients"
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2953,9 +2937,6 @@ msgstr ""
 msgid "Source"
 msgstr "Source"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2994,6 +2975,9 @@ msgstr "Start"
 msgid "Start priority"
 msgstr "Start priority"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3143,6 +3127,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3165,9 +3159,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr "The following changes have been reverted"
 
@@ -3225,11 +3216,6 @@ msgstr ""
 "address of your computer to reach the device again, depending on your "
 "settings."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3240,7 +3226,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3379,15 +3365,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3560,12 +3537,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3597,16 +3568,15 @@ msgstr ""
 "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
 "and ad-hoc mode) to be installed."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3621,12 +3591,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3703,6 +3667,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3767,9 +3734,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3794,6 +3758,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3845,6 +3812,15 @@ msgstr ""
 msgid "« Back"
 msgstr "« Back"
 
+#~ msgid "Apply"
+#~ msgstr "Apply"
+
+#~ msgid "Applying changes"
+#~ msgstr "Applying changes"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuration applied."
+
 #~ msgid "Action"
 #~ msgstr "Action"
 
index 8aed2e9ee3501d78685ca40f1c05b93e6dcead4b..4c4713609bee3dd2ebd6e2794c08e2ef9dcdeb3d 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carga a 1 minuto:"
 
@@ -174,9 +177,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -213,9 +213,6 @@ msgstr "Número de dispositivo ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Concentrador de acceso"
 
@@ -323,11 +320,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -406,11 +398,14 @@ msgstr "Configuración de la antena"
 msgid "Any zone"
 msgstr "Cualquier zona"
 
-msgid "Apply"
-msgstr "Aplicar"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Aplicando cambios"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -426,6 +421,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estaciones asociadas"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -516,9 +514,6 @@ msgstr "¡Dirección no válida!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -591,12 +586,20 @@ msgstr "Cambios"
 msgid "Changes applied."
 msgstr "Cambios aplicados."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Cambie la contraseña del administrador para acceder al dispositivo"
 
 msgid "Channel"
 msgstr "Canal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Comprobar"
 
@@ -677,12 +680,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configuración"
 
-msgid "Configuration applied."
-msgstr "Configuración establecida."
-
 msgid "Configuration files will be kept."
 msgstr "Se mantendrán los ficheros de configuración."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmación"
 
@@ -695,12 +701,15 @@ msgstr "Conectado"
 msgid "Connection Limit"
 msgstr "Límite de conexión"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Conexiones"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "País"
 
@@ -829,9 +838,6 @@ msgstr "Gateway por defecto"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Estado por defecto"
 
@@ -874,6 +880,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnósticos"
 
@@ -908,6 +917,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Descartar respuestas RFC1918 salientes"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Mostrar sólo paquete que contienen"
 
@@ -1169,6 +1181,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fichero"
 
@@ -1291,7 +1306,7 @@ msgstr "Espacio libre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1365,9 +1380,6 @@ msgstr "Suspender"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1426,8 +1438,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Cortafuegos IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estado de la WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Dirección IPv4"
@@ -1477,15 +1489,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Estado de la WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Dirección IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2078,9 +2087,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Servidores NTP a consultar"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nombre"
 
@@ -2204,6 +2210,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Retraso de desconexión"
 
@@ -2254,12 +2263,6 @@ msgstr "Opción eliminada"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2615,8 +2618,8 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "¿Está seguro de borrar esta interfaz?. ¡No será posible deshacer el "
 "borrado!\n"
@@ -2624,7 +2627,7 @@ msgstr ""
 "interfaz."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "¿Está seguro de borrar esta red inalámbrica?. ¡No será posible deshacer el "
@@ -2636,14 +2639,14 @@ msgstr "¿Está seguro de querer reiniciar todos los cambios?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "¿Está seguro de querer apagar esta red?.\n"
 "Puede perder el acceso a este dispositivo si está conectado por esta red."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "¿Está seguro de apagar la interfaz \"%s\"?.\n"
@@ -2736,9 +2739,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2797,6 +2797,15 @@ msgstr "Mostrar/ocultar contraseña"
 msgid "Revert"
 msgstr "Anular"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Raíz"
 
@@ -2812,9 +2821,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2840,14 +2846,6 @@ msgstr "Comprobar el sistema de ficheros"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2875,9 +2873,6 @@ msgstr "Guardar"
 msgid "Save & Apply"
 msgstr "Guardar y aplicar"
 
-msgid "Save &#38; Apply"
-msgstr "Guardar y aplicar"
-
 msgid "Scan"
 msgstr "Explorar"
 
@@ -2906,17 +2901,6 @@ msgstr "Aislar clientes"
 msgid "Server Settings"
 msgstr "Configuración del servidor"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Nombre de servicio"
 
@@ -3013,9 +2997,6 @@ msgstr "Ordenar"
 msgid "Source"
 msgstr "Origen"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Especifica el directorio al que está enlazado el dispositivo"
 
@@ -3059,6 +3040,9 @@ msgstr "Arrancar"
 msgid "Start priority"
 msgstr "Prioridad de arranque"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Arranque"
 
@@ -3225,6 +3209,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3250,9 +3244,6 @@ msgstr ""
 "coinciden con los del original.<br />Pulse \"Proceder\" para empezar el "
 "grabado."
 
-msgid "The following changes have been committed"
-msgstr "Se han hecho los siguientes cambios"
-
 msgid "The following changes have been reverted"
 msgstr "Se han anulado los siguientes cambios"
 
@@ -3321,11 +3312,6 @@ msgstr ""
 "Espere unos minutos antes de reconectar. Es posible que tenga que renovar la "
 "conexión de su ordenador para poder acceder de nuevo al dispositivo."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3336,8 +3322,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Sin cesiones activas."
 
-msgid "There are no pending changes to apply!"
-msgstr "¡No hay cambios pendientes!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "¡No hay cambios a anular!"
@@ -3488,15 +3474,6 @@ msgstr "Interfaz de túnel"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Potencia-TX"
 
@@ -3676,12 +3653,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Clase de vendedor a enviar cuando solicite DHCP"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Verificar"
 
@@ -3713,16 +3684,15 @@ msgstr ""
 "WPA-Encryption necesita que estén instalados wpa_supplicant (para el modo "
 "cliente o hostapd (para los modos AP y ad-hoc)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Esperando a que se realicen los cambios..."
 
 msgid "Waiting for command to complete..."
 msgstr "Esperando a que termine el comando..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3737,12 +3707,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3821,6 +3785,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "puenteado"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "crear:"
 
@@ -3885,9 +3852,6 @@ msgstr "Kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "Archvo <abbr title=\"Domain Name System\">DNS</abbr> local"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3912,6 +3876,9 @@ msgstr "activo"
 msgid "open"
 msgstr "abierto"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3963,6 +3930,30 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Volver"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado de la WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado de la WAN IPv6"
+
+#~ msgid "Apply"
+#~ msgstr "Aplicar"
+
+#~ msgid "Applying changes"
+#~ msgstr "Aplicando cambios"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuración establecida."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Guardar y aplicar"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Se han hecho los siguientes cambios"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "¡No hay cambios pendientes!"
+
 #~ msgid "Action"
 #~ msgstr "Acción"
 
index e09343815dfe5a57d52f49b50fde14481b718e86..d6e7ccf6bc6b95d10a1eebd3ef2e853a92778871 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Charge sur 1 minute :"
 
@@ -173,9 +176,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -216,9 +216,6 @@ msgstr "Numéro de périphérique ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Concentrateur d'accès"
 
@@ -329,11 +326,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -412,11 +404,14 @@ msgstr "Configuration de l'antenne"
 msgid "Any zone"
 msgstr "N'importe quelle zone"
 
-msgid "Apply"
-msgstr "Appliquer"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Changements en cours"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -432,6 +427,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Équipements associés"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -522,9 +520,6 @@ msgstr "Adresse spécifiée incorrecte!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -596,12 +591,20 @@ msgstr "Changements"
 msgid "Changes applied."
 msgstr "Changements appliqués."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Change le mot de passe administrateur pour accéder à l'équipement"
 
 msgid "Channel"
 msgstr "Canal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Vérification"
 
@@ -684,12 +687,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configuration"
 
-msgid "Configuration applied."
-msgstr "Configuration appliquée."
-
 msgid "Configuration files will be kept."
 msgstr "Les fichiers de configuration seront préservés."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmation"
 
@@ -702,12 +708,15 @@ msgstr "Connecté"
 msgid "Connection Limit"
 msgstr "Limite de connexion"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Connexions"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Pays"
 
@@ -836,9 +845,6 @@ msgstr "Passerelle par défaut"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "État par défaut"
 
@@ -881,6 +887,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostics"
 
@@ -915,6 +924,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Jeter les réponses en RFC1918 amont"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "N'afficher que les paquets contenant"
 
@@ -1181,6 +1193,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fichier"
 
@@ -1302,7 +1317,7 @@ msgstr "Espace libre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1376,9 +1391,6 @@ msgstr "Signal (HUP)"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1438,8 +1450,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Pare-feu IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "État IPv4 du WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Adresse IPv4"
@@ -1489,15 +1501,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "État IPv6 du WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Adresse IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2092,9 +2101,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Serveurs NTP candidats"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nom"
 
@@ -2218,6 +2224,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Durée éteinte"
 
@@ -2267,12 +2276,6 @@ msgstr "Option retirée"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2626,8 +2629,8 @@ msgid ""
 msgstr "Lire /etc/ethers pour configurer le serveur DHCP"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Voulez-vous vraiment supprimer cette interface? L'effacement ne peut être "
 "annulé!\n"
@@ -2635,7 +2638,7 @@ msgstr ""
 "cette interface."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Voulez-vous vraiment supprimer ce réseau sans-fil? L'effacement ne peut être "
@@ -2647,7 +2650,7 @@ msgid "Really reset all changes?"
 msgstr "Voulez-vous vraiment ré-initialiser toutes les modifications ?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Voulez-vous vraiment arrêter l'interface %s ?\n"
@@ -2655,7 +2658,7 @@ msgstr ""
 "cette interface."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Voulez-vous vraiment arrêter l'interface %s ?\n"
@@ -2749,9 +2752,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2810,6 +2810,15 @@ msgstr "Montrer/cacher le mot de passe"
 msgid "Revert"
 msgstr "Revenir"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Racine"
 
@@ -2825,9 +2834,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2854,14 +2860,6 @@ msgstr "Faire une vérification du système de fichiers"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2889,9 +2887,6 @@ msgstr "Sauvegarder"
 msgid "Save & Apply"
 msgstr "Sauvegarder et Appliquer"
 
-msgid "Save &#38; Apply"
-msgstr "Sauvegarder et appliquer"
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2920,17 +2915,6 @@ msgstr "Isoler les clients"
 msgid "Server Settings"
 msgstr "Paramètres du serveur"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Nom du service"
 
@@ -3028,9 +3012,6 @@ msgstr "Trier"
 msgid "Source"
 msgstr "Source"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Indique le répertoire auquel le périphérique est rattaché"
 
@@ -3071,6 +3052,9 @@ msgstr "Démarrer"
 msgid "Start priority"
 msgstr "Priorité de démarrage"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Démarrage"
 
@@ -3237,6 +3221,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3260,9 +3254,6 @@ msgstr ""
 "assurer de son intégrité.<br /> Cliquez sur \"Continuer\" pour lancer la "
 "procédure d'écriture."
 
-msgid "The following changes have been committed"
-msgstr "Les changements suivants ont été appliqués"
-
 msgid "The following changes have been reverted"
 msgstr "Les changements suivants ont été annulés"
 
@@ -3334,11 +3325,6 @@ msgstr ""
 "address of your computer to reach the device again, depending on your "
 "settings."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3349,8 +3335,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Il n'y a aucun bail actif."
 
-msgid "There are no pending changes to apply!"
-msgstr "Il n'y a aucun changement en attente d'être appliqués !"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Il n'y a aucun changement à annuler !"
@@ -3506,15 +3492,6 @@ msgstr "Interface du tunnel"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Puissance d'émission"
 
@@ -3695,12 +3672,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Classe de fournisseur à envoyer dans les requêtes DHCP"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Vérifier"
 
@@ -3732,16 +3703,15 @@ msgstr ""
 "Le chiffrage WPA nécessite l'installation du paquet wpa_supplicant (en mode "
 "client) ou hostapd (en mode Point d'accès ou Ad-hoc)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "En attente de l'application des changements..."
 
 msgid "Waiting for command to complete..."
 msgstr "En attente de la fin de la commande..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3756,12 +3726,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3841,6 +3805,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "ponté"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "créer:"
 
@@ -3903,9 +3870,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "fichier de résolution local"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3930,6 +3894,9 @@ msgstr "Actif"
 msgid "open"
 msgstr "ouvrir"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3981,6 +3948,30 @@ msgstr "oui"
 msgid "« Back"
 msgstr "« Retour"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "État IPv4 du WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "État IPv6 du WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Appliquer"
+
+#~ msgid "Applying changes"
+#~ msgstr "Changements en cours"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuration appliquée."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Sauvegarder et appliquer"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Les changements suivants ont été appliqués"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Il n'y a aucun changement en attente d'être appliqués !"
+
 #~ msgid "Action"
 #~ msgstr "Action"
 
index cb4c74a3f625e540b2c2976661d8b5d7fa4363c9..a8adc1038a76a6979df601c2434c7d61dcedfbd4 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "עומס במשך דקה:"
 
@@ -163,9 +166,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -203,9 +203,6 @@ msgstr "מס' התקן של ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 #, fuzzy
 msgid "Access Concentrator"
 msgstr "מרכז גישות"
@@ -316,11 +313,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -401,11 +393,14 @@ msgstr "הגדרות אנטנה"
 msgid "Any zone"
 msgstr "כל תחום"
 
-msgid "Apply"
-msgstr "החל"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "מחיל הגדרות"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -421,6 +416,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "תחנות קשורות"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -511,9 +509,6 @@ msgstr "פורטה כתובת לא תקינה"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -586,12 +581,20 @@ msgstr "שינויים"
 msgid "Changes applied."
 msgstr "השינויים הוחלו"
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "משנה את סיסמת המנהל לגישה למכשיר"
 
 msgid "Channel"
 msgstr "ערוץ"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "לבדוק"
 
@@ -661,12 +664,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "הגדרות"
 
-msgid "Configuration applied."
-msgstr "הגדרות הוחלו"
-
 msgid "Configuration files will be kept."
 msgstr "קבצי ההגדרות ישמרו."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "אישור"
 
@@ -679,12 +685,15 @@ msgstr "מחובר"
 msgid "Connection Limit"
 msgstr "מגבלת חיבורים"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "חיבורים"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "מדינה"
 
@@ -813,9 +822,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr ""
 
@@ -857,6 +863,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "אבחון"
 
@@ -889,6 +898,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "מציג רק חבילות המכילות"
 
@@ -1136,6 +1148,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1257,7 +1272,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1329,9 +1344,6 @@ msgstr ""
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1387,7 +1399,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1438,15 +1450,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2012,9 +2021,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "שם"
 
@@ -2138,6 +2144,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2183,12 +2192,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2538,12 +2541,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2552,14 +2555,14 @@ msgstr ""
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "האם למחוק את הרשת האלחוטית הזו? המחיקה אינה ניתנת לביטול!\n"
 "ייתכן ותאבד גישה לנתב הזה אם אתה מחובר דרך השרת הזו."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2650,9 +2653,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2711,6 +2711,15 @@ msgstr ""
 msgid "Revert"
 msgstr ""
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2726,9 +2735,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2752,14 +2758,6 @@ msgstr "הרץ בדיקת מערכת קבצים"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2787,9 +2785,6 @@ msgstr ""
 msgid "Save & Apply"
 msgstr ""
 
-msgid "Save &#38; Apply"
-msgstr ""
-
 msgid "Scan"
 msgstr ""
 
@@ -2816,17 +2811,6 @@ msgstr ""
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2922,9 +2906,6 @@ msgstr "מיין"
 msgid "Source"
 msgstr "מקור"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2963,6 +2944,9 @@ msgstr ""
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "אתחול"
 
@@ -3115,6 +3099,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3132,9 +3126,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr ""
 
@@ -3188,11 +3179,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3201,7 +3187,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3337,15 +3323,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "עוצמת שידור"
 
@@ -3518,12 +3495,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3553,16 +3524,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3577,12 +3547,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3656,6 +3620,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3718,9 +3685,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr ""
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3745,6 +3709,9 @@ msgstr "פועל"
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3796,6 +3763,15 @@ msgstr "כן"
 msgid "« Back"
 msgstr "<< אחורה"
 
+#~ msgid "Apply"
+#~ msgstr "החל"
+
+#~ msgid "Applying changes"
+#~ msgstr "מחיל הגדרות"
+
+#~ msgid "Configuration applied."
+#~ msgstr "הגדרות הוחלו"
+
 #~ msgid "Action"
 #~ msgstr "פעולה"
 
index e49b5303f065269b014795849ac9e98b8a4744d4..57f9c45abe7ca3d35b9bdfeeae2b589aa550b7af 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Terhelés (utolsó 1 perc):"
 
@@ -170,9 +173,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -209,9 +209,6 @@ msgstr "ATM eszközszám"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Elérési központ"
 
@@ -322,11 +319,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -405,11 +397,14 @@ msgstr "Antenna beállítások"
 msgid "Any zone"
 msgstr "Bármelyik zóna"
 
-msgid "Apply"
-msgstr "Alkalmaz"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Módosítások alkalmazása"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -425,6 +420,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Kapcsolódó kliensek"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -515,9 +513,6 @@ msgstr "Hibás címet adott meg!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -590,6 +585,9 @@ msgstr "Módosítások"
 msgid "Changes applied."
 msgstr "A módosítások alkalmazva."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr ""
 "Itt módosíthatja az eszköz eléréséhez szükséges adminisztrátori jelszót"
@@ -597,6 +595,11 @@ msgstr ""
 msgid "Channel"
 msgstr "Csatorna"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Ellenőrzés"
 
@@ -679,12 +682,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Beállítás"
 
-msgid "Configuration applied."
-msgstr "Beállítások alkalmazva."
-
 msgid "Configuration files will be kept."
 msgstr "A konfigurációs fájlok megmaradnak."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Megerősítés"
 
@@ -697,12 +703,15 @@ msgstr "Kapcsolódva"
 msgid "Connection Limit"
 msgstr "Kapcsolati korlát"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Kapcsolatok"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Ország"
 
@@ -831,9 +840,6 @@ msgstr "Alapértelmezett átjáró"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Alapértelmezett állapot"
 
@@ -875,6 +881,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnosztika"
 
@@ -909,6 +918,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Beérkező RFC1918 DHCP válaszok elvetése. "
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Csak azon csomagok megjelenítése, amelyek tartalmazzák"
 
@@ -1170,6 +1182,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fájl"
 
@@ -1293,7 +1308,7 @@ msgstr "Szabad hely"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1365,9 +1380,6 @@ msgstr "Befejezés"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1427,8 +1439,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 tűzfal"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN állapot"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 cím"
@@ -1478,15 +1490,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN állapot"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 cím"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2081,9 +2090,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Kijelölt NTP kiszolgálók"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Név"
 
@@ -2207,6 +2213,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Kikapcsolt állapot késleltetés"
 
@@ -2257,12 +2266,6 @@ msgstr "Beállítás eltávolítva"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2618,15 +2621,15 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr> kiszolgáló beállításához"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Biztosan törli az interfészt? A törlés nem visszavonható!\n"
 " Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az "
 "interfészen keresztül kapcsolódik."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Biztosan törli ezt a vezetéknélküli hálózatot? A törlés nem visszavonható!\n"
@@ -2638,7 +2641,7 @@ msgstr "Biztos, hogy visszavonja az összes módosítást?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Biztos, hogy leállítja a hálózatot?!\n"
@@ -2646,7 +2649,7 @@ msgstr ""
 "hálózaton keresztül kapcsolódik."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Biztos, hogy leállítja a \"%s\" interfészt?\n"
@@ -2740,9 +2743,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2802,6 +2802,15 @@ msgstr "Jelszó mutatása/elrejtése"
 msgid "Revert"
 msgstr "Visszavonás"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Gyökérkönyvtár"
 
@@ -2817,9 +2826,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2845,14 +2851,6 @@ msgstr "Fájlrendszer ellenőrzés futtatása"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2880,9 +2878,6 @@ msgstr "Mentés"
 msgid "Save & Apply"
 msgstr "Mentés & Alkalmazás"
 
-msgid "Save &#38; Apply"
-msgstr "Mentés &#38; Alkalmazás"
-
 msgid "Scan"
 msgstr "Felderítés"
 
@@ -2911,17 +2906,6 @@ msgstr "Kliensek szétválasztása"
 msgid "Server Settings"
 msgstr "Kiszolgáló beállításai"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Szolgáltatás neve"
 
@@ -3018,9 +3002,6 @@ msgstr "Sorbarendezés"
 msgid "Source"
 msgstr "Forrás"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Megadja az eszköz csatlakozási könyvtárát."
 
@@ -3062,6 +3043,9 @@ msgstr "Indítás"
 msgid "Start priority"
 msgstr "Indítás prioritása"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Rendszerindítás"
 
@@ -3226,6 +3210,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3252,9 +3246,6 @@ msgstr ""
 "ellenőrzéséhez.<br />Kattintson az alábbi \"Folytatás\" gombra a flash-elési "
 "eljárás elindításához."
 
-msgid "The following changes have been committed"
-msgstr "A következő módosítások lettek alkalmazva"
-
 msgid "The following changes have been reverted"
 msgstr "A következő módosítások lettek visszavonva"
 
@@ -3323,11 +3314,6 @@ msgstr ""
 "eléréséhez a beállításaitól függően szükséges lehet a számítógépe IP-címének "
 "megújítása."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3338,8 +3324,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Nincsenek aktív bérletek."
 
-msgid "There are no pending changes to apply!"
-msgstr "Nincsenek alkalmazásra váró módosítások!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Nincsenek visszavonásra váró változtatások!"
@@ -3494,15 +3480,6 @@ msgstr "Tunnel interfész"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Adóteljesítmény"
 
@@ -3682,12 +3659,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "DHCP kérés során küldendő 'Vendor Class'"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Ellenőrzés"
 
@@ -3719,16 +3690,15 @@ msgstr ""
 "WPA titkosításhoz kliens módnál 'wpa_supplicant', hozzáférési pont illetve "
 "ad-hoc módnál 'hostapd' telepítése szükséges."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Várakozás a változtatások alkalmazására..."
 
 msgid "Waiting for command to complete..."
 msgstr "Várakozás a parancs befejezésére..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3743,12 +3713,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3828,6 +3792,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "áthidalt"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "új:"
 
@@ -3892,9 +3859,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "helyi <abbr title=\"Domain Name System\">DNS</abbr> fájl"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3919,6 +3883,9 @@ msgstr "be"
 msgid "open"
 msgstr "nyitás"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3970,6 +3937,30 @@ msgstr "igen"
 msgid "« Back"
 msgstr "« Vissza"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN állapot"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN állapot"
+
+#~ msgid "Apply"
+#~ msgstr "Alkalmaz"
+
+#~ msgid "Applying changes"
+#~ msgstr "Módosítások alkalmazása"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Beállítások alkalmazva."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Mentés &#38; Alkalmazás"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "A következő módosítások lettek alkalmazva"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Nincsenek alkalmazásra váró módosítások!"
+
 #~ msgid "Action"
 #~ msgstr "Művelet"
 
index ce866d9e7b609f56316b7531434a687636310dae..214a73f568a70c7af455a5c925df38d17b9c44f5 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carico in 1 minuto:"
 
@@ -177,9 +180,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -216,9 +216,6 @@ msgstr "Numero dispositivo ATM "
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Accesso Concentratore"
 
@@ -331,11 +328,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -414,11 +406,14 @@ msgstr "Configurazione dell'Antenna"
 msgid "Any zone"
 msgstr "Qualsiasi Zona"
 
-msgid "Apply"
-msgstr "Applica"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Applica modifiche"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -434,6 +429,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Dispositivi Wi-Fi connessi"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -524,9 +522,6 @@ msgstr "E' stato specificato un indirizzo errato!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -598,12 +593,20 @@ msgstr "Modifiche"
 msgid "Changes applied."
 msgstr "Modifiche applicate."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Cambia la password di amministratore per accedere al dispositivo"
 
 msgid "Channel"
 msgstr "Canale"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Verifica"
 
@@ -684,12 +687,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configurazione"
 
-msgid "Configuration applied."
-msgstr "Configurazione salvata."
-
 msgid "Configuration files will be kept."
 msgstr "I file di configurazione verranno mantenuti."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Conferma"
 
@@ -702,12 +708,15 @@ msgstr "Connesso"
 msgid "Connection Limit"
 msgstr "Limite connessioni"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Connessioni"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Nazione"
 
@@ -836,9 +845,6 @@ msgstr "Gateway predefinito"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Stato Predefinito"
 
@@ -881,6 +887,9 @@ msgstr "Dispositivo in riavvio..."
 msgid "Device unreachable"
 msgstr "Dispositivo irraggiungibile"
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostica"
 
@@ -915,6 +924,9 @@ msgstr "Disabilitato (default)"
 msgid "Discard upstream RFC1918 responses"
 msgstr "Ignora risposte RFC1918 upstream"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Visualizza solo i pacchetti contenenti"
 
@@ -1174,6 +1186,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "File"
 
@@ -1295,7 +1310,7 @@ msgstr "Spazio libero"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1369,9 +1384,6 @@ msgstr "Hangup"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1432,8 +1444,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Firewall"
 
-msgid "IPv4 WAN Status"
-msgstr "Stato WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Indirizzi IPv4"
@@ -1483,15 +1495,12 @@ msgstr "Impostazioni IPv6"
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Stato WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Indirizzi IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2081,9 +2090,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Candidati server NTP"
 
-msgid "NTP sync time-out"
-msgstr "Sincronizzazione NTP scaduta"
-
 msgid "Name"
 msgstr "Nome"
 
@@ -2207,6 +2213,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2257,12 +2266,6 @@ msgstr "Opzione cancellata"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2616,30 +2619,35 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
+"Vuoi davvero rimuovere questa interfaccia? La rimozione non può essere ripristinata! "
+"Potresti perdere l'accesso a questo dispositivo se sei connesso con questa rete."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
+"Vuoi davvero rimuovere questa interfaccia wireless? La rimozione non può essere ripristinata! "
+"Potresti perdere l'accesso a questo dispositivo se sei connesso con questa rete."
 
 msgid "Really reset all changes?"
 msgstr "Azzerare veramente tutte le modifiche?"
 
-#, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
-"Vuoi davvero spegnere questa interfaccia \"%s\" ?\\nPotresti perdere "
-"l'accesso a questo router se stai usando questa interfaccia."
+"Vuoi davvero spegnere questa interfaccia? Potresti perdere l'accesso a "
+"questo router se sei connesso usando questa interfaccia."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
+"Vuoi davvero spegnere questa interfaccia \"%s\"? Potresti perdere l'accesso "
+"a questo router se stai usando questa interfaccia."
 
 msgid "Really switch protocol?"
 msgstr "Cambiare veramente il protocollo?"
@@ -2728,9 +2736,6 @@ msgstr "Richiede indirizzo-IPv6"
 msgid "Request IPv6-prefix of length"
 msgstr "Richiede prefisso-IPv6 di lunghezza"
 
-msgid "Require TLS"
-msgstr "Richiede TLS"
-
 msgid "Required"
 msgstr "Richiesto"
 
@@ -2789,6 +2794,15 @@ msgstr "Rivela/nascondi password"
 msgid "Revert"
 msgstr "Ripristina"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2804,9 +2818,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2832,14 +2843,6 @@ msgstr "Esegui controllo del filesystem"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2867,9 +2870,6 @@ msgstr "Salva"
 msgid "Save & Apply"
 msgstr "Salva & applica"
 
-msgid "Save &#38; Apply"
-msgstr "Salva &#38; Applica"
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2896,17 +2896,6 @@ msgstr "Isola utenti"
 msgid "Server Settings"
 msgstr "Impostazioni Server"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -3003,9 +2992,6 @@ msgstr "Ordina"
 msgid "Source"
 msgstr "Origine"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Specifica la cartella a cui è collegato il dispositivo in"
 
@@ -3048,6 +3034,9 @@ msgstr "Inizio"
 msgid "Start priority"
 msgstr "Priorità di avvio"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Avvio"
 
@@ -3212,6 +3201,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3233,9 +3232,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr "Le seguenti modifiche sono state annullate"
 
@@ -3293,11 +3289,6 @@ msgstr ""
 "address of your computer to reach the device again, depending on your "
 "settings."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3308,8 +3299,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Non ci sono contratti attivi."
 
-msgid "There are no pending changes to apply!"
-msgstr "Non ci sono cambiamenti pendenti da applicare!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Non ci sono cambiamenti pendenti da regredire"
@@ -3451,15 +3442,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3641,12 +3623,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Classe del Produttore da 'inviare al momento della richiesta DHCP"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Verifica"
 
@@ -3678,18 +3654,15 @@ msgstr ""
 "La crittografia WPA richiede wpa_supplicant (per la modalità client) o "
 "hostapd (per AP e modalità ad hoc) per essere installato."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Attendi sincro NTP quei dati secondi, immetti 0 per disabilitare l'attesa "
-"(opzionale)"
-
 msgid "Waiting for changes to be applied..."
 msgstr "In attesa delle modifiche da applicare ..."
 
 msgid "Waiting for command to complete..."
 msgstr "In attesa del comando da completare..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3704,12 +3677,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3790,6 +3757,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "ponte"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "crea:"
 
@@ -3854,9 +3824,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "File <abbr title=\"Sistema Nome Dominio\">DNS</abbr> locale"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3881,6 +3848,9 @@ msgstr "acceso"
 msgid "open"
 msgstr "apri"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3932,84 +3902,8 @@ msgstr "Sì"
 msgid "« Back"
 msgstr "« Indietro"
 
-#~ msgid "Action"
-#~ msgstr "Azione"
-
-#~ msgid "Buttons"
-#~ msgstr "Pulsanti"
-
-#~ msgid "Handler"
-#~ msgstr "Gestore"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Tempo massimo di attesa"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Velocità minima"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Specifica lo stato del pulsante da gestire"
-
-#~ msgid "Leasetime"
-#~ msgstr "Tempo di contratto"
-
-#, fuzzy
-#~ msgid "automatic"
-#~ msgstr "statico"
-
-#~ msgid "AR Support"
-#~ msgstr "Supporto AR"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Dispositivo Wireless Atheros 802.11%s"
-
-#~ msgid "Background Scan"
-#~ msgstr "Scansione in background"
-
-#~ msgid "Compression"
-#~ msgstr "Compressione"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Disabilita Timer Beacon HW"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Disabilita Probe-Responses"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Frame veloci"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Velocità massima"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Velocità minima"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Velocità multicast"
-
-#~ msgid "Separate WDS"
-#~ msgstr "WDS separati"
-
-#~ msgid "Static WDS"
-#~ msgstr "WDS statico"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Modalità turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Supporto XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Sarà creata una rete aggiuntiva se lasci questo senza spunta."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Aggiunta Rete: Impostazioni"
-
-#~ msgid "CPU"
-#~ msgstr "CPU"
-
-#~ msgid "Port %d"
-#~ msgstr "Porta %d"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Stato WAN IPv4"
 
-#~ msgid "VLAN Interface"
-#~ msgstr "Interfaccia VLAN"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Stato WAN IPv6"
index 07eeec5ee3d6fba083f7f8a2feb96e0e43fd9e45..75a18b746abfa000479a8e0a83ac74001af8fff1 100644 (file)
@@ -3,7 +3,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2009-06-10 03:40+0200\n"
-"PO-Revision-Date: 2018-05-03 00:23+0900\n"
+"PO-Revision-Date: 2018-06-01 02:42+0900\n"
 "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
@@ -49,6 +49,9 @@ msgstr "-- ラベルを指定 --"
 msgid "-- match by uuid --"
 msgstr "-- UUID を指定 --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "過去1分の負荷:"
 
@@ -175,9 +178,6 @@ msgstr "A43C + J43 + A43 + V43"
 msgid "ADSL"
 msgstr "ADSL"
 
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
 msgid "ANSI T1.413"
 msgstr "ANSI T1.413"
 
@@ -211,9 +211,6 @@ msgstr "ATMデバイス番号"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Access Concentrator"
 
@@ -321,11 +318,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr "許可されるIP"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr "常にデフォルト ルーターとして通知する"
 
@@ -406,11 +398,14 @@ msgstr "アンテナ設定"
 msgid "Any zone"
 msgstr "全てのゾーン"
 
-msgid "Apply"
-msgstr "適用"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr "適用リクエストはステータス <code>%h</code> により失敗しました"
+
+msgid "Apply unchecked"
+msgstr "チェックなしの適用"
 
-msgid "Applying changes"
-msgstr "変更を適用"
+msgid "Architecture"
+msgstr "アーキテクチャ"
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -426,6 +421,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "認証済み端末"
 
+msgid "Associations"
+msgstr "アソシエーション数"
+
 msgid "Auth Group"
 msgstr "認証グループ"
 
@@ -516,9 +514,6 @@ msgstr "無効なアドレスです!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -593,12 +588,22 @@ msgstr "変更"
 msgid "Changes applied."
 msgstr "変更が適用されました。"
 
+msgid "Changes have been reverted."
+msgstr "変更は取り消されました。"
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "デバイスの管理者パスワードを変更します"
 
 msgid "Channel"
 msgstr "チャネル"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+"チャンネル %d は、 %s 領域内では規制により利用できません。%d へ自動調整されま"
+"した。"
+
 msgid "Check"
 msgstr "チェック"
 
@@ -685,12 +690,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "設定"
 
-msgid "Configuration applied."
-msgstr "設定を適用しました。"
-
 msgid "Configuration files will be kept."
 msgstr "設定ファイルは保持されます。"
 
+msgid "Configuration has been applied."
+msgstr "設定が適用されました。"
+
+msgid "Configuration has been rolled back!"
+msgstr "設定はロールバックされました!"
+
 msgid "Confirmation"
 msgstr "確認"
 
@@ -703,12 +711,18 @@ msgstr "接続中"
 msgid "Connection Limit"
 msgstr "接続制限"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "TLSが使用できないとき、サーバーへの接続は失敗します。"
-
 msgid "Connections"
 msgstr "ネットワーク接続"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+"設定の変更を適用後、デバイスへのアクセスを回復できませんでした。もし IP アド"
+"レスや無線のセキュリティ認証情報などのネットワーク関連の設定を変更した場合、"
+"再接続が必要かもしれません。"
+
 msgid "Country"
 msgstr "国"
 
@@ -841,9 +855,6 @@ msgstr "デフォルト ゲートウェイ"
 msgid "Default is stateless + stateful"
 msgstr "デフォルトは ステートレス + ステートフル です。"
 
-msgid "Default route"
-msgstr "デフォルト ルート"
-
 msgid "Default state"
 msgstr "標準状態"
 
@@ -885,6 +896,9 @@ msgstr "デバイスを再起動中です..."
 msgid "Device unreachable"
 msgstr "デバイスに到達できません"
 
+msgid "Device unreachable!"
+msgstr "デバイスに到達できません!"
+
 msgid "Diagnostics"
 msgstr "診断機能"
 
@@ -919,6 +933,9 @@ msgstr "無効(デフォルト)"
 msgid "Discard upstream RFC1918 responses"
 msgstr "RFC1918の応答を破棄します"
 
+msgid "Dismiss"
+msgstr "警告の除去"
+
 msgid "Displaying only packages containing"
 msgstr "右記の文字列を含んだパッケージのみを表示中"
 
@@ -1180,6 +1197,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr "%d 秒以内の適用を確認できませんでした。ロールバック中です..."
+
 msgid "File"
 msgstr "ファイル"
 
@@ -1304,10 +1324,10 @@ msgstr "ディスクの空き容量"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "WireGuard インターフェースとピアについての詳細情報: <a href=\"http://"
-"wireguard.io\">wireguard.io</a>"
+"wireguard.com\">wireguard.com</a>"
 
 msgid "GHz"
 msgstr "GHz"
@@ -1378,9 +1398,6 @@ msgstr "再起動"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr "ハートビート"
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1438,8 +1455,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 ファイアウォール"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN ステータス"
+msgid "IPv4 Upstream"
+msgstr "IPv4 アップストリーム"
 
 msgid "IPv4 address"
 msgstr "IPv4 アドレス"
@@ -1489,15 +1506,12 @@ msgstr "IPv6 設定"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA-プレフィクス"
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN ステータス"
+msgid "IPv6 Upstream"
+msgstr "IPv6 アップストリーム"
 
 msgid "IPv6 address"
 msgstr "IPv6 アドレス"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2092,9 +2106,6 @@ msgstr "NT ドメイン"
 msgid "NTP server candidates"
 msgstr "NTPサーバー候補"
 
-msgid "NTP sync time-out"
-msgstr "NTP 同期タイムアウト"
-
 msgid "Name"
 msgstr "名前"
 
@@ -2220,6 +2231,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "消灯時間"
 
@@ -2271,12 +2285,6 @@ msgstr "削除されるオプション"
 msgid "Optional"
 msgstr "オプション"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2636,8 +2644,8 @@ msgstr ""
 "として<code>/etc/ethers</code> をロードします"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "本当にこのインターフェースを削除しますか?一度削除すると、元に戻すことはできま"
 "せん!\n"
@@ -2645,7 +2653,7 @@ msgstr ""
 "る場合があります。"
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "本当にこの無線ネットワークを削除しますか?一度削除すると、元に戻すことはできま"
@@ -2657,7 +2665,7 @@ msgid "Really reset all changes?"
 msgstr "本当に全ての変更をリセットしますか?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "本当にネットワークを停止しますか?\n"
@@ -2665,7 +2673,7 @@ msgstr ""
 "合があります。"
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "本当にインターフェース \"%s\" を停止しますか?\n"
@@ -2759,9 +2767,6 @@ msgstr "IPv6-アドレスのリクエスト"
 msgid "Request IPv6-prefix of length"
 msgstr "リクエストするIPv6-プレフィクス長"
 
-msgid "Require TLS"
-msgstr "TLSが必要"
-
 msgid "Required"
 msgstr "必須"
 
@@ -2822,6 +2827,15 @@ msgstr "パスワードを表示する/隠す"
 msgid "Revert"
 msgstr "元に戻す"
 
+msgid "Revert changes"
+msgstr "変更の取り消し"
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr "取り消しのリクエストはステータス <code>%h</code> により失敗しました"
+
+msgid "Reverting configuration…"
+msgstr "設定を元に戻しています..."
+
 msgid "Root"
 msgstr "ルート"
 
@@ -2837,9 +2851,6 @@ msgstr ""
 msgid "Route type"
 msgstr "ルート タイプ"
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr "ルーター アドバタイズメント-サービス"
 
@@ -2865,14 +2876,6 @@ msgstr "ファイルシステムチェックを行う"
 msgid "SHA256"
 msgstr "SHA256"
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr "SNR"
 
@@ -2900,9 +2903,6 @@ msgstr "保存"
 msgid "Save & Apply"
 msgstr "保存 & 適用"
 
-msgid "Save &#38; Apply"
-msgstr "保存 &#38; 適用"
-
 msgid "Scan"
 msgstr "スキャン"
 
@@ -2931,17 +2931,6 @@ msgstr "クライアントの分離"
 msgid "Server Settings"
 msgstr "サーバー設定"
 
-msgid "Server password"
-msgstr "サーバー パスワード"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr "サーバー ユーザー名"
-
 msgid "Service Name"
 msgstr "サービス名"
 
@@ -3037,9 +3026,6 @@ msgstr "ソート"
 msgid "Source"
 msgstr "送信元"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "デバイスが接続するディレクトリを設定します"
 
@@ -3078,6 +3064,9 @@ msgstr "開始"
 msgid "Start priority"
 msgstr "優先順位"
 
+msgid "Starting configuration apply…"
+msgstr "設定の適用を開始しています..."
+
 msgid "Startup"
 msgstr "スタートアップ"
 
@@ -3239,6 +3228,22 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr "設定ファイルは以下のエラーにより読み込めませんでした:"
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+"未適用の変更を適用後、デバイスは %d 秒以内に完了できなかった可能性がありま"
+"す。これは、安全上の理由によりロールバックされる設定に起因するものです。それ"
+"でも設定の変更が正しいと思う場合は、チェックなしの変更の適用を行ってくださ"
+"い。もしくは、再度適用を試行する前にこの警告を除去して設定内容の編集を行う"
+"か、現在動作している設定状況を維持するために未適用の変更を取り消してくださ"
+"い。"
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3264,9 +3269,6 @@ msgstr ""
 "イズです。オリジナルファイルと比較し、整合性を確認してください。<br />\"続行"
 "\"ボタンをクリックすると、更新処理を開始します。"
 
-msgid "The following changes have been committed"
-msgstr "以下の変更が適用されました"
-
 msgid "The following changes have been reverted"
 msgstr "以下の変更が取り消されました"
 
@@ -3331,11 +3333,6 @@ msgstr ""
 "わる可能性があるため、再接続時にあなたのコンピュータのIPアドレスを変更しなけ"
 "ればならない場合があります。"
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3347,8 +3344,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "リース中のIPアドレスはありません。"
 
-msgid "There are no pending changes to apply!"
-msgstr "é\81©ç\94¨ã\81\8cæ\9cªå®\8cäº\86ã\81®å¤\89æ\9b´ã\81¯ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ï¼\81"
+msgid "There are no changes to apply."
+msgstr "é\81©ç\94¨ã\81\99ã\82\8bå¤\89æ\9b´ã\81¯ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82"
 
 msgid "There are no pending changes to revert!"
 msgstr "復元が未完了の変更はありません!"
@@ -3504,15 +3501,6 @@ msgstr "トンネルインターフェース"
 msgid "Tunnel Link"
 msgstr "トンネルリンク"
 
-msgid "Tunnel broker protocol"
-msgstr "トンネルブローカー プロトコル"
-
-msgid "Tunnel setup server"
-msgstr "トンネルセットアップ サーバー"
-
-msgid "Tunnel type"
-msgstr "トンネルタイプ"
-
 msgid "Tx-Power"
 msgstr "送信電力"
 
@@ -3693,12 +3681,6 @@ msgstr "ベンダー"
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "DHCPリクエスト送信時のベンダークラスを設定"
 
-msgid "Verbose"
-msgstr "詳細"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "確認"
 
@@ -3731,16 +3713,15 @@ msgstr ""
 "hostapd (アクセスポイント及びアドホック) がインストールされている必要がありま"
 "す。"
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "変更を適用中です..."
 
 msgid "Waiting for command to complete..."
 msgstr "コマンド実行中です..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "設定を適用中です... %d 秒"
+
 msgid "Waiting for device..."
 msgstr "デバイスを起動中です..."
 
@@ -3755,12 +3736,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr "帯域幅"
 
@@ -3841,6 +3816,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "ブリッジ"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "作成:"
 
@@ -3905,9 +3883,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "ローカル <abbr title=\"Domain Name System\">DNS</abbr>ファイル"
 
-msgid "minimum 1280, maximum 1480"
-msgstr "最小値 1280、最大値 1480"
-
 msgid "minutes"
 msgstr "分"
 
@@ -3932,6 +3907,9 @@ msgstr "オン"
 msgid "open"
 msgstr "オープン"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "オーバーレイ"
 
index e4f77c78f59d80ce2ab84240c9324bcfcd5a3ed9..2206a87ceb0e2942f5b82dde235f01e148245e55 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 분 부하:"
 
@@ -168,9 +171,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -204,9 +204,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -311,11 +308,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -394,10 +386,13 @@ msgstr ""
 msgid "Any zone"
 msgstr ""
 
-msgid "Apply"
-msgstr "적용"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
+msgid "Architecture"
 msgstr ""
 
 msgid ""
@@ -414,6 +409,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "연결된 station 들"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -504,9 +502,6 @@ msgstr ""
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -580,12 +575,20 @@ msgstr "변경 사항"
 msgid "Changes applied."
 msgstr ""
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "장비 접근을 위한 관리자 암호를 변경합니다"
 
 msgid "Channel"
 msgstr ""
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr ""
 
@@ -664,10 +667,13 @@ msgstr ""
 msgid "Configuration"
 msgstr "설정"
 
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
+msgstr ""
+
+msgid "Configuration has been applied."
 msgstr ""
 
-msgid "Configuration files will be kept."
+msgid "Configuration has been rolled back!"
 msgstr ""
 
 msgid "Confirmation"
@@ -682,12 +688,15 @@ msgstr "연결 시간"
 msgid "Connection Limit"
 msgstr ""
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "연결"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr ""
 
@@ -818,9 +827,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "기본 상태"
 
@@ -863,6 +869,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "진단"
 
@@ -897,6 +906,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1149,6 +1161,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1270,7 +1285,7 @@ msgstr "여유 공간"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1342,9 +1357,6 @@ msgstr ""
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1403,8 +1415,8 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr "IPv4 방화벽"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN 상태"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 주소"
@@ -1454,13 +1466,10 @@ msgstr "IPv6 설정"
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN 상태"
-
-msgid "IPv6 address"
+msgid "IPv6 Upstream"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
+msgid "IPv6 address"
 msgstr ""
 
 msgid "IPv6 assignment hint"
@@ -2030,9 +2039,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "NTP 서버 목록"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "이름"
 
@@ -2156,6 +2162,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2207,12 +2216,6 @@ msgstr "삭제된 option"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2566,12 +2569,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-서버를 설정합니다"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2579,14 +2582,14 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "정말로 네트워크를 shutdown 하시겠습니까?\\n이 인터페이스를 통해 연결하였다면 "
 "접속이 끊어질 수 있습니다."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2677,9 +2680,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2738,6 +2738,15 @@ msgstr "암호 보이기/숨기기"
 msgid "Revert"
 msgstr "변경 취소"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2753,9 +2762,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2781,14 +2787,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2816,9 +2814,6 @@ msgstr "저장"
 msgid "Save & Apply"
 msgstr "저장 & 적용"
 
-msgid "Save &#38; Apply"
-msgstr "저장 &#38; 적용"
-
 msgid "Scan"
 msgstr "Scan 하기"
 
@@ -2845,17 +2840,6 @@ msgstr ""
 msgid "Server Settings"
 msgstr "서버 설정"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2948,9 +2932,6 @@ msgstr "순서"
 msgid "Source"
 msgstr ""
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2989,6 +2970,9 @@ msgstr "시작"
 msgid "Start priority"
 msgstr "시작 우선순위"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "시작 프로그램"
 
@@ -3146,6 +3130,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3163,9 +3157,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr "다음의 변경 사항들이 취소되었습니다"
 
@@ -3223,11 +3214,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3236,7 +3222,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3381,15 +3367,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3570,12 +3547,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "DHCP 요청시 전송할 Vendor Class"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3605,16 +3576,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "변경 사항이 적용되기를 기다리는 중입니다..."
 
 msgid "Waiting for command to complete..."
 msgstr "실행한 명령이 끝나기를 기다리는 중입니다..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3629,12 +3599,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3712,6 +3676,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3776,9 +3743,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "local <abbr title=\"Domain Name System\">DNS</abbr> 파일"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3803,6 +3767,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3854,5 +3821,17 @@ msgstr ""
 msgid "« Back"
 msgstr ""
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN 상태"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN 상태"
+
+#~ msgid "Apply"
+#~ msgstr "적용"
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "저장 &#38; 적용"
+
 #~ msgid "Leasetime"
 #~ msgstr "임대 시간"
index d5c889580b0c74842eb0da56a189d30ea4a74e4d..79c66e1306f1c18b1ed67ee7b0c5dd5b76b4ccd8 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -165,9 +168,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -201,9 +201,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -306,11 +303,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -389,11 +381,14 @@ msgstr ""
 msgid "Any zone"
 msgstr ""
 
-msgid "Apply"
-msgstr "Melaksanakan"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Melaksanakan perubahan"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -409,6 +404,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Associated Stesen"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -499,9 +497,6 @@ msgstr ""
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -570,12 +565,20 @@ msgstr "Laman"
 msgid "Changes applied."
 msgstr "Laman diterapkan."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr ""
 
 msgid "Channel"
 msgstr "Saluran"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr ""
 
@@ -646,10 +649,13 @@ msgstr ""
 msgid "Configuration"
 msgstr "Konfigurasi"
 
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
 msgstr ""
 
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
 msgstr ""
 
 msgid "Confirmation"
@@ -664,10 +670,13 @@ msgstr ""
 msgid "Connection Limit"
 msgstr "Sambungan Batas"
 
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
 msgstr ""
 
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
 msgstr ""
 
 msgid "Country"
@@ -796,9 +805,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr ""
 
@@ -838,6 +844,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -870,6 +879,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1121,6 +1133,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1242,7 +1257,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1314,9 +1329,6 @@ msgstr "Menutup"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1374,7 +1386,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1425,15 +1437,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2010,9 +2019,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nama"
 
@@ -2136,6 +2142,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2186,12 +2195,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2542,12 +2545,12 @@ msgid ""
 msgstr "Baca /etc/ethers untuk mengkonfigurasikan DHCP-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2555,12 +2558,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2651,9 +2654,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2712,6 +2712,15 @@ msgstr ""
 msgid "Revert"
 msgstr "Kembali"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2727,9 +2736,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2755,14 +2761,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2790,9 +2788,6 @@ msgstr "Simpan"
 msgid "Save & Apply"
 msgstr "Simpan & Melaksanakan"
 
-msgid "Save &#38; Apply"
-msgstr ""
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2819,17 +2814,6 @@ msgstr "Pisahkan Pelanggan"
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2922,9 +2906,6 @@ msgstr ""
 msgid "Source"
 msgstr "Sumber"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2963,6 +2944,9 @@ msgstr "Mula"
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3115,6 +3099,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3136,9 +3130,6 @@ msgstr ""
 "integriti data.<br /> Klik butang terus di bawah untuk memulakan prosedur "
 "flash."
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr "Laman berikut telah kembali"
 
@@ -3196,11 +3187,6 @@ msgstr ""
 "anda perlu mengemas kini alamat komputer anda untuk mencapai peranti lagi, "
 "bergantung pada tetapan anda."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3211,7 +3197,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3352,15 +3338,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3533,12 +3510,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3570,16 +3541,15 @@ msgstr ""
 "WPA-Enkripsi memerlukan pemohan wpa (untuk mod pelanggan) atau hostapd "
 "(untuk AP dan mod ad-hoc) yang akan dipasangkan."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3594,12 +3564,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3673,6 +3637,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3735,9 +3702,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "Fail DNS tempatan"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3762,6 +3726,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3813,6 +3780,12 @@ msgstr ""
 msgid "« Back"
 msgstr "« Kembali"
 
+#~ msgid "Apply"
+#~ msgstr "Melaksanakan"
+
+#~ msgid "Applying changes"
+#~ msgstr "Melaksanakan perubahan"
+
 #~ msgid "Action"
 #~ msgstr "Aksi"
 
index 1805d8e990c81564fa113a3a2bd27d0d04a9200d..5fd40001ec1af341ef691b9696df1c8c1d669d87 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 minutts belastning:"
 
@@ -167,9 +170,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -210,9 +210,6 @@ msgstr "<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> enhetsnummer"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Tilgangskonsentrator"
 
@@ -315,11 +312,6 @@ msgstr "Tillat oppstrøms svar i 127.0.0.0/8 nettet, f.eks for RBL tjenester"
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -398,11 +390,14 @@ msgstr "Antennekonfigurasjon"
 msgid "Any zone"
 msgstr "Alle soner"
 
-msgid "Apply"
-msgstr "Bruk"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Utfører endringer"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -418,6 +413,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Tilkoblede Klienter"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -508,9 +506,6 @@ msgstr "Ugyldig adresse oppgitt!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -582,12 +577,20 @@ msgstr "Endringer"
 msgid "Changes applied."
 msgstr "Endringer utført."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Endrer administrator passordet for tilgang til enheten"
 
 msgid "Channel"
 msgstr "Kanal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Kontroller"
 
@@ -668,12 +671,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Konfigurasjon"
 
-msgid "Configuration applied."
-msgstr "Konfigurasjons endring utført."
-
 msgid "Configuration files will be kept."
 msgstr "Konfigurasjonsfiler vil bli bevart."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Bekreftelse"
 
@@ -686,12 +692,15 @@ msgstr "Tilkoblet"
 msgid "Connection Limit"
 msgstr "Tilkoblingsgrense (antall)"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Tilkoblinger"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Land"
 
@@ -820,9 +829,6 @@ msgstr "Standard gateway"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Standard tilstand"
 
@@ -864,6 +870,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Nettverksdiagnostikk"
 
@@ -898,6 +907,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Forkast oppstrøms RFC1918 svar"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Viser bare pakker som inneholder"
 
@@ -1157,6 +1169,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fil"
 
@@ -1279,7 +1294,7 @@ msgstr "Ledig plass"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1351,9 +1366,6 @@ msgstr "Slå av"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1413,8 +1425,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Brannmur"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN Status"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 adresse"
@@ -1464,15 +1476,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN Status"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 adresse"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2055,9 +2064,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "NTP server kandidater"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Navn"
 
@@ -2181,6 +2187,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Forsinkelse ved tilstand Av"
 
@@ -2232,12 +2241,6 @@ msgstr "Innstilling fjernet"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2593,15 +2596,15 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\n"
 "Du kan miste kontakten med ruteren om du er tilkoblet via dette "
 "grensesnittet."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Fjerne dette trådløse nettverket? Slettingen kan ikke omgjøres!\n"
@@ -2612,7 +2615,7 @@ msgstr "Vil du nullstille alle endringer?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Slå av dette nettverket ?\n"
@@ -2620,7 +2623,7 @@ msgstr ""
 "grensesnittet."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Slå av dette grensesnittet \"%s\" ?\n"
@@ -2714,9 +2717,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2775,6 +2775,15 @@ msgstr "Vis/Skjul passord"
 msgid "Revert"
 msgstr "Tilbakestill"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Rot"
 
@@ -2790,9 +2799,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2818,14 +2824,6 @@ msgstr "Kjør filsystem sjekk"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2853,9 +2851,6 @@ msgstr "Lagre"
 msgid "Save & Apply"
 msgstr "Lagre & Aktiver"
 
-msgid "Save &#38; Apply"
-msgstr "Lagre &#38; Aktiver"
-
 msgid "Scan"
 msgstr "Skann"
 
@@ -2884,17 +2879,6 @@ msgstr "Separerte Klienter"
 msgid "Server Settings"
 msgstr "Server Innstillinger"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Tjeneste navn"
 
@@ -2991,9 +2975,6 @@ msgstr "Sortering"
 msgid "Source"
 msgstr "Kilde"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Hvor lagrings enheten blir tilsluttet filsystemet (f.eks. /mnt/sda1)"
 
@@ -3033,6 +3014,9 @@ msgstr "Start"
 msgid "Start priority"
 msgstr "Start prioritet"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Oppstart"
 
@@ -3197,6 +3181,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3222,9 +3216,6 @@ msgstr ""
 "sammenlign dem med den opprinnelige filen for å sikre dataintegriteten.<br /"
 "> Klikk \"Fortsett\" nedenfor for å starte flash prosedyren."
 
-msgid "The following changes have been committed"
-msgstr "Følgende endringer er foretatt"
-
 msgid "The following changes have been reverted"
 msgstr "Følgende endringer er forkastet"
 
@@ -3292,11 +3283,6 @@ msgstr ""
 "du prøver å koble til igjen. Det kan være nødvendig å fornye ip-adressen til "
 "datamaskinen din for å nå enheten på nytt. (avhengig av innstillingene dine)"
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3307,8 +3293,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Det er ingen aktive leieavtaler."
 
-msgid "There are no pending changes to apply!"
-msgstr "Det finnes ingen endringer som kan utføres!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Det finnes ingen endriger å reversere!"
@@ -3459,15 +3445,6 @@ msgstr "Tunnel grensesnitt"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Tx-Styrke"
 
@@ -3647,12 +3624,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Leverandør klasse som sendes ved DHCP spørring"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Bekreft"
 
@@ -3684,16 +3655,15 @@ msgstr ""
 "WPA-Kryptering krever at wpa_supplicant (for klient-modus) eller hostapd "
 "(for AP og ad-hoc-modus) er installert."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Venter på at endringer utføres..."
 
 msgid "Waiting for command to complete..."
 msgstr "Venter på at kommando fullføres..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3708,12 +3678,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3793,6 +3757,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "brokoblet"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "opprett:"
 
@@ -3857,9 +3824,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "lokal <abbr title=\"Domain Navn System\">DNS</abbr>-fil"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3884,6 +3848,9 @@ msgstr "på"
 msgid "open"
 msgstr "åpen"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3935,6 +3902,30 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Tilbake"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN Status"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN Status"
+
+#~ msgid "Apply"
+#~ msgstr "Bruk"
+
+#~ msgid "Applying changes"
+#~ msgstr "Utfører endringer"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Konfigurasjons endring utført."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Lagre &#38; Aktiver"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "Følgende endringer er foretatt"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Det finnes ingen endringer som kan utføres!"
+
 #~ msgid "Action"
 #~ msgstr "Handling"
 
index 390e489e29ffc3e232dc53b238ba33600eda3b8f..9d685c58c0b7b0a0968d45fcc472a29669bb6c5e 100644 (file)
@@ -3,7 +3,7 @@ msgstr ""
 "Project-Id-Version: LuCI\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-04-20 09:40+0200\n"
-"PO-Revision-Date: 2018-05-14 20:05+0200\n"
+"PO-Revision-Date: 2018-06-10 10:05+0200\n"
 "Last-Translator: Rixerx <krystian.kozak20@gmail.com>\n"
 "Language-Team: Polish\n"
 "Language: pl\n"
@@ -50,6 +50,9 @@ msgstr "-- dopasuj po etykiecie --"
 msgid "-- match by uuid --"
 msgstr "-- dopasuj po uuid --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Obciążenie 1 min.:"
 
@@ -162,8 +165,8 @@ msgid ""
 "<br/>Note: you need to manually restart the cron service if the crontab file "
 "was empty before editing."
 msgstr ""
-"<br/>Uwaga: musisz ręcznie zrestartować usługę cron, jeśli plik crontab "
-"był pusty przed edycją."
+"<br/>Uwaga: musisz ręcznie zrestartować usługę cron, jeśli plik crontab był "
+"pusty przed edycją."
 
 msgid "A43C + J43 + A43"
 msgstr ""
@@ -174,9 +177,6 @@ msgstr ""
 msgid "ADSL"
 msgstr "ADSL"
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -205,9 +205,9 @@ msgid ""
 "Linux network interfaces which can be used in conjunction with DHCP or PPP "
 "to dial into the provider network."
 msgstr ""
-"Mosty ATM eksponują enkapsulowaną sieć Ethernet w połączeniach AAL5 jako wirtualne "
-"interfejsy sieciowe systemu Linux, które mogą być używane w połączeniu z protokołem "
-"DHCP lub PPP w celu polączenia się z siecią dostawcy."
+"Mosty ATM eksponują enkapsulowaną sieć Ethernet w połączeniach AAL5 jako "
+"wirtualne interfejsy sieciowe systemu Linux, które mogą być używane w "
+"połączeniu z protokołem DHCP lub PPP w celu polączenia się z siecią dostawcy."
 
 msgid "ATM device number"
 msgstr "Numer urządzenia ATM"
@@ -215,9 +215,6 @@ msgstr "Numer urządzenia ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 # co to takiego?
 msgid "Access Concentrator"
 msgstr "Koncentrator dostępowy ATM"
@@ -290,7 +287,8 @@ msgstr "Alarm"
 msgid ""
 "Allocate IP addresses sequentially, starting from the lowest available "
 "address"
-msgstr "Przydziel sekwencyjnie adresy IP, zaczynając od najmniejszego dostępnego"
+msgstr ""
+"Przydziel sekwencyjnie adresy IP, zaczynając od najmniejszego dostępnego"
 
 msgid "Allocate IP sequentially"
 msgstr "Przydzielaj adresy IP po kolei"
@@ -311,7 +309,8 @@ msgid "Allow localhost"
 msgstr "Pozwól tylko sobie (localhost)"
 
 msgid "Allow remote hosts to connect to local SSH forwarded ports"
-msgstr "Zezwalaj zdalnym hostom na łączenie się z lokalnie przekazywanymi portami SSH"
+msgstr ""
+"Zezwalaj zdalnym hostom na łączenie się z lokalnie przekazywanymi portami SSH"
 
 msgid "Allow root logins with password"
 msgstr "Zezwól na logowanie roota przy pomocy hasła"
@@ -327,11 +326,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr "Dozwolone adresy IP"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr "Zawsze rozgłaszaj domyślny router"
 
@@ -381,13 +375,13 @@ msgid "Annex M G.992.5"
 msgstr ""
 
 msgid "Announce as default router even if no public prefix is available."
-msgstr ""
+msgstr "Rozgłaszaj jako domyślny router nawet jeśli publiczny prefiks nie jest dostępny."
 
 msgid "Announced DNS domains"
-msgstr ""
+msgstr "Rozgłaszaj domeny DNS"
 
 msgid "Announced DNS servers"
-msgstr ""
+msgstr "Rozgłaszaj serwery DNS"
 
 msgid "Anonymous Identity"
 msgstr ""
@@ -410,15 +404,19 @@ msgstr "Ustawienia anteny"
 msgid "Any zone"
 msgstr "Dowolna strefa"
 
-msgid "Apply"
-msgstr "Zatwierdź"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Wprowadzam zmiany"
+msgid "Architecture"
+msgstr "Architektura"
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
+"Przypisz część danej długości każdego publicznego prefiksu IPv6 do tego interfejsu"
 
 msgid "Assign interfaces..."
 msgstr "Przypisz interfejsy..."
@@ -426,10 +424,14 @@ msgstr "Przypisz interfejsy..."
 msgid ""
 "Assign prefix parts using this hexadecimal subprefix ID for this interface."
 msgstr ""
+"Przypisz cześć prefiksu za pomocą szesnastkowego ID subprefiksu dla tego interfejsu"
 
 msgid "Associated Stations"
 msgstr "Połączone stacje"
 
+msgid "Associations"
+msgstr "Połączeni"
+
 msgid "Auth Group"
 msgstr ""
 
@@ -521,9 +523,6 @@ msgstr "Wprowadzono zły adres"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -537,7 +536,7 @@ msgid "Bind interface"
 msgstr ""
 
 msgid "Bind only to specific interfaces rather than wildcard address."
-msgstr ""
+msgstr "Powiąż tylko ze specyficznymi interfejsami, a nie z adresami wieloznacznymi."
 
 msgid "Bind the tunnel to this interface (optional)."
 msgstr ""
@@ -596,12 +595,20 @@ msgstr "Zmiany"
 msgid "Changes applied."
 msgstr "Zmiany zostały zastosowane."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Zmienia hasło administratora"
 
 msgid "Channel"
 msgstr "Kanał"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Sprawdź"
 
@@ -678,17 +685,24 @@ msgid ""
 "workaround might cause interoperability issues and reduced robustness of key "
 "negotiation especially in environments with heavy traffic load."
 msgstr ""
-"Komplikuje atak ponownej instalacji klucza po stronie klienta, wyłączając retransmisję ramek klucza EAPOL, które są używane do instalowania kluczy. To obejście może powodować problemy z interoperacyjnością i zmniejszoną odporność kluczowych negocjacji, szczególnie w środowiskach o dużym natężeniu ruchu."
+"Komplikuje atak ponownej instalacji klucza po stronie klienta, wyłączając "
+"retransmisję ramek klucza EAPOL, które są używane do instalowania kluczy. To "
+"obejście może powodować problemy z interoperacyjnością i zmniejszoną "
+"odporność kluczowych negocjacji, szczególnie w środowiskach o dużym "
+"natężeniu ruchu."
 
 msgid "Configuration"
 msgstr "Konfiguracja"
 
-msgid "Configuration applied."
-msgstr "Konfiguracja została zastosowana."
-
 msgid "Configuration files will be kept."
 msgstr "Pliki konfiguracyjne zostaną zachowane."
 
+msgid "Configuration has been applied."
+msgstr "Konfiguracja została zastosowana."
+
+msgid "Configuration has been rolled back!"
+msgstr "Konfiguracja została wycofana!"
+
 msgid "Confirmation"
 msgstr "Potwierdzenie"
 
@@ -701,12 +715,15 @@ msgstr "Połączony"
 msgid "Connection Limit"
 msgstr "Limit połączeń"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Połączenia"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Kraj"
 
@@ -753,6 +770,8 @@ msgid ""
 "Custom files (certificates, scripts) may remain on the system. To prevent "
 "this, perform a factory-reset first."
 msgstr ""
+"Własne pliki (certyfikaty, skrypty) mogą pozostać w systemie. Aby zapobiec "
+"temu, wykonaj najpierw reset do ustawień fabrycznych"
 
 msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
@@ -783,10 +802,10 @@ msgid "DHCPv6 client"
 msgstr "Klient DHCPv6"
 
 msgid "DHCPv6-Mode"
-msgstr ""
+msgstr "Tryb DHCPv6"
 
 msgid "DHCPv6-Service"
-msgstr ""
+msgstr "Serwis DHCPv6"
 
 msgid "DNS"
 msgstr "DNS"
@@ -801,7 +820,7 @@ msgid "DNSSEC"
 msgstr ""
 
 msgid "DNSSEC check unsigned"
-msgstr ""
+msgstr "Sprawdzanie DNSSEC bez podpisu"
 
 msgid "DPD Idle Timeout"
 msgstr ""
@@ -834,10 +853,7 @@ msgid "Default gateway"
 msgstr "Brama domyślna"
 
 msgid "Default is stateless + stateful"
-msgstr ""
-
-msgid "Default route"
-msgstr ""
+msgstr "Domyślnie jest to stateless + stateful"
 
 msgid "Default state"
 msgstr "Stan domyślny"
@@ -881,6 +897,9 @@ msgstr "Urządzenie jest uruchamiane ponownie ..."
 msgid "Device unreachable"
 msgstr "Urządzenie nieosiągalne"
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnostyka"
 
@@ -915,6 +934,9 @@ msgstr "Wyłączone (domyślnie)"
 msgid "Discard upstream RFC1918 responses"
 msgstr "Odrzuć wychodzące odpowiedzi RFC1918"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Pokazuję tylko paczki zawierające"
 
@@ -1037,7 +1059,9 @@ msgstr "Włącz"
 msgid ""
 "Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
 "snooping"
-msgstr "Włącz nasłuchiwanie <abbr title=\"Internet Group Management Protocol\">IGMP</abbr>"
+msgstr ""
+"Włącz nasłuchiwanie <abbr title=\"Internet Group Management Protocol\">IGMP</"
+"abbr>"
 
 msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
 msgstr "Włącz <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1102,8 +1126,9 @@ msgstr "Włącz nasłuchiwanie IGMP na tym moście"
 msgid ""
 "Enables fast roaming among access points that belong to the same Mobility "
 "Domain"
-msgstr "Aktywuje szybki roaming pomiędzy punktami dostępowymi, które należą "
-"do tej samej domeny"
+msgstr ""
+"Aktywuje szybki roaming pomiędzy punktami dostępowymi, które należą do tej "
+"samej domeny"
 
 msgid "Enables the Spanning Tree Protocol on this bridge"
 msgstr ""
@@ -1162,13 +1187,13 @@ msgid "External R1 Key Holder List"
 msgstr ""
 
 msgid "External system log server"
-msgstr "Zewnętrzny serwer dla logów systemowych"
+msgstr "Serwer zewnętrzny dla logów systemowych"
 
 msgid "External system log server port"
-msgstr "Port zewnętrznego serwera dla logów systemowych"
+msgstr "Port zewnętrznego serwera logów systemowych"
 
 msgid "External system log server protocol"
-msgstr "Protokół zewnętrznego serwera dla logów systemowych"
+msgstr "Protokół zewnętrznego serwera logów systemowych"
 
 msgid "Extra SSH command options"
 msgstr ""
@@ -1182,6 +1207,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Plik"
 
@@ -1304,7 +1332,7 @@ msgstr "Wolna przestrzeń"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1349,7 +1377,7 @@ msgid "Global Settings"
 msgstr ""
 
 msgid "Global network options"
-msgstr ""
+msgstr "Globalne opcje sieciowe"
 
 msgid "Go to password configuration..."
 msgstr "Przejdź do konfiguracji hasła..."
@@ -1378,9 +1406,6 @@ msgstr "Rozłącz"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1443,8 +1468,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Status IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr "Protokół IPv4"
 
 msgid "IPv4 address"
 msgstr "Adres IPv4"
@@ -1489,25 +1514,22 @@ msgid "IPv6 Neighbours"
 msgstr ""
 
 msgid "IPv6 Settings"
-msgstr ""
+msgstr "Ustawienia IPv6"
 
 msgid "IPv6 ULA-Prefix"
-msgstr ""
+msgstr "IPv6 Prefiks-ULA"
 
-msgid "IPv6 WAN Status"
-msgstr "Status WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr "Protokół IPv6"
 
 msgid "IPv6 address"
 msgstr "Adres IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
-msgstr ""
+msgstr "Wskazówka przypisania IPv6"
 
 msgid "IPv6 assignment length"
-msgstr ""
+msgstr "Długość przydziału IPv6"
 
 msgid "IPv6 gateway"
 msgstr "Brama IPv6"
@@ -1525,7 +1547,7 @@ msgid "IPv6 routed prefix"
 msgstr ""
 
 msgid "IPv6 suffix"
-msgstr ""
+msgstr "Sufiks IPv6"
 
 msgid "IPv6-Address"
 msgstr "Adres IPv6"
@@ -1623,7 +1645,8 @@ msgid "Install"
 msgstr "Instaluj"
 
 msgid "Install iputils-traceroute6 for IPv6 traceroute"
-msgstr "Zainstaluj iputils-traceroute6 w celu skorzystania z traceroute dla iPv6"
+msgstr ""
+"Zainstaluj iputils-traceroute6 w celu skorzystania z traceroute dla iPv6"
 
 msgid "Install package %q"
 msgstr "Instaluj pakiet %q"
@@ -1783,7 +1806,7 @@ msgid "Limit"
 msgstr "Limit"
 
 msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
-msgstr ""
+msgstr "Ogranicz usługi DNS do podsieci interfejsów, na których obsługujemy DNS."
 
 msgid "Limit listening to these interfaces, and loopback."
 msgstr "Ogranicz nasłuchiwanie do tych interfesjów, oraz loopbacku."
@@ -1867,7 +1890,7 @@ msgid "Local IPv6 address"
 msgstr "Lokalny adres IPv6"
 
 msgid "Local Service Only"
-msgstr ""
+msgstr "Tylko serwis lokalny"
 
 msgid "Local Startup"
 msgstr "Lokalny autostart"
@@ -1888,7 +1911,7 @@ msgstr ""
 
 msgid "Local domain suffix appended to DHCP names and hosts file entries"
 msgstr ""
-"Przyrostek (suffiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts"
+"Przyrostek (sufiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts"
 
 msgid "Local server"
 msgstr "Serwer lokalny"
@@ -1958,8 +1981,8 @@ msgid ""
 "Make sure to clone the root filesystem using something like the commands "
 "below:"
 msgstr ""
-"Upewnij się, że klonujesz główny system plików, używając czegoś podobnego "
-"do poleceń poniżej:"
+"Upewnij się, że klonujesz główny system plików, używając czegoś podobnego do "
+"poleceń poniżej:"
 
 msgid "Manual"
 msgstr ""
@@ -2088,7 +2111,7 @@ msgid "NCM"
 msgstr "NCM"
 
 msgid "NDP-Proxy"
-msgstr ""
+msgstr "Proxy NDP"
 
 msgid "NT Domain"
 msgstr ""
@@ -2096,9 +2119,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Lista serwerów NTP"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nazwa"
 
@@ -2178,7 +2198,7 @@ msgid "Non Pre-emtive CRC errors (CRC_P)"
 msgstr ""
 
 msgid "Non-wildcard"
-msgstr ""
+msgstr "Bez symboli wieloznacznych"
 
 msgid "None"
 msgstr "Brak"
@@ -2208,7 +2228,8 @@ msgid "Nslookup"
 msgstr "Nslookup"
 
 msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
-msgstr ""
+msgstr "Liczba buforowanych wpisów DNS (max wynosi 10000, 0 oznacza "
+"brak pamięci podręcznej)"
 
 msgid "OK"
 msgstr "OK"
@@ -2222,6 +2243,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Zwłoka wyłączenia"
 
@@ -2272,12 +2296,6 @@ msgstr "Usunięto wartość"
 msgid "Optional"
 msgstr "Opcjonalny"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2289,6 +2307,10 @@ msgid ""
 "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') "
 "for the interface."
 msgstr ""
+"Opcjonalne. Dopuszczalne wartości: 'eui64', 'random', stałe wartości takie jak " 
+"'::1' lub '::1:2'. Kiedy prefiks IPv6 (taki jak 'a:b:c:d::') jest odbierany z serwera "
+"delegującego, użyj sufiksa (takiego jak '::1') aby utworzyć adres IPv6 ('a:b:c:d::1') "
+"dla tego interfejsu."
 
 msgid ""
 "Optional. Base64-encoded preshared key. Adds in an additional layer of "
@@ -2581,7 +2603,7 @@ msgid "Public prefix routed to this device for distribution to clients."
 msgstr ""
 
 msgid "QMI Cellular"
-msgstr ""
+msgstr "Komórkowy QMI"
 
 msgid "Quality"
 msgstr "Jakość"
@@ -2633,15 +2655,15 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Naprawdę usunąć ten interfejs? Usunięcie nie może zostać cofnięte!\n"
 "Możesz stracić dostęp do tego urządzenia, jeśli jesteś połączony przez ten "
 "interfejs!"
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Naprawdę usunąć tę sieć bezprzewodową? Usunięcie nie może zostać cofnięte!\n"
@@ -2653,7 +2675,7 @@ msgstr "Naprawdę usunąć wszelkie zmiany?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Naprawdę wyłączyć tę sieć?\n"
@@ -2661,7 +2683,7 @@ msgstr ""
 "interfejs!"
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Naprawdę wyłączyć interfejs \"%s\"?\n"
@@ -2755,9 +2777,6 @@ msgstr "Zażądaj adresu IPv6"
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr "Wymagaj TLS"
-
 msgid "Required"
 msgstr "Wymagany"
 
@@ -2784,7 +2803,8 @@ msgstr ""
 msgid ""
 "Requires upstream supports DNSSEC; verify unsigned domain responses really "
 "come from unsigned domains"
-msgstr ""
+msgstr "Wymagane jest wsparcie dla DNSSEC; sprawdzanie, czy niepodpisane "
+"odpowiedzi w domenie rzeczywiście pochodzą z domen bez znaku"
 
 msgid "Reset"
 msgstr "Resetuj"
@@ -2816,6 +2836,15 @@ msgstr "Odsłoń/Ukryj hasło"
 msgid "Revert"
 msgstr "Przywróć"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Root"
 
@@ -2829,13 +2858,10 @@ msgid "Route Allowed IPs"
 msgstr ""
 
 msgid "Route type"
-msgstr ""
-
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
+msgstr "Typ trasy"
 
 msgid "Router Advertisement-Service"
-msgstr ""
+msgstr "Serwis rozgłoszeniowy routera"
 
 msgid "Router Password"
 msgstr "Hasło routera"
@@ -2860,14 +2886,6 @@ msgstr "Sprawdź czy system plików nie zawiera błędów"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr "SNR"
 
@@ -2895,9 +2913,6 @@ msgstr "Zapisz"
 msgid "Save & Apply"
 msgstr "Zapisz i zastosuj"
 
-msgid "Save &#38; Apply"
-msgstr "Zapisz i zastosuj"
-
 msgid "Scan"
 msgstr "Skanuj"
 
@@ -2927,17 +2942,6 @@ msgstr "Rozdziel klientów"
 msgid "Server Settings"
 msgstr "Ustawienia serwera"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Nazwa serwisu"
 
@@ -2951,8 +2955,8 @@ msgid ""
 "Set interface properties regardless of the link carrier (If set, carrier "
 "sense events do not invoke hotplug handlers)."
 msgstr ""
-"Ustaw właściwości interfejsu, niezależnie od operatora łącza (nie wpływa"
-" na programy operatora które ustanawiają połączenie)."
+"Ustaw właściwości interfejsu, niezależnie od operatora łącza (nie wpływa na "
+"programy operatora które ustanawiają połączenie)."
 
 #, fuzzy
 msgid "Set up Time Synchronization"
@@ -2992,7 +2996,7 @@ msgid "Size (.ipk)"
 msgstr ""
 
 msgid "Size of DNS query cache"
-msgstr ""
+msgstr "Rozmiar pamięci podręcznej zapytań DNS"
 
 msgid "Skip"
 msgstr "Pomiń"
@@ -3010,7 +3014,7 @@ msgid "Software"
 msgstr "Oprogramowanie"
 
 msgid "Software VLAN"
-msgstr "VLAN programowy"
+msgstr "Programowy VLAN"
 
 msgid "Some fields are invalid, cannot save values!"
 msgstr "Wartości pewnych pól są niewłaściwe, nie mogę ich zachować!"
@@ -3036,9 +3040,6 @@ msgstr "Posortuj"
 msgid "Source"
 msgstr "Źródło"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Podaje katalog do którego jest podłączone urządzenie"
 
@@ -3080,6 +3081,9 @@ msgstr "Uruchomienie"
 msgid "Start priority"
 msgstr "Priorytet uruchomienia"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Autostart"
 
@@ -3121,10 +3125,10 @@ msgid "Submit"
 msgstr "Wyślij"
 
 msgid "Suppress logging"
-msgstr ""
+msgstr "Pomiń rejestrowanie"
 
 msgid "Suppress logging of the routine operation of these protocols"
-msgstr ""
+msgstr "Pomiń rejestrowanie rutynowych operacji dla tych protokołów"
 
 msgid "Swap"
 msgstr ""
@@ -3246,6 +3250,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3273,9 +3287,6 @@ msgstr ""
 "upewnić się, że został przesłany poprawnie.<br /> Wciśnij \"Wykonaj\" aby "
 "kontynuować aktualizację."
 
-msgid "The following changes have been committed"
-msgstr "Następujące zmiany zostały zatwierdzone"
-
 msgid "The following changes have been reverted"
 msgstr "Następujące zmiany zostały odrzucone"
 
@@ -3345,11 +3356,6 @@ msgstr ""
 "ustawień może być konieczne odnowienie adresu Twojego komputera, aby dostać "
 "się do urządzenia."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3360,8 +3366,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Brak aktywnych dzierżaw."
 
-msgid "There are no pending changes to apply!"
-msgstr "Brak oczekujących zmian do zastosowania!"
+msgid "There are no changes to apply."
+msgstr "Nie ma żadnych zmian do zastosowania."
 
 msgid "There are no pending changes to revert!"
 msgstr "Brak oczekujących zmian do przywrócenia!"
@@ -3391,6 +3397,9 @@ msgid ""
 "'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
 "Name System\">DNS</abbr> servers."
 msgstr ""
+"Ten plik może zawierać linie takie jak 'server=/domain/1.2.3.4' lub "
+"'server=1.2.3.4' dla specyficznych dla domeny lub pełnych serwerów "
+"<abbr title=\"Domain Name System\">DNS</abbr>"
 
 msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
@@ -3471,8 +3480,8 @@ msgid ""
 "To restore configuration files, you can upload a previously generated backup "
 "archive here."
 msgstr ""
-"Aby przywrócić pliki konfiguracyjne, możesz tutaj przesłać wcześniej utworzoną "
-"kopię zapasową."
+"Aby przywrócić pliki konfiguracyjne, możesz przesłać tutaj wcześniej "
+"utworzoną kopię zapasową."
 
 msgid "Tone"
 msgstr ""
@@ -3516,15 +3525,6 @@ msgstr "Interfejs tunelu"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr "Typ tunelu"
-
 msgid "Tx-Power"
 msgstr "Moc nadawania"
 
@@ -3582,8 +3582,9 @@ msgid ""
 "compatible firmware image)."
 msgstr ""
 "Prześlij tutaj obraz zgodny z funkcją sysupgrade, aby zastąpić aktualnie "
-"działające opragramowanie. Zaznacz opcję \"Zachowaj ustawienia\", aby zachować "
-"bieżącą konfigurację (wymagany obraz zgodny z bieżącym opragramowaniem)."
+"działające opragramowanie. Zaznacz opcję \"Zachowaj ustawienia\", aby "
+"zachować bieżącą konfigurację (wymagany obraz zgodny z bieżącym "
+"opragramowaniem)."
 
 msgid "Upload archive..."
 msgstr "Załaduj archiwum..."
@@ -3705,12 +3706,6 @@ msgstr "Producent"
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Klasa producenta do wysłania podczas żądania DHCP"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Zweryfikuj"
 
@@ -3739,12 +3734,8 @@ msgid ""
 "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
 "and ad-hoc mode) to be installed."
 msgstr ""
-"Kodowanie WPA wymaga zainstalowanych modułów wpa_supplicant (tryb "
-"klienta) lub hostapd (tryb AP lub ad-hoc)"
-
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
+"Kodowanie WPA wymaga zainstalowanych modułów wpa_supplicant (tryb klienta) "
+"lub hostapd (tryb AP lub ad-hoc)"
 
 msgid "Waiting for changes to be applied..."
 msgstr "Trwa wprowadzenie zmian..."
@@ -3752,6 +3743,9 @@ msgstr "Trwa wprowadzenie zmian..."
 msgid "Waiting for command to complete..."
 msgstr "Trwa wykonanie polecenia..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "Oczekiwanie na zastosowanie konfiguracji… %ds"
+
 msgid "Waiting for device..."
 msgstr "Oczekiwanie na urządzenie..."
 
@@ -3759,20 +3753,15 @@ msgid "Warning"
 msgstr "Ostrzeżenie"
 
 msgid "Warning: There are unsaved changes that will get lost on reboot!"
-msgstr "Ostrzeżenie: Istnieją niezapisane zmiany, które zostaną utracone "
-"po ponownym uruchomieniu urządzenia!"
+msgstr ""
+"Ostrzeżenie: Istnieją niezapisane zmiany, które zostaną utracone po ponownym "
+"uruchomieniu urządzenia!"
 
 msgid ""
 "When using a PSK, the PMK can be generated locally without inter AP "
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr "Szerokość"
 
@@ -3839,9 +3828,9 @@ msgid ""
 "upgrade it to at least version 7 or use another browser like Firefox, Opera "
 "or Safari."
 msgstr ""
-"Twój Internet Explorer jest za stary, aby poprawnie wyświetlić tę stronę"
+"Twój Internet Explorer jest za stary, aby poprawnie wyświetlić tę stronę "
 "zaktualizuj go do wersji co najmniej 7 lub użyj innej przeglądarki, takiej "
-"jak Firefox, Opera czy Safari".
+"jak Firefox, Opera czy Safari."
 
 msgid "any"
 msgstr "dowolny"
@@ -3855,6 +3844,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "zmostkowany"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "utwórz:"
 
@@ -3919,9 +3911,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "lokalny plik <abbr title=\"Domain Name System\">DNS</abbr>"
 
-msgid "minimum 1280, maximum 1480"
-msgstr "minimum 1280, maksimum 1480"
-
 msgid "minutes"
 msgstr "minuty"
 
@@ -3947,6 +3936,9 @@ msgstr "włączone"
 msgid "open"
 msgstr "otwarte"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3998,101 +3990,8 @@ msgstr "tak"
 msgid "« Back"
 msgstr "« Wróć"
 
-#~ msgid "Action"
-#~ msgstr "Akcja"
-
-#~ msgid "Buttons"
-#~ msgstr "Przyciski"
-
-#~ msgid "Handler"
-#~ msgstr "Uchwyt"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Maksymalny czas podtrzymania"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Minimalny czas podtrzymania"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr ""
-#~ "Ścieżka do pliku wykonywalnego, który obsługuje zdarzenie dla danego "
-#~ "przycisku"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Określa zachowanie w zależności od stanu przycisku"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr ""
-#~ "Poniższa strona umożliwia konfigurację działania niestandardowych "
-#~ "przycisków"
-
-#~ msgid "Leasetime"
-#~ msgstr "Czas dzierżawy"
-
-# Wydaje mi się że brakuje litery R...
-#~ msgid "AR Support"
-#~ msgstr "Wsparcie dla ARP"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Bezprzewodowy kontroler Atheros 802.11%s"
-
-#~ msgid "Background Scan"
-#~ msgstr "Skanowanie w tle"
-
-#~ msgid "Compression"
-#~ msgstr "Kompresja"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Wyłącz zegar HW-Beacon"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Nie wysyłaj ramek probe response"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Szybkie ramki (Fast Frames)"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Maksymalna Szybkość"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Minimalna Szybkość"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Szybkość Multicast`u"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Kanały zewnętrzne"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Domena regulacji"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Rozdziel WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Statyczny WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Tryb Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Wsparcie XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr ""
-#~ "Zostanie utworzona dodatkowa sieć jeśli zostawisz tą opcję niezaznaczoną."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Przyłącz do sieci: Ustawienia"
-
-#~ msgid "CPU"
-#~ msgstr "CPU"
-
-#~ msgid "Port %d"
-#~ msgstr "Port %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Port %d jest nietagowany w wielu VLAN`ach!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Status IPv4 WAN"
 
-#~ msgid "VLAN Interface"
-#~ msgstr "Interfejs VLAN"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Status WAN IPv6"
index a51d11d2a5bf183278500df222da16eb5c5863b9..fde8be16a71f815c76549ea013de7d44282594b5 100644 (file)
@@ -51,6 +51,9 @@ msgstr ""
 "-- casar por <abbr title=\"Universal Unique IDentifier/Identificador Único "
 "Universal\">UUID</abbr> --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carga 1 Minuto:"
 
@@ -185,11 +188,6 @@ msgstr ""
 "<abbr title=\"Assymetrical Digital Subscriber Line/Linha Digital Assimétrica "
 "para Assinante\">ADSL</abbr>"
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-"<abbr title=\"Automatic IPv6 Connectivity Client Utility/Utilitário Cliente "
-"de Conectividade IPv6 Automática\">AICCU (SIXXS)</abbr>"
-
 msgid "ANSI T1.413"
 msgstr "ANSI T1.413"
 
@@ -232,9 +230,6 @@ msgstr "Número do dispositivo ATM"
 msgid "ATU-C System Vendor ID"
 msgstr "Identificador de"
 
-msgid "AYIYA"
-msgstr "AYIYA"
-
 msgid "Access Concentrator"
 msgstr "Concentrador de Acesso"
 
@@ -348,13 +343,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr "Endereços IP autorizados"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"Veja também a <a href=\"https://www.sixxs.net/faq/connectivity/?"
-"faq=comparison\">Comparação de Tunelamentos</a> em SIXXS"
-
 msgid "Always announce default router"
 msgstr "Sempre anuncie o roteador padrão"
 
@@ -434,11 +422,14 @@ msgstr "configuração de antena"
 msgid "Any zone"
 msgstr "Qualquer zona"
 
-msgid "Apply"
-msgstr "Aplicar"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Aplicar as alterações"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -458,6 +449,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estações associadas"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Grupo de Autenticação"
 
@@ -552,9 +546,6 @@ msgstr "Endereço especificado está incorreto!"
 msgid "Band"
 msgstr "Banda"
 
-msgid "Behind NAT"
-msgstr "Atrás da NAT"
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -631,12 +622,20 @@ msgstr "Alterações"
 msgid "Changes applied."
 msgstr "Alterações aplicadas."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Muda a senha do administrador para acessar este dispositivo"
 
 msgid "Channel"
 msgstr "Canal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Verificar"
 
@@ -719,12 +718,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configuração"
 
-msgid "Configuration applied."
-msgstr "Configuração aplicada."
-
 msgid "Configuration files will be kept."
 msgstr "Os arquivos de configuração serão mantidos."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmação"
 
@@ -737,12 +739,15 @@ msgstr "Conectado"
 msgid "Connection Limit"
 msgstr "Limite de conexão"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "A conexão para este servidor falhará quando o TLS não puder ser usado"
-
 msgid "Connections"
 msgstr "Conexões"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "País"
 
@@ -873,9 +878,6 @@ msgstr "Roteador Padrão"
 msgid "Default is stateless + stateful"
 msgstr "O padrão é sem estado + com estado"
 
-msgid "Default route"
-msgstr "Rota padrão"
-
 msgid "Default state"
 msgstr "Estado padrão"
 
@@ -918,6 +920,9 @@ msgstr "O dispositivo está reiniciando..."
 msgid "Device unreachable"
 msgstr "Dispositivo não alcançável"
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnóstico"
 
@@ -953,6 +958,9 @@ msgid "Discard upstream RFC1918 responses"
 msgstr ""
 "Descartar respostas de servidores externos para redes privadas (RFC1918)"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Mostre somente os pacotes contendo"
 
@@ -1222,6 +1230,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Arquivo"
 
@@ -1348,10 +1359,10 @@ msgstr "Espaço livre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "Mais informações sobre interfaces e parceiros WireGuard em <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "GHz"
@@ -1426,9 +1437,6 @@ msgstr ""
 "Erros de Código de Erro de Cabeçalho (<abbr title=\"Header Error Code\">HEC</"
 "abbr>)"
 
-msgid "Heartbeat"
-msgstr "Pulso de vida"
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1494,8 +1502,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall para IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estado IPv4 da WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Endereço IPv4"
@@ -1547,15 +1555,12 @@ msgstr ""
 "Prefixo <abbr title=\"Unique Local Address/Endereço Local Único\">ULA</abbr> "
 "IPv6"
 
-msgid "IPv6 WAN Status"
-msgstr "Estado IPv6 da WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Endereço IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr "Endereços IPv6 delegados para o ponta local do túnel (opcional)"
-
 msgid "IPv6 assignment hint"
 msgstr "Sugestão de atribuição IPv6"
 
@@ -2179,9 +2184,6 @@ msgstr "Domínio NT"
 msgid "NTP server candidates"
 msgstr "Candidatos a servidor NTP"
 
-msgid "NTP sync time-out"
-msgstr "Tempo limite da sincronia do NTP"
-
 msgid "Name"
 msgstr "Nome"
 
@@ -2307,6 +2309,9 @@ msgstr "Senha Ofuscada do Grupo"
 msgid "Obfuscated Password"
 msgstr "Senha Ofuscada"
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Atraso no estado de desligado"
 
@@ -2359,13 +2364,6 @@ msgstr "Opção removida"
 msgid "Optional"
 msgstr "Opcional"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-"Opcional, especifique para sobrescrever o servidor padrão (tic.sixxs.net)"
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr "Opcional, para usar quando a conta SIXXS tem mais de um túnel"
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2734,15 +2732,15 @@ msgstr ""
 "\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Realmente excluir esta interface? A exclusão não pode ser desfeita!\n"
 " Você poderá perder o acesso a este dispositivo se você estiver conectado "
 "através desta interface."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Realmente excluir esta interface Wireless? A exclusão não pode ser "
@@ -2754,7 +2752,7 @@ msgid "Really reset all changes?"
 msgstr "Realmente limpar todas as mudanças?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Realmente desligar esta rede\"%s\" ?\n"
@@ -2762,7 +2760,7 @@ msgstr ""
 "através desta interface."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Realmente desligar esta interface\"%s\" ?\n"
@@ -2856,9 +2854,6 @@ msgstr "Solicita endereço IPv6"
 msgid "Request IPv6-prefix of length"
 msgstr "Solicita prefixo IPv6 de tamanho"
 
-msgid "Require TLS"
-msgstr "Requer TLS"
-
 msgid "Required"
 msgstr "Necessário"
 
@@ -2923,6 +2918,15 @@ msgstr "Relevar/esconder senha"
 msgid "Revert"
 msgstr "Reverter"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Raiz"
 
@@ -2938,9 +2942,6 @@ msgstr "Roteie Andereços IP Autorizados"
 msgid "Route type"
 msgstr "Tipo de rota"
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "Prefixo roteável IPv6 para interfaces internas"
-
 msgid "Router Advertisement-Service"
 msgstr "Serviço de Anúncio de Roteador"
 
@@ -2967,16 +2968,6 @@ msgstr "Execute a verificação do sistema de arquivos "
 msgid "SHA256"
 msgstr "SHA256"
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-"O SIXXS suporta somente TIC. Use o 6in4 para túneis estáticos usando o "
-"protocolo IP 41 (RFC4213)"
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr "Identificador do SIXXS[/Identificador do Túnel]"
-
 msgid "SNR"
 msgstr "SNR"
 
@@ -3004,9 +2995,6 @@ msgstr "Salvar"
 msgid "Save & Apply"
 msgstr "Salvar & Aplicar"
 
-msgid "Save &#38; Apply"
-msgstr "Save &#38; Aplicar"
-
 msgid "Scan"
 msgstr "Procurar"
 
@@ -3035,19 +3023,6 @@ msgstr "Isolar Clientes"
 msgid "Server Settings"
 msgstr "Configurações do Servidor"
 
-msgid "Server password"
-msgstr "Senha do servidor"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-"Senha do servidor. Informe a senha para este túnel quando o nome do usuário "
-"contiver o identificador do túnel"
-
-msgid "Server username"
-msgstr "Usuário do servidor"
-
 msgid "Service Name"
 msgstr "Nome do Serviço"
 
@@ -3145,9 +3120,6 @@ msgstr "Ordenar"
 msgid "Source"
 msgstr "Origem"
 
-msgid "Source routing"
-msgstr "Roteamento pela origem"
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Especifica o diretório que o dispositivo está conectado"
 
@@ -3194,6 +3166,9 @@ msgstr "Iniciar"
 msgid "Start priority"
 msgstr "Prioridade de iniciação"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Iniciação"
 
@@ -3363,6 +3338,16 @@ msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 "O arquivo de configuração não pode ser carregado devido ao seguinte erro:"
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3389,9 +3374,6 @@ msgstr ""
 "garantir a integridade dos dados. <br /> Clique em \"Proceder\" para iniciar "
 "o procedimetno de gravação."
 
-msgid "The following changes have been committed"
-msgstr "As seguintes mudanças foram aplicadas"
-
 msgid "The following changes have been reverted"
 msgstr "As seguintes alterações foram revertidas"
 
@@ -3460,13 +3442,6 @@ msgstr ""
 "da sua configuração, pode ser necessário renovar o endereço do seu "
 "computador para poder conectar novamente ao roteador."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-"O final do túnel está atrás de um NAT. Por padrão será desabilitado e "
-"somente se aplica a AYIYA"
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3477,8 +3452,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Não existem alocações ativas."
 
-msgid "There are no pending changes to apply!"
-msgstr "Não existem modificações pendentes para aplicar!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Não existem modificações pendentes para reverter!"
@@ -3638,15 +3613,6 @@ msgstr "Interface de Tunelamento"
 msgid "Tunnel Link"
 msgstr "Enlace do túnel"
 
-msgid "Tunnel broker protocol"
-msgstr "Protocolo do agente do túnel"
-
-msgid "Tunnel setup server"
-msgstr "Servidor de configuração do túnel"
-
-msgid "Tunnel type"
-msgstr "Tipo de túnel"
-
 msgid "Tx-Power"
 msgstr "Potência de transmissão"
 
@@ -3833,12 +3799,6 @@ msgstr "Fabricante"
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Classe do fabricante para enviar quando requisitar o DHCP"
 
-msgid "Verbose"
-msgstr "Detalhado"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Habilite registros detalhados do serviço AICCU"
-
 msgid "Verify"
 msgstr "Verificar"
 
@@ -3870,18 +3830,15 @@ msgstr ""
 "A cifragem WPA requer a instalação do wpa_supplicant (para modo cliente) ou "
 "do hostapd (para modo AP ou ad-hoc)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Espere esta quantidade de segundos pela sincronia do NTP. Definindo como 0 "
-"desabilita a espera (opcional)"
-
 msgid "Waiting for changes to be applied..."
 msgstr "Esperando a aplicação das mudanças..."
 
 msgid "Waiting for command to complete..."
 msgstr "Esperando o término do comando..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr "Esperando pelo dispositivo..."
 
@@ -3896,12 +3853,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr "Se deve criar uma rota padrão IPv6 sobre o túnel"
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "Se deve rotear somente pacotes de prefixos delegados"
-
 msgid "Width"
 msgstr "Largura"
 
@@ -3985,6 +3936,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "em ponte"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "criar"
 
@@ -4050,9 +4004,6 @@ msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr ""
 "Arquivo local de <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
 
-msgid "minimum 1280, maximum 1480"
-msgstr "mínimo 1280, máximo 1480"
-
 msgid "minutes"
 msgstr "minutos"
 
@@ -4078,6 +4029,9 @@ msgstr "ligado"
 msgid "open"
 msgstr "aberto"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "sobreposição"
 
@@ -4129,116 +4083,8 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
-#~ msgid "Action"
-#~ msgstr "Ação"
-
-#~ msgid "Buttons"
-#~ msgstr "Botões"
-
-# Não sei que contexto isto está sendo usado
-#~ msgid "Handler"
-#~ msgstr "Responsável"
-
-# Desconheço o uso
-#~ msgid "Maximum hold time"
-#~ msgstr "Tempo máximo de espera"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Tempo mínimo de espera"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "Caminho para o executável que trata o evento do botão"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Especifica o estado do botão para ser tratado"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr ""
-#~ "Esta página permite a configuração de ações personalizadas para os botões"
-
-#~ msgid "Leasetime"
-#~ msgstr "Tempo de atribuição do DHCP"
-
-#~ msgid "Optional."
-#~ msgstr "Opcional."
-
-#~ msgid "navigation Navigation"
-#~ msgstr "navegação Navegação"
-
-#~ msgid "skiplink1 Skip to navigation"
-#~ msgstr "skiplink1 Pular para a navegação"
-
-#~ msgid "skiplink2 Skip to content"
-#~ msgstr "skiplink2 Pular para o conteúdo"
-
-#~ msgid "AuthGroup"
-#~ msgstr "Grupo de Autenticação"
-
-#~ msgid "automatic"
-#~ msgstr "automático"
-
-#~ msgid "AR Support"
-#~ msgstr "Suporte AR"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Controlador Wireless Atheros 802.11%s"
-
-#~ msgid "Background Scan"
-#~ msgstr "Busca em Segundo Plano"
-
-#~ msgid "Compression"
-#~ msgstr "Compressão"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Desativar temporizador de Beacon de Hardware"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Não enviar respostas de exames"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Quadros Rápidos"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Taxa Máxima"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Taxa Mínima"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Taxa de Multicast"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Canais para externo"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Domínio Regulatório"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Separar WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "WDS Estático"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Modo Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Suporte a XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Uma rede adicional será criada se você deixar isto desmarcado."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Conectar à Rede: Configurações"
-
-#~ msgid "CPU"
-#~ msgstr "CPU"
-
-#~ msgid "Port %d"
-#~ msgstr "Porta %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Porta %d está sem etiqueta para mútliplas VLANs!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado IPv4 da WAN"
 
-#~ msgid "VLAN Interface"
-#~ msgstr "Interface VLAN"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado IPv6 da WAN"
index 843a4cac86e4923d482cbc77cf947411b2c9bbc6..28c13c819475c700845afca82430cb6823926552 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carga de 1 Minuto:"
 
@@ -177,9 +180,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -216,9 +216,6 @@ msgstr "Número de Dispositivo ATM"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Concentrador de Acesso"
 
@@ -328,11 +325,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -411,11 +403,14 @@ msgstr "Configuração das Antenas"
 msgid "Any zone"
 msgstr "Qualquer zona"
 
-msgid "Apply"
-msgstr "Aplicar"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "A aplicar as alterações"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -431,6 +426,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estações Associadas"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -521,9 +519,6 @@ msgstr "Endereço mal especificado!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -595,12 +590,20 @@ msgstr "Alterações"
 msgid "Changes applied."
 msgstr "Alterações aplicadas."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Altera a password de administrador para acesso ao dispositivo"
 
 msgid "Channel"
 msgstr "Canal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Verificar"
 
@@ -681,12 +684,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configuração"
 
-msgid "Configuration applied."
-msgstr "Configuração aplicada."
-
 msgid "Configuration files will be kept."
 msgstr "Os ficheiros de configuração serão mantidos."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmação"
 
@@ -699,12 +705,15 @@ msgstr "Ligado"
 msgid "Connection Limit"
 msgstr "Limite de Ligações"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Ligações"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "País"
 
@@ -833,9 +842,6 @@ msgstr "Gateway predefinido"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Estado predefinido"
 
@@ -878,6 +884,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnósticos"
 
@@ -912,6 +921,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "Descartar respostas RFC1918 a montante"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Mostrar somente pacotes contendo"
 
@@ -1175,6 +1187,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Ficheiro"
 
@@ -1296,7 +1311,7 @@ msgstr "Espaço livre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1369,9 +1384,6 @@ msgstr "Suspender"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1434,8 +1446,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estado WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Endereço IPv4"
@@ -1485,15 +1497,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Estado WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Endereço IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2079,9 +2088,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "Candidatos a servidor NTP"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nome"
 
@@ -2205,6 +2211,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Atraso do Off-State"
 
@@ -2256,12 +2265,6 @@ msgstr "Opção removida"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2613,15 +2616,15 @@ msgstr ""
 "\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Deseja mesmo apagar esta interface? A eliminação não poder desfeita!\n"
 "Pode perde a ligação ao dispositivo, caso esta ligado através desta "
 "interface."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Deseja mesmo apagar esta rede? A eliminação não poder desfeita!\n"
@@ -2632,14 +2635,14 @@ msgstr "Deseja mesmo limpar todas as alterações?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Deseja mesmo desligar esta rede?\n"
 "Pode perder o acesso ao dispositivo se estiver ligado através desta rede."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Deseja mesmo desligar a interface \"%s\" ?\n"
@@ -2733,9 +2736,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2794,6 +2794,15 @@ msgstr "Revelar/esconder password"
 msgid "Revert"
 msgstr "Reverter"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2809,9 +2818,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2838,14 +2844,6 @@ msgstr "Correr uma verificação do sistema de ficheiros"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2873,9 +2871,6 @@ msgstr "Salvar"
 msgid "Save & Apply"
 msgstr "Salvar & Aplicar"
 
-msgid "Save &#38; Apply"
-msgstr "Salvar &#38; Aplicar"
-
 msgid "Scan"
 msgstr "Procurar"
 
@@ -2902,17 +2897,6 @@ msgstr "Isolar Clientes"
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Nome do Serviço"
 
@@ -3006,9 +2990,6 @@ msgstr "Ordenar"
 msgid "Source"
 msgstr "Origem"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -3047,6 +3028,9 @@ msgstr "Iniciar"
 msgid "Start priority"
 msgstr "Prioridade de inicialização"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3202,6 +3186,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3227,9 +3221,6 @@ msgstr ""
 "compare com o ficheiro original para assegurar a integração de dados.<br /> "
 "Click em \"Proceder\" para iniciar o procedimento."
 
-msgid "The following changes have been committed"
-msgstr "As seguintes alterações foram escritas"
-
 msgid "The following changes have been reverted"
 msgstr "Foram recuperadas as seguintes alterações "
 
@@ -3299,11 +3290,6 @@ msgstr ""
 "da sua configuração, ode ser necessário renovar o endereço do seu computador "
 "para poder ligar novamente ao router."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3314,8 +3300,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Não há concessões ativas."
 
-msgid "There are no pending changes to apply!"
-msgstr "Não há alterações pendentes para aplicar!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Não há alterações pendentes para reverter!"
@@ -3460,15 +3446,6 @@ msgstr "Interface de Túnel"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Potência de Tx"
 
@@ -3641,12 +3618,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Verificar"
 
@@ -3678,16 +3649,15 @@ msgstr ""
 "A encriptação-WPA necessita do wpa_supplicant (para modo cliente) ou do "
 "hostapd (para modo AP ou ah-hoc) esteja instalado."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "A aguardar que as mudanças sejam aplicadas..."
 
 msgid "Waiting for command to complete..."
 msgstr "A aguardar que o comando termine..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3702,12 +3672,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3788,6 +3752,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "criar:"
 
@@ -3853,9 +3820,6 @@ msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr ""
 "Ficheiro local de <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3880,6 +3844,9 @@ msgstr "ligado"
 msgid "open"
 msgstr "abrir"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3931,6 +3898,30 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado WAN IPv6"
+
+#~ msgid "Apply"
+#~ msgstr "Aplicar"
+
+#~ msgid "Applying changes"
+#~ msgstr "A aplicar as alterações"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configuração aplicada."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Salvar &#38; Aplicar"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "As seguintes alterações foram escritas"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Não há alterações pendentes para aplicar!"
+
 #~ msgid "Action"
 #~ msgstr "Acção"
 
index 748bfdbc5390ee6739b06fab029929aa663a6348..1e596adc7e61e0817409844153746895daba431b 100644 (file)
@@ -48,6 +48,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Incarcarea in ultimul minut"
 
@@ -168,9 +171,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -207,9 +207,6 @@ msgstr "ATM numar echipament"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Concentrator de Access "
 
@@ -314,11 +311,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -397,11 +389,14 @@ msgstr "Configurarea Antenei"
 msgid "Any zone"
 msgstr "Orice Zona"
 
-msgid "Apply"
-msgstr "Aplica"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Se aplica modificarile"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -417,6 +412,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Statiile asociate"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -507,9 +505,6 @@ msgstr "Adresa specificata gresit !"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -578,12 +573,20 @@ msgstr "Modificari"
 msgid "Changes applied."
 msgstr "Modificari aplicate."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Schimba parola administratorului pentru accesarea dispozitivului"
 
 msgid "Channel"
 msgstr "Canal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Verificare"
 
@@ -656,12 +659,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Configurare"
 
-msgid "Configuration applied."
-msgstr "Configurarea aplicata."
-
 msgid "Configuration files will be kept."
 msgstr "Fisierele de configurare vor fi pastrate."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Confirmare"
 
@@ -674,12 +680,15 @@ msgstr "Conectat"
 msgid "Connection Limit"
 msgstr "Limita de conexiune"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Conexiuni"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Tara"
 
@@ -806,9 +815,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "Stare implicita"
 
@@ -848,6 +854,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Diagnosticuri"
 
@@ -882,6 +891,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1127,6 +1139,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fisier"
 
@@ -1249,7 +1264,7 @@ msgstr "Spatiu liber"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1321,9 +1336,6 @@ msgstr ""
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1381,8 +1393,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Statusul IPv4 pe WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Adresa IPv4"
@@ -1432,15 +1444,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Statusul IPv6 pe WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Adresa IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2009,9 +2018,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Nume"
 
@@ -2135,6 +2141,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2180,12 +2189,6 @@ msgstr "Optiunea eliminata"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2537,12 +2540,12 @@ msgstr ""
 "<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>-"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2550,12 +2553,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2646,9 +2649,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2707,6 +2707,15 @@ msgstr "Arata / ascunde parola"
 msgid "Revert"
 msgstr ""
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2722,9 +2731,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2748,14 +2754,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2783,9 +2781,6 @@ msgstr "Salveaza"
 msgid "Save & Apply"
 msgstr "Salveaza si aplica"
 
-msgid "Save &#38; Apply"
-msgstr "Salveaza &#38; Aplica"
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2812,17 +2807,6 @@ msgstr ""
 msgid "Server Settings"
 msgstr "Setarile serverului"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "Nume serviciu"
 
@@ -2916,9 +2900,6 @@ msgstr ""
 msgid "Source"
 msgstr "Sursa"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2957,6 +2938,9 @@ msgstr "Start"
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Pornire"
 
@@ -3106,6 +3090,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3123,9 +3117,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr ""
 
@@ -3178,11 +3169,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3191,8 +3177,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
-msgstr "Nu exista modificari in asteptare de aplicat !"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Nu exista modificari in asteptare de anulat !"
@@ -3328,15 +3314,6 @@ msgstr "Interfata de tunel"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "Puterea TX"
 
@@ -3509,12 +3486,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3546,16 +3517,15 @@ msgstr ""
 "Criptarea WPA necesita wpa_supplicant (pentru modul client) sau hostapd "
 "(pentru modul AP sau ad-hoc) instalate."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3570,12 +3540,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3649,6 +3613,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3711,9 +3678,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr ""
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3738,6 +3702,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3789,6 +3756,27 @@ msgstr "da"
 msgid "« Back"
 msgstr "« Inapoi"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Statusul IPv4 pe WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Statusul IPv6 pe WAN"
+
+#~ msgid "Apply"
+#~ msgstr "Aplica"
+
+#~ msgid "Applying changes"
+#~ msgstr "Se aplica modificarile"
+
+#~ msgid "Configuration applied."
+#~ msgstr "Configurarea aplicata."
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "Salveaza &#38; Aplica"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "Nu exista modificari in asteptare de aplicat !"
+
 #~ msgid "Action"
 #~ msgstr "Actiune"
 
index 35a697620ed832fbe9e9ad04cb832b19947638b0..78488225869df71ff5fffc4d36c568f05f33f42e 100644 (file)
@@ -51,6 +51,9 @@ msgstr "-- проверка по метке --"
 msgid "-- match by uuid --"
 msgstr "-- проверка по uuid --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Загрузка за 1 минуту:"
 
@@ -177,9 +180,6 @@ msgstr "A43C + J43 + A43 + V43"
 msgid "ADSL"
 msgstr "ADSL"
 
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
 msgid "ANSI T1.413"
 msgstr "ANSI T1.413"
 
@@ -216,9 +216,6 @@ msgstr "ATM номер устройства"
 msgid "ATU-C System Vendor ID"
 msgstr "ATU-C System Vendor ID"
 
-msgid "AYIYA"
-msgstr "AYIYA"
-
 msgid "Access Concentrator"
 msgstr "Концентратор доступа"
 
@@ -330,13 +327,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr "Разрешенные IP-адреса"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"Также смотрите <a href=\"https://www.sixxs.net/faq/connectivity/?"
-"faq=comparison\">Tunneling Comparison</a> on SIXXS"
-
 msgid "Always announce default router"
 msgstr "Объявлять всегда, как дефолтный маршрутизатор"
 
@@ -417,11 +407,14 @@ msgstr "Настройка антенн"
 msgid "Any zone"
 msgstr "Любая зона"
 
-msgid "Apply"
-msgstr "Принять"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Применение изменений"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -441,6 +434,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Подключенные клиенты"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Группа аутентификации"
 
@@ -537,9 +533,6 @@ msgstr "Указан неправильный адрес!"
 msgid "Band"
 msgstr "Диапазон"
 
-msgid "Behind NAT"
-msgstr "За NAT-ом"
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -616,12 +609,20 @@ msgstr "Изменения"
 msgid "Changes applied."
 msgstr "Изменения приняты."
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Изменить пароль администратора для доступа к устройству."
 
 msgid "Channel"
 msgstr "Канал"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Проверить"
 
@@ -710,12 +711,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Настройка config файла"
 
-msgid "Configuration applied."
-msgstr "Изменение настроек config файлов."
-
 msgid "Configuration files will be kept."
 msgstr "Config файлы будут сохранены."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Подтверждение пароля"
 
@@ -728,12 +732,15 @@ msgstr "Подключен"
 msgid "Connection Limit"
 msgstr "Ограничение соединений"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "Связь с сервером прерывается, когда TLS не может быть использован"
-
 msgid "Connections"
 msgstr "Соединения"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Страна"
 
@@ -864,9 +871,6 @@ msgstr "Шлюз по умолчанию"
 msgid "Default is stateless + stateful"
 msgstr "Значение по умолчанию - 'stateless + stateful'."
 
-msgid "Default route"
-msgstr "Маршрут по умолчанию"
-
 msgid "Default state"
 msgstr "Начальное состояние"
 
@@ -909,6 +913,9 @@ msgstr "Перезагрузка..."
 msgid "Device unreachable"
 msgstr "Устройство недоступно"
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "Диагностика"
 
@@ -943,6 +950,9 @@ msgstr "Отключено (по умолчанию)"
 msgid "Discard upstream RFC1918 responses"
 msgstr "Отбрасывать ответы внешней сети RFC1918."
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "Показываются только пакеты, содержащие"
 
@@ -1207,6 +1217,9 @@ msgstr "FT над the Air"
 msgid "FT protocol"
 msgstr "FT протокол"
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Файл"
 
@@ -1331,10 +1344,10 @@ msgstr "Свободное место"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "Дополнительная информация о интерфейсах и партнерах WireGuard приведена в <a "
-"href=\"http://wireguard.io\">wireguard.io</a>."
+"href=\"http://wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "ГГц"
@@ -1405,9 +1418,6 @@ msgstr "Перезапустить"
 msgid "Header Error Code Errors (HEC)"
 msgstr "Ошибки кода ошибки заголовка (HEC)"
 
-msgid "Heartbeat"
-msgstr "Heartbeat"
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1467,8 +1477,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Межсетевой экран IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Состояние IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4-адрес"
@@ -1518,16 +1528,12 @@ msgstr "IPv6 Настройки"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA-Prefix"
 
-msgid "IPv6 WAN Status"
-msgstr "Состояние IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6-адрес"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-"IPv6-адрес, делегированный локальной конечной точке туннеля (необязательно)."
-
 msgid "IPv6 assignment hint"
 msgstr "IPv6 подсказка присвоения"
 
@@ -2137,9 +2143,6 @@ msgstr "NT домен"
 msgid "NTP server candidates"
 msgstr "Список NTP-серверов"
 
-msgid "NTP sync time-out"
-msgstr "NTP синхронизация времени ожидания"
-
 msgid "Name"
 msgstr "Имя"
 
@@ -2263,6 +2266,9 @@ msgstr "Obfuscated Group Password"
 msgid "Obfuscated Password"
 msgstr "Obfuscated Password"
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "Задержка выключенного состояния"
 
@@ -2314,16 +2320,6 @@ msgstr "Опция удалена"
 msgid "Optional"
 msgstr "Необязательно"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-"Необязательно. Укажите, чтобы переопределить дефолтный сервер (tic.sixxs."
-"net)."
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-"Необязательно. Используется, когда учетная запись SIXXS имеет более одного "
-"туннеля."
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2695,15 +2691,15 @@ msgstr ""
 "динамической настройки узла\">DHCP</abbr>-сервера."
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Действительно удалить этот интерфейс? Удаление не может быть отменено!\\nВы "
 "можете потерять доступ к этому устройству, если вы подключены через этот "
 "интерфейс."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Действительно удалить эту беспроводную сеть? Удаление не может быть отменено!"
@@ -2714,18 +2710,18 @@ msgid "Really reset all changes?"
 msgstr "Действительно сбросить все изменения?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Действительно отключить сеть? Вы можете потерять доступ к этому устройству, "
 "если вы подключены через этот интерфейс."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
-"Действительно отключить интерфейс \"%s\" ?\\nВы можете потерять доступ к "
-"Ñ\8dÑ\82омÑ\83 Ñ\83Ñ\81Ñ\82Ñ\80ойÑ\81Ñ\82вÑ\83, ÐµÑ\81ли Ð²Ñ\8b Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87енÑ\8b Ñ\87еÑ\80ез Ñ\8dÑ\82оÑ\82 Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81."
+"Действительно отключить интерфейс \"%s\"? Вы можете потерять доступ к этому "
+"устройству, если вы подключены через этот интерфейс."
 
 msgid "Really switch protocol?"
 msgstr "Вы действительно хотите изменить протокол?"
@@ -2815,9 +2811,6 @@ msgstr "Запрос IPv6 адреса"
 msgid "Request IPv6-prefix of length"
 msgstr "Запрос IPv6 префикс длины"
 
-msgid "Require TLS"
-msgstr "Требовать TLS"
-
 msgid "Required"
 msgstr "Требовать"
 
@@ -2884,6 +2877,15 @@ msgstr "Показать/скрыть пароль"
 msgid "Revert"
 msgstr "Вернуть"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Корень"
 
@@ -2899,9 +2901,6 @@ msgstr "Маршрут разрешенный для IP адресов"
 msgid "Route type"
 msgstr "Тип маршрута"
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "Префикс маршрутизации IPv6 для интерфейсов внутренней сети"
-
 msgid "Router Advertisement-Service"
 msgstr "Доступные<br />режимы работы"
 
@@ -2927,16 +2926,6 @@ msgstr "Проверить"
 msgid "SHA256"
 msgstr "SHA256"
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-"SIXXS поддерживает только TIC,  для статических туннелей с использованием IP-"
-"протокола 41 (RFC4213) используется вместо 6in4."
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr "SIXXS-управление[/Туннель-ID]"
-
 msgid "SNR"
 msgstr "SNR"
 
@@ -2964,9 +2953,6 @@ msgstr "Сохранить"
 msgid "Save & Apply"
 msgstr "Сохранить и применить"
 
-msgid "Save &#38; Apply"
-msgstr "Сохранить и применить"
-
 msgid "Scan"
 msgstr "Поиск"
 
@@ -2995,19 +2981,6 @@ msgstr "Разделять клиентов"
 msgid "Server Settings"
 msgstr "Настройки сервера"
 
-msgid "Server password"
-msgstr "Пароль доступа к серверу"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-"Пароль сервера. Введите пароль из тоннеля, когда имя пользователя содержит "
-"ID туннеля."
-
-msgid "Server username"
-msgstr "Логин доступа к серверу"
-
 msgid "Service Name"
 msgstr "Имя службы"
 
@@ -3104,9 +3077,6 @@ msgstr "Сортировка"
 msgid "Source"
 msgstr "Источник"
 
-msgid "Source routing"
-msgstr "маршрутизация от источника"
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Папка, к которой монтируется раздел устройства."
 
@@ -3152,6 +3122,9 @@ msgstr "Старт"
 msgid "Start priority"
 msgstr "Приоритет"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "Загрузка"
 
@@ -3319,6 +3292,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr "Не удалось загрузить config файл из-за следующей ошибки:"
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3343,9 +3326,6 @@ msgstr ""
 "удостовериться в целостности данных.<br /> Нажмите 'Продолжить', чтобы "
 "начать процедуру обновления прошивки."
 
-msgid "The following changes have been committed"
-msgstr "Ваши настройки были применены."
-
 msgid "The following changes have been reverted"
 msgstr "Ваши настройки были отвергнуты."
 
@@ -3412,13 +3392,6 @@ msgstr ""
 "потребуется обновить адрес компьютера, чтобы снова подключится к устройству, "
 "в зависимости от настроек."
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-"Конечная точка туннеля находится за NAT, по умолчанию отключена и "
-"применяется только к AYIYA."
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3429,8 +3402,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Нет активных арендованных адресов."
 
-msgid "There are no pending changes to apply!"
-msgstr "Нет изменений, которые можно применить!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Нет изменений, которые можно отменить!"
@@ -3589,15 +3562,6 @@ msgstr "Интерфейс туннеля"
 msgid "Tunnel Link"
 msgstr "Ссылка на туннель"
 
-msgid "Tunnel broker protocol"
-msgstr "Протокол посредника туннеля"
-
-msgid "Tunnel setup server"
-msgstr "Сервер настройки туннеля"
-
-msgid "Tunnel type"
-msgstr "Тип туннеля"
-
 msgid "Tx-Power"
 msgstr "Мощность передатчика"
 
@@ -3783,12 +3747,6 @@ msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 "Класс производителя (Vendor class), который отправлять при DHCP-запросах"
 
-msgid "Verbose"
-msgstr "Verbose"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Verbose ведение журнала демоном aiccu"
-
 msgid "Verify"
 msgstr "Проверить"
 
@@ -3820,18 +3778,15 @@ msgstr ""
 "Необходимо установить wpa_supplicant (режим клиента) или hostapd (режим "
 "точки доступа или ad-hoc) для поддержки шифрования WPA."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-"Задать время ожидания синхронизации NTP, установка значения - '0', отключает "
-"ожидание (необязательно)."
-
 msgid "Waiting for changes to be applied..."
 msgstr "Ожидание применения изменений..."
 
 msgid "Waiting for command to complete..."
 msgstr "Ожидание завершения выполнения команды..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr "Ожидание подключения устройства..."
 
@@ -3848,12 +3803,6 @@ msgid ""
 "communications"
 msgstr "При использовании PSK, PMK может быть создан локально, без AP в связи."
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr "Создание маршрута по умолчанию IPv6 через туннель."
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "Маршрутизация только пакетов из делегированных префиксов."
-
 msgid "Width"
 msgstr "Ширина"
 
@@ -3936,6 +3885,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "соед. мостом"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "создать:"
 
@@ -4000,9 +3952,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "Локальный <abbr title=\"Служба доменных имён\">DNS</abbr>-файл."
 
-msgid "minimum 1280, maximum 1480"
-msgstr "минимум 1280, максимум 1480"
-
 msgid "minutes"
 msgstr "минут(ы)"
 
@@ -4027,6 +3976,9 @@ msgstr "включено"
 msgid "open"
 msgstr "открыть"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "overlay"
 
@@ -4077,3 +4029,9 @@ msgstr "да"
 
 msgid "« Back"
 msgstr "« Назад"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Состояние IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Состояние IPv6 WAN"
index acc57792b3f8493f193ac4b1f7eddd777ebf9f2f..04468455b87b03460ee077d1364416a3a8b79a55 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -159,9 +162,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -195,9 +195,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -300,11 +297,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -383,10 +375,13 @@ msgstr ""
 msgid "Any zone"
 msgstr ""
 
-msgid "Apply"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
 msgstr ""
 
-msgid "Applying changes"
+msgid "Architecture"
 msgstr ""
 
 msgid ""
@@ -403,6 +398,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -493,9 +491,6 @@ msgstr ""
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -564,12 +559,20 @@ msgstr ""
 msgid "Changes applied."
 msgstr ""
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr ""
 
 msgid "Channel"
 msgstr ""
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr ""
 
@@ -639,10 +642,13 @@ msgstr ""
 msgid "Configuration"
 msgstr ""
 
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
 msgstr ""
 
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
 msgstr ""
 
 msgid "Confirmation"
@@ -657,10 +663,13 @@ msgstr ""
 msgid "Connection Limit"
 msgstr ""
 
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
 msgstr ""
 
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
 msgstr ""
 
 msgid "Country"
@@ -789,9 +798,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr ""
 
@@ -831,6 +837,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -863,6 +872,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1108,6 +1120,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1229,7 +1244,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1301,9 +1316,6 @@ msgstr ""
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1359,7 +1371,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1410,15 +1422,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -1984,9 +1993,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr ""
 
@@ -2110,6 +2116,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2155,12 +2164,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2510,12 +2513,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2523,12 +2526,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2619,9 +2622,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2680,6 +2680,15 @@ msgstr ""
 msgid "Revert"
 msgstr ""
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2695,9 +2704,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2721,14 +2727,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2756,9 +2754,6 @@ msgstr ""
 msgid "Save & Apply"
 msgstr ""
 
-msgid "Save &#38; Apply"
-msgstr ""
-
 msgid "Scan"
 msgstr ""
 
@@ -2785,17 +2780,6 @@ msgstr ""
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2888,9 +2872,6 @@ msgstr ""
 msgid "Source"
 msgstr ""
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2929,6 +2910,9 @@ msgstr ""
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3078,6 +3062,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3095,9 +3089,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr ""
 
@@ -3150,11 +3141,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3163,7 +3149,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3298,15 +3284,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3479,12 +3456,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3514,16 +3485,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3538,12 +3508,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3617,6 +3581,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3679,9 +3646,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr ""
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3706,6 +3670,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index 632ea6f74512274eb8920054b3dc8b3accb4c8c3..982d8fa6949454db8e9b0c730e8c3247e5f7deab 100644 (file)
@@ -47,6 +47,9 @@ msgstr "-- matcha enligt märke --"
 msgid "-- match by uuid --"
 msgstr "-- matcha enligt uuid --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Belastning senaste minuten:"
 
@@ -167,9 +170,6 @@ msgstr "A43C + J43 + A43 + V43"
 msgid "ADSL"
 msgstr "ADSL"
 
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
 msgid "ANSI T1.413"
 msgstr "ANSI T1.413"
 
@@ -203,9 +203,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr "AYIYA"
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -311,11 +308,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr "Tillåtna IP-adresser"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -394,11 +386,14 @@ msgstr "Konfiguration av antenn"
 msgid "Any zone"
 msgstr "Någon zon"
 
-msgid "Apply"
-msgstr "Verkställ"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Verkställer ändringar"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -414,6 +409,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Associerade stationer"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Autentiseringsgrupp"
 
@@ -504,9 +502,6 @@ msgstr "Fel adress angiven!"
 msgid "Band"
 msgstr "Band"
 
-msgid "Behind NAT"
-msgstr "Bakom NAT"
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -576,12 +571,20 @@ msgstr "Ändringar"
 msgid "Changes applied."
 msgstr "Tillämpade ändringar"
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Ändrar administratörens lösenord för att få tillgång till enheten"
 
 msgid "Channel"
 msgstr "Kanal"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "Kontrollera"
 
@@ -653,12 +656,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "Konfiguration"
 
-msgid "Configuration applied."
-msgstr "Konfigurationen tillämpades"
-
 msgid "Configuration files will be kept."
 msgstr "Konfigurationsfiler kommer att behållas."
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "Bekräftelse"
 
@@ -671,12 +677,15 @@ msgstr "Ansluten"
 msgid "Connection Limit"
 msgstr "Anslutningsgräns"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Anslutningar"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "Land"
 
@@ -803,9 +812,6 @@ msgstr "Standard gateway"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr "Standardrutt"
-
 msgid "Default state"
 msgstr ""
 
@@ -845,6 +851,9 @@ msgstr "Enheten startar om..."
 msgid "Device unreachable"
 msgstr "Enheten kan inte nås"
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -879,6 +888,9 @@ msgstr "Inaktiverad (standard)"
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1128,6 +1140,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "Fil"
 
@@ -1249,7 +1264,7 @@ msgstr "Fritt utrymme"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1321,9 +1336,6 @@ msgstr "Lägg på"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr "Hjärtslag"
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1379,7 +1391,7 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4-brandvägg"
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1430,15 +1442,12 @@ msgstr "IPv6-inställningar"
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6-adress"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2005,9 +2014,6 @@ msgstr "NT-domän"
 msgid "NTP server candidates"
 msgstr "NTP-serverkandidater"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Namn"
 
@@ -2131,6 +2137,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2176,12 +2185,6 @@ msgstr "Alternativet togs bort"
 msgid "Optional"
 msgstr "Valfri"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2533,12 +2536,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-servern"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2546,12 +2549,12 @@ msgid "Really reset all changes?"
 msgstr "Verkligen återställa alla ändringar?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2642,9 +2645,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr "Kräv TLS"
-
 msgid "Required"
 msgstr "Krävs!"
 
@@ -2703,6 +2703,15 @@ msgstr "Visa/göm lösenord"
 msgid "Revert"
 msgstr "Återgå"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "Root"
 
@@ -2718,9 +2727,6 @@ msgstr ""
 msgid "Route type"
 msgstr "Typ av rutt"
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2744,14 +2750,6 @@ msgstr "Kör filsystemskontrollen"
 msgid "SHA256"
 msgstr "SHA256"
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr "SNR"
 
@@ -2779,9 +2777,6 @@ msgstr "Spara"
 msgid "Save & Apply"
 msgstr "Spara och Verkställ"
 
-msgid "Save &#38; Apply"
-msgstr "Spara &#38; Verkställ"
-
 msgid "Scan"
 msgstr "Skanna"
 
@@ -2808,17 +2803,6 @@ msgstr "Separera klienter"
 msgid "Server Settings"
 msgstr "Inställningar för server"
 
-msgid "Server password"
-msgstr "Lösenordet för servern"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr "Användarnamnet för servern"
-
 msgid "Service Name"
 msgstr "Namn på tjänst"
 
@@ -2911,9 +2895,6 @@ msgstr "Sortera"
 msgid "Source"
 msgstr "Källa"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2952,6 +2933,9 @@ msgstr ""
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3101,6 +3085,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3118,9 +3112,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr "Följande ändringar har skickats in"
-
 msgid "The following changes have been reverted"
 msgstr ""
 
@@ -3173,11 +3164,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3186,8 +3172,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Det finns inga aktiva kontrakt."
 
-msgid "There are no pending changes to apply!"
-msgstr "Det finns inga pendlande ändringar att verkställa!"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "Det finns inga pendlande ändringar att återkalla"
@@ -3325,15 +3311,6 @@ msgstr "Tunnelgränssnitt"
 msgid "Tunnel Link"
 msgstr "Tunnel-länk"
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr "Tunnel-typ"
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3506,12 +3483,6 @@ msgstr "Tillverkare"
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr "Utförlig"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Verkställ"
 
@@ -3541,16 +3512,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Väntar på att ändringarna ska tillämpas..."
 
 msgid "Waiting for command to complete..."
 msgstr "Väntar på att kommandot ska avsluta..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr "Väntar på enheten..."
 
@@ -3566,12 +3536,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr "Bredd"
 
@@ -3650,6 +3614,9 @@ msgstr ""
 msgid "bridged"
 msgstr "bryggad"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "skapa:"
 
@@ -3712,9 +3679,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "lokal <abbr title=\"Domain Name System\">DNS</abbr>-fil"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr "minuter"
 
@@ -3739,6 +3703,9 @@ msgstr "på"
 msgid "open"
 msgstr "öppen"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3789,9 +3756,3 @@ msgstr "ja"
 
 msgid "« Back"
 msgstr "« Bakåt"
-
-#~ msgid "Action"
-#~ msgstr "Åtgärd"
-
-#~ msgid "Buttons"
-#~ msgstr "Knappar"
index ddf2e56faa264171f87dcab777d6c557de3ca7c5..7a2cdec81b0fbfd77179909a6d9ad4ad6835251f 100644 (file)
@@ -37,6 +37,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -152,9 +155,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -188,9 +188,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -293,11 +290,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -376,10 +368,13 @@ msgstr ""
 msgid "Any zone"
 msgstr ""
 
-msgid "Apply"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
 msgstr ""
 
-msgid "Applying changes"
+msgid "Architecture"
 msgstr ""
 
 msgid ""
@@ -396,6 +391,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -486,9 +484,6 @@ msgstr ""
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -557,12 +552,20 @@ msgstr ""
 msgid "Changes applied."
 msgstr ""
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr ""
 
 msgid "Channel"
 msgstr ""
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr ""
 
@@ -632,10 +635,13 @@ msgstr ""
 msgid "Configuration"
 msgstr ""
 
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
 msgstr ""
 
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
 msgstr ""
 
 msgid "Confirmation"
@@ -650,10 +656,13 @@ msgstr ""
 msgid "Connection Limit"
 msgstr ""
 
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
 msgstr ""
 
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
 msgstr ""
 
 msgid "Country"
@@ -782,9 +791,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr ""
 
@@ -824,6 +830,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -856,6 +865,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1101,6 +1113,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1294,9 +1309,6 @@ msgstr ""
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1352,7 +1364,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1403,15 +1415,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -1977,9 +1986,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr ""
 
@@ -2103,6 +2109,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2148,12 +2157,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2503,12 +2506,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2516,12 +2519,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2612,9 +2615,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2673,6 +2673,15 @@ msgstr ""
 msgid "Revert"
 msgstr ""
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2688,9 +2697,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2714,14 +2720,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2749,9 +2747,6 @@ msgstr ""
 msgid "Save & Apply"
 msgstr ""
 
-msgid "Save &#38; Apply"
-msgstr ""
-
 msgid "Scan"
 msgstr ""
 
@@ -2778,17 +2773,6 @@ msgstr ""
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2881,9 +2865,6 @@ msgstr ""
 msgid "Source"
 msgstr ""
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2922,6 +2903,9 @@ msgstr ""
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3071,6 +3055,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3088,9 +3082,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr ""
 
@@ -3143,11 +3134,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3156,7 +3142,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3291,15 +3277,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3472,12 +3449,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3507,16 +3478,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3531,12 +3501,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3610,6 +3574,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3672,9 +3639,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr ""
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3699,6 +3663,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index 953d1e9669ad1aecd908e941d40ab7f7cd156460..cadfc595396a3c5133194d7d9e04a7f610ab8d9e 100644 (file)
@@ -39,12 +39,15 @@ msgid "-- custom --"
 msgstr "-- özel --"
 
 msgid "-- match by device --"
-msgstr ""
+msgstr "-- cihaza göre eşleştir --"
 
 msgid "-- match by label --"
-msgstr ""
+msgstr "-- etikete göre eşleştir --"
 
 msgid "-- match by uuid --"
+msgstr "-- uuid'e göre eşleştir --"
+
+msgid "-- please select --"
 msgstr ""
 
 msgid "1 Minute Load:"
@@ -54,7 +57,7 @@ msgid "15 Minute Load:"
 msgstr "15 Dakikalık Yük:"
 
 msgid "4-character hexadecimal ID"
-msgstr ""
+msgstr "4 karakterli HEX ID"
 
 msgid "464XLAT (CLAT)"
 msgstr ""
@@ -168,9 +171,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -204,9 +204,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -313,11 +310,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -396,11 +388,14 @@ msgstr "Anten Yapılandırması"
 msgid "Any zone"
 msgstr ""
 
-msgid "Apply"
-msgstr "Uygula"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Değişiklikleri uygula"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -416,6 +411,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -435,7 +433,7 @@ msgid "Auto Refresh"
 msgstr "Otomatik Yenileme"
 
 msgid "Automatic"
-msgstr ""
+msgstr "Otomatik"
 
 msgid "Automatic Homenet (HNCP)"
 msgstr ""
@@ -474,7 +472,7 @@ msgid "BR / DMR / AFTR"
 msgstr ""
 
 msgid "BSSID"
-msgstr ""
+msgstr "BSSID"
 
 msgid "Back"
 msgstr "Geri"
@@ -506,9 +504,6 @@ msgstr ""
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -560,27 +555,35 @@ msgid "CA certificate; if empty it will be saved after the first connection."
 msgstr ""
 
 msgid "CPU usage (%)"
-msgstr ""
+msgstr "CPU kullanımı (%)"
 
 msgid "Cancel"
-msgstr ""
+msgstr "Vazgeç"
 
 msgid "Category"
-msgstr ""
+msgstr "Kategori"
 
 msgid "Chain"
-msgstr ""
+msgstr "Zincir"
 
 msgid "Changes"
-msgstr ""
+msgstr "Değişiklikler"
 
 msgid "Changes applied."
 msgstr ""
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr ""
 
 msgid "Channel"
+msgstr "Kanal"
+
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
 msgstr ""
 
 msgid "Check"
@@ -652,10 +655,13 @@ msgstr ""
 msgid "Configuration"
 msgstr ""
 
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
+msgstr ""
+
+msgid "Configuration has been applied."
 msgstr ""
 
-msgid "Configuration files will be kept."
+msgid "Configuration has been rolled back!"
 msgstr ""
 
 msgid "Confirmation"
@@ -670,10 +676,13 @@ msgstr ""
 msgid "Connection Limit"
 msgstr ""
 
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
 msgstr ""
 
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
 msgstr ""
 
 msgid "Country"
@@ -802,9 +811,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr ""
 
@@ -844,6 +850,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -876,6 +885,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1121,6 +1133,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1242,7 +1257,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1314,9 +1329,6 @@ msgstr ""
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1372,7 +1384,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1423,15 +1435,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -1821,10 +1830,10 @@ msgid "Logging"
 msgstr ""
 
 msgid "Login"
-msgstr ""
+msgstr "Oturum Aç"
 
 msgid "Logout"
-msgstr ""
+msgstr "Oturumu Kapat"
 
 msgid "Loss of Signal Seconds (LOSS)"
 msgstr ""
@@ -1997,9 +2006,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr ""
 
@@ -2123,6 +2129,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2168,12 +2177,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2523,12 +2526,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2536,12 +2539,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2632,9 +2635,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2664,13 +2664,13 @@ msgid ""
 msgstr ""
 
 msgid "Reset"
-msgstr ""
+msgstr "Sıfırla"
 
 msgid "Reset Counters"
-msgstr ""
+msgstr "Sayaçları Sıfırla"
 
 msgid "Reset to defaults"
-msgstr ""
+msgstr "Varsayılanlara dön"
 
 msgid "Resolv and Hosts Files"
 msgstr ""
@@ -2679,23 +2679,32 @@ msgid "Resolve file"
 msgstr ""
 
 msgid "Restart"
-msgstr ""
+msgstr "Tekrar başlat"
 
 msgid "Restart Firewall"
 msgstr ""
 
 msgid "Restore backup"
-msgstr ""
+msgstr "Yedeklemeyi geri yükle"
 
 msgid "Reveal/hide password"
 msgstr ""
 
 msgid "Revert"
+msgstr "Dönmek"
+
+msgid "Revert changes"
+msgstr "Değişiklikleri geri al"
+
+msgid "Revert request failed with status <code>%h</code>"
 msgstr ""
 
-msgid "Root"
+msgid "Reverting configuration…"
 msgstr ""
 
+msgid "Root"
+msgstr "Kök"
+
 msgid "Root directory for files served via TFTP"
 msgstr ""
 
@@ -2706,19 +2715,16 @@ msgid "Route Allowed IPs"
 msgstr ""
 
 msgid "Route type"
-msgstr ""
-
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
+msgstr "Yönlendirme Tipi"
 
 msgid "Router Advertisement-Service"
 msgstr ""
 
 msgid "Router Password"
-msgstr ""
+msgstr "Yönlendirici Parolası"
 
 msgid "Routes"
-msgstr ""
+msgstr "Yönlendirmeler"
 
 msgid ""
 "Routes specify over which interface and gateway a certain host or network "
@@ -2726,63 +2732,52 @@ msgid ""
 msgstr ""
 
 msgid "Run a filesystem check before mounting the device"
-msgstr ""
+msgstr "Cihazı bağlamadan önce bir dosya sistemi kontrolü yapın"
 
 msgid "Run filesystem check"
-msgstr ""
+msgstr "Dosya sistemi kontrolünü çalıştır"
 
 msgid "SHA256"
-msgstr ""
-
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
+msgstr "SHA256"
 
 msgid "SNR"
-msgstr ""
+msgstr "SNR"
 
 msgid "SSH Access"
-msgstr ""
+msgstr "SSH Erişimi"
 
 msgid "SSH server address"
-msgstr ""
+msgstr "SSH sunucu adresi"
 
 msgid "SSH server port"
-msgstr ""
+msgstr "SSH sunucu portu"
 
 msgid "SSH username"
-msgstr ""
+msgstr "SSH kullanıcı adı"
 
 msgid "SSH-Keys"
 msgstr ""
 
 msgid "SSID"
-msgstr ""
+msgstr "SSID"
 
 msgid "Save"
-msgstr ""
+msgstr "Kaydet"
 
 msgid "Save & Apply"
-msgstr ""
-
-msgid "Save &#38; Apply"
-msgstr ""
+msgstr "Kaydet & Uygula"
 
 msgid "Scan"
-msgstr ""
+msgstr "Tara"
 
 msgid "Scheduled Tasks"
-msgstr ""
+msgstr "Zamanlanmış Görevler"
 
 msgid "Section added"
-msgstr ""
+msgstr "Bölüm eklendi"
 
 msgid "Section removed"
-msgstr ""
+msgstr "Bölüm kaldırıldı"
 
 msgid "See \"mount\" manpage for details"
 msgstr ""
@@ -2798,17 +2793,6 @@ msgstr ""
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2816,7 +2800,7 @@ msgid "Service Type"
 msgstr ""
 
 msgid "Services"
-msgstr ""
+msgstr "Servisler"
 
 msgid ""
 "Set interface properties regardless of the link carrier (If set, carrier "
@@ -2845,25 +2829,25 @@ msgid "Shutdown this network"
 msgstr ""
 
 msgid "Signal"
-msgstr ""
+msgstr "Sinyal"
 
 msgid "Signal Attenuation (SATN)"
-msgstr ""
+msgstr "Sinyal Zayıflama (SATN)"
 
 msgid "Signal:"
-msgstr ""
+msgstr "Sinyal:"
 
 msgid "Size"
-msgstr ""
+msgstr "Boyut"
 
 msgid "Size (.ipk)"
-msgstr ""
+msgstr "Boyut (.ipk)"
 
 msgid "Size of DNS query cache"
 msgstr ""
 
 msgid "Skip"
-msgstr ""
+msgstr "Atla"
 
 msgid "Skip to content"
 msgstr ""
@@ -2875,7 +2859,7 @@ msgid "Slot time"
 msgstr ""
 
 msgid "Software"
-msgstr ""
+msgstr "Yazılım"
 
 msgid "Software VLAN"
 msgstr ""
@@ -2896,13 +2880,10 @@ msgid ""
 msgstr ""
 
 msgid "Sort"
-msgstr ""
+msgstr "Sıralama"
 
 msgid "Source"
-msgstr ""
-
-msgid "Source routing"
-msgstr ""
+msgstr "Kaynak"
 
 msgid "Specifies the directory the device is attached to"
 msgstr ""
@@ -2937,11 +2918,14 @@ msgid "Specify the secret encryption key here."
 msgstr ""
 
 msgid "Start"
-msgstr ""
+msgstr "Başlat"
 
 msgid "Start priority"
 msgstr ""
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -2967,16 +2951,16 @@ msgid ""
 msgstr ""
 
 msgid "Status"
-msgstr ""
+msgstr "Durum"
 
 msgid "Stop"
-msgstr ""
+msgstr "Durdur"
 
 msgid "Strict order"
 msgstr ""
 
 msgid "Submit"
-msgstr ""
+msgstr "Gönder"
 
 msgid "Suppress logging"
 msgstr ""
@@ -3019,7 +3003,7 @@ msgid "Synchronizing..."
 msgstr ""
 
 msgid "System"
-msgstr ""
+msgstr "Sistem"
 
 msgid "System Log"
 msgstr ""
@@ -3091,6 +3075,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3108,9 +3102,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr ""
 
@@ -3163,11 +3154,6 @@ msgid ""
 "settings."
 msgstr ""
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3176,7 +3162,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3311,15 +3297,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3381,10 +3358,10 @@ msgid "Upload archive..."
 msgstr ""
 
 msgid "Uploaded File"
-msgstr ""
+msgstr "Yüklenen Dosya"
 
 msgid "Uptime"
-msgstr ""
+msgstr "Açılma süresi"
 
 msgid "Use <code>/etc/ethers</code>"
 msgstr ""
@@ -3417,16 +3394,16 @@ msgid "Use builtin IPv6-management"
 msgstr ""
 
 msgid "Use custom DNS servers"
-msgstr ""
+msgstr "Özel DNS sunucularını kullan"
 
 msgid "Use default gateway"
-msgstr ""
+msgstr "Varsayılan ağ geçidini kullan"
 
 msgid "Use gateway metric"
-msgstr ""
+msgstr "Ağ geçidi metriğini kullan"
 
 msgid "Use routing table"
-msgstr ""
+msgstr "Yönlendirme tablosunu kullan"
 
 msgid ""
 "Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
@@ -3437,7 +3414,7 @@ msgid ""
 msgstr ""
 
 msgid "Used"
-msgstr ""
+msgstr "Kullanılmış"
 
 msgid "Used Key Slot"
 msgstr ""
@@ -3454,7 +3431,7 @@ msgid "User key (PEM encoded)"
 msgstr ""
 
 msgid "Username"
-msgstr ""
+msgstr "Kullanıcı adı"
 
 msgid "VC-Mux"
 msgstr ""
@@ -3487,22 +3464,16 @@ msgid "VPNC (CISCO 3000 (and others) VPN)"
 msgstr ""
 
 msgid "Vendor"
-msgstr ""
+msgstr "Satıcı"
 
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
-msgstr ""
+msgstr "Kontrol"
 
 msgid "Version"
-msgstr ""
+msgstr "Versiyon"
 
 msgid "WDS"
 msgstr ""
@@ -3527,21 +3498,20 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
 msgid "Warning"
-msgstr ""
+msgstr "Uyarı"
 
 msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
@@ -3551,20 +3521,14 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
-msgstr ""
+msgstr "Genişlik"
 
 msgid "WireGuard VPN"
 msgstr ""
 
 msgid "Wireless"
-msgstr ""
+msgstr "Kablosuz"
 
 msgid "Wireless Adapter"
 msgstr ""
@@ -3627,28 +3591,31 @@ msgid "auto"
 msgstr "otomatik"
 
 msgid "baseT"
-msgstr ""
+msgstr "baseT"
 
 msgid "bridged"
 msgstr "köprülü"
 
-msgid "create:"
+msgid "create"
 msgstr ""
 
+msgid "create:"
+msgstr "oluşturma:"
+
 msgid "creates a bridge over specified interface(s)"
 msgstr ""
 
 msgid "dB"
-msgstr ""
+msgstr "dB"
 
 msgid "dBm"
-msgstr ""
+msgstr "dBm"
 
 msgid "disable"
 msgstr "etkin değil"
 
 msgid "disabled"
-msgstr ""
+msgstr "devre dışı"
 
 msgid "expired"
 msgstr "sona ermiş"
@@ -3662,19 +3629,19 @@ msgid "forward"
 msgstr "ileri"
 
 msgid "full-duplex"
-msgstr ""
+msgstr "tam çift yönlü"
 
 msgid "half-duplex"
-msgstr ""
+msgstr "yarı çift yönlü"
 
 msgid "help"
 msgstr "yardım"
 
 msgid "hidden"
-msgstr ""
+msgstr "gizli"
 
 msgid "hybrid mode"
-msgstr ""
+msgstr "hibrit mod"
 
 msgid "if target is a network"
 msgstr "eğer hedef ağsa"
@@ -3683,34 +3650,31 @@ msgid "input"
 msgstr "giriş"
 
 msgid "kB"
-msgstr ""
+msgstr "kB"
 
 msgid "kB/s"
-msgstr ""
+msgstr "kB/s"
 
 msgid "kbit/s"
-msgstr ""
+msgstr "kbit/s"
 
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "yerel <abbr title=\"Domain Name System\">DNS</abbr> dosyası"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
-msgstr ""
+msgstr "dakika"
 
 msgid "no"
 msgstr "hayır"
 
 msgid "no link"
-msgstr ""
+msgstr "bağlantı yok"
 
 msgid "none"
 msgstr "hiçbiri"
 
 msgid "not present"
-msgstr ""
+msgstr "mevcut değil"
 
 msgid "off"
 msgstr "kapalı"
@@ -3719,31 +3683,34 @@ msgid "on"
 msgstr "açık"
 
 msgid "open"
+msgstr "açık"
+
+msgid "output"
 msgstr ""
 
 msgid "overlay"
-msgstr ""
+msgstr "bindirilmiş"
 
 msgid "random"
-msgstr ""
+msgstr "rastgele"
 
 msgid "relay mode"
-msgstr ""
+msgstr "anahtarlama modu"
 
 msgid "routed"
 msgstr "yönlendirildi"
 
 msgid "server mode"
-msgstr ""
+msgstr "sunucu modu"
 
 msgid "stateful-only"
 msgstr ""
 
 msgid "stateless"
-msgstr ""
+msgstr "durumsuz"
 
 msgid "stateless + stateful"
-msgstr ""
+msgstr "durumsuz + durumlu"
 
 msgid "tagged"
 msgstr "etiketlendi"
@@ -3752,7 +3719,7 @@ msgid "time units (TUs / 1.024 ms) [1000-65535]"
 msgstr ""
 
 msgid "unknown"
-msgstr ""
+msgstr "bilinmeyen"
 
 msgid "unlimited"
 msgstr "sınırsız"
@@ -3772,6 +3739,12 @@ msgstr "evet"
 msgid "« Back"
 msgstr "« Geri"
 
+#~ msgid "Apply"
+#~ msgstr "Uygula"
+
+#~ msgid "Applying changes"
+#~ msgstr "Değişiklikleri uygula"
+
 #~ msgid "Action"
 #~ msgstr "Eylem"
 
index 8ead61607418c3004c432f418dd3e38609bd9dd9..791e61b2dc2c4d013a42bda8e81aa5d2ee5aa2cd 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2013-12-05 19:07+0200\n"
-"Last-Translator: Dmitri <4glitch@gmail.com>\n"
+"PO-Revision-Date: 2018-06-17 23:27+0300\n"
+"Last-Translator: Yurii <yuripet@gmail.com>\n"
 "Language-Team: none\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
@@ -10,19 +10,18 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
 
 msgid "%.1f dB"
-msgstr ""
+msgstr "%.1f дБ"
 
 msgid "%s is untagged in multiple VLANs!"
-msgstr ""
+msgstr "%s є непозначеним у декількох VLAN!"
 
 msgid "(%d minute window, %d second interval)"
-msgstr "(%d-хвилинне вікно, %d-секундний інтервал)"
+msgstr "(вікно - %d хвилин, інтервал - %d секунд)"
 
 msgid "(%s available)"
-msgstr "(%s доступно)"
+msgstr "(доступно %s)"
 
 msgid "(empty)"
 msgstr "(пусто)"
@@ -34,19 +33,22 @@ msgid "-- Additional Field --"
 msgstr "-- Додаткові поля --"
 
 msgid "-- Please choose --"
-msgstr "-- Ð\92иберіть --"
+msgstr "-- Ð\9eберіть --"
 
 msgid "-- custom --"
 msgstr "-- нетипово --"
 
 msgid "-- match by device --"
-msgstr ""
+msgstr "-- відповідно пристрою --"
 
 msgid "-- match by label --"
-msgstr ""
+msgstr "-- відповідно мітці --"
 
 msgid "-- match by uuid --"
-msgstr ""
+msgstr "-- відповідно UUID --"
+
+msgid "-- please select --"
+msgstr "-- виберіть --"
 
 msgid "1 Minute Load:"
 msgstr "Навантаження за 1 хвилину:"
@@ -55,34 +57,35 @@ msgid "15 Minute Load:"
 msgstr "Навантаження за 15 хвилин:"
 
 msgid "4-character hexadecimal ID"
-msgstr ""
+msgstr "4-симв. шістнадцятковий ID"
 
 msgid "464XLAT (CLAT)"
-msgstr ""
+msgstr "464XLAT (CLAT)"
 
 msgid "5 Minute Load:"
 msgstr "Навантаження за 5 хвилин:"
 
 msgid "6-octet identifier as a hex string - no colons"
 msgstr ""
+"6-октетний ідентифікатор у вигляді шістнадцяткового рядка – без двокрапок"
 
 msgid "802.11r Fast Transition"
-msgstr ""
+msgstr "Швидкий перехід 802.11r"
 
 msgid "802.11w Association SA Query maximum timeout"
-msgstr ""
+msgstr "Максимальний тайм-аут запиту асоціації 802.11w"
 
 msgid "802.11w Association SA Query retry timeout"
-msgstr ""
+msgstr "Тайм-аут повторювання запиту асоціації 802.11w"
 
 msgid "802.11w Management Frame Protection"
-msgstr ""
+msgstr "Захист кадрів управління 802.11w"
 
 msgid "802.11w maximum timeout"
-msgstr ""
+msgstr "Максимальний тайм-аут 802.11w"
 
 msgid "802.11w retry timeout"
-msgstr ""
+msgstr "Тайм-аут повторювання 802.11w"
 
 msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
 msgstr ""
@@ -104,7 +107,7 @@ msgid ""
 "order of the resolvfile"
 msgstr ""
 "<abbr title=\"Domain Name System — система доменних імен\">DNS</abbr>-"
-"сервери будуть опитані у порядку, визначеному файлом resolvfile"
+"сервери буде опитано в порядку, визначеному файлом <em>resolvfile</em>"
 
 msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
@@ -131,11 +134,11 @@ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
 msgstr "<abbr title=\"Інтернет-протокол версії 6\">IPv6</abbr>-шлюз"
 
 msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
-msgstr ""
+msgstr "<abbr title=\"Інтернет-протокол версії 6\">IPv6</abbr>-суфікс (hex)"
 
 msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
 msgstr ""
-"Настроювання <abbr title=\"Light Emitting Diode — світлодіод\">LED</abbr>"
+"Налаштування <abbr title=\"Light Emitting Diode — світлодіод\">LED</abbr>"
 
 msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
 msgstr "Назва <abbr title=\"Light Emitting Diode — світлодіод\">LED</abbr>"
@@ -146,33 +149,35 @@ msgstr ""
 "abbr>-адреса"
 
 msgid "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
-msgstr ""
+msgstr "<abbr title=\"Унікальний ідентифікатор DHCP\">DUID</abbr>"
 
 msgid ""
 "<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
 "Protocol\">DHCP</abbr> leases"
 msgstr ""
-"<abbr title=\"Максимум\">Max.</abbr> оренд <abbr title=\"Dynamic Host "
+"<abbr title=\"Максимум\">Макс.</abbr> оренд <abbr title=\"Dynamic Host "
 "Configuration Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>"
 
 msgid ""
 "<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
 "Domain Name System\">EDNS0</abbr> packet size"
 msgstr ""
-"<abbr title=\"Максимум\">Max.</abbr> розмір пакета <abbr title=\"Extension "
+"<abbr title=\"Максимальний\">Макс.</abbr> розмір пакета <abbr title=\"Extension "
 "Mechanisms for Domain Name System — Механізми розширень для доменної системи "
 "імен\">EDNS0</abbr>"
 
 msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
-msgstr "<abbr title=\"Максимум\">Max.</abbr> одночасних запитів"
+msgstr "<abbr title=\"Максимум\">Макс.</abbr> одночасних запитів"
 
 msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
-msgstr "<abbr title='Парний: %s / Груповий: %s'>%s - %s</abbr>"
+msgstr "<abbr title='Парний: %s / Груповий: %s'>%s  %s</abbr>"
 
 msgid ""
 "<br/>Note: you need to manually restart the cron service if the crontab file "
 "was empty before editing."
 msgstr ""
+"<br/>Примітка: якщо перед редагуванням, файл crontab був порожній, вам потрібно "
+"вручну перезапустити служби cron."
 
 msgid "A43C + J43 + A43"
 msgstr ""
@@ -183,9 +188,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -194,10 +196,11 @@ msgstr ""
 "<abbr title=\"Access Point Name — символічна назва точки доступу\">APN</abbr>"
 
 msgid "ARP retry threshold"
-msgstr "Ð\9fоÑ\80Ñ\96г Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\83 ARP"
+msgstr "Ð\9fоÑ\80Ñ\96г Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\8eваннÑ\8f ARP"
 
 msgid "ATM (Asynchronous Transfer Mode)"
 msgstr ""
+"<abbr title=\"Asynchronous Transfer Mode — асинхронний режим передавання\">ATM</abbr>"
 
 msgid "ATM Bridges"
 msgstr "ATM-мости"
@@ -217,7 +220,7 @@ msgid ""
 "Linux network interfaces which can be used in conjunction with DHCP or PPP "
 "to dial into the provider network."
 msgstr ""
-"ATM-мости виставляють інкапсульований Ethernet у з'єднаннях AAL5 як "
+"ATM-мости виставляють інкапсульований Ethernet у зєднаннях AAL5 як "
 "віртуальні мережеві інтерфейси Linux, котрі можуть використовуватися в "
 "поєднанні з DHCP або PPP для підключення до мережі провайдера."
 
@@ -227,9 +230,6 @@ msgstr "Номер ATM-пристрою"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "Концентратор доступу"
 
@@ -273,7 +273,7 @@ msgid "Additional Hosts files"
 msgstr "Додаткові файли hosts"
 
 msgid "Additional servers file"
-msgstr ""
+msgstr "Додаткові файли servers"
 
 msgid "Address"
 msgstr "Адреса"
@@ -288,7 +288,7 @@ msgid "Advanced Settings"
 msgstr "Додаткові параметри"
 
 msgid "Aggregate Transmit Power(ACTATP)"
-msgstr ""
+msgstr "Сумарна потужність передавання"
 
 msgid "Alert"
 msgstr "Тривога"
@@ -297,9 +297,10 @@ msgid ""
 "Allocate IP addresses sequentially, starting from the lowest available "
 "address"
 msgstr ""
+"Виділяти IP-адреси послідовно, починаючи з найнижчої доступної адреси"
 
 msgid "Allocate IP sequentially"
-msgstr ""
+msgstr "Виділяти IP послідовно"
 
 msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
 msgstr ""
@@ -310,7 +311,7 @@ msgid "Allow all except listed"
 msgstr "Дозволити всі, крім зазначених"
 
 msgid "Allow legacy 802.11b rates"
-msgstr ""
+msgstr "Дозволити застарілі швидкості 802.11b"
 
 msgid "Allow listed only"
 msgstr "Дозволити тільки зазначені"
@@ -320,7 +321,8 @@ msgstr "Дозволити локальний вузол"
 
 msgid "Allow remote hosts to connect to local SSH forwarded ports"
 msgstr ""
-"Дозволити віддаленим вузлам підключення до локальних SSH-спрямованих портів"
+"Дозволити віддаленим вузлам підключення до локальних переспрямованих портів "
+"SSH"
 
 msgid "Allow root logins with password"
 msgstr "Дозволити root-вхід із паролем"
@@ -331,19 +333,14 @@ msgstr "Дозволити користувачеві <em>root</em> вхід у
 msgid ""
 "Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
 msgstr ""
-"Дозволити відповіді від клієнта на сервер у діапазоні 127.0.0.0/8, "
+"Дозволити висхідні відповіді від клієнта на сервер у діапазоні 127.0.0.0/8, "
 "наприклад, для RBL-послуг"
 
 msgid "Allowed IPs"
-msgstr ""
-
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
+msgstr "Дозволено IP-адреси"
 
 msgid "Always announce default router"
-msgstr ""
+msgstr "Завжди оголошувати типовим маршрутизатором"
 
 msgid "Annex"
 msgstr ""
@@ -391,22 +388,23 @@ msgid "Annex M G.992.5"
 msgstr ""
 
 msgid "Announce as default router even if no public prefix is available."
-msgstr ""
+msgstr "Оголошувати типовим маршрутизатором, навіть якщо немає доступного "
+"спільного префікса."
 
 msgid "Announced DNS domains"
-msgstr ""
+msgstr "Оголошено DNS-домени"
 
 msgid "Announced DNS servers"
-msgstr ""
+msgstr "Оголошено DNS-сервери"
 
 msgid "Anonymous Identity"
-msgstr ""
+msgstr "Анонімне посвідчення"
 
 msgid "Anonymous Mount"
-msgstr ""
+msgstr "Анонімне монтування"
 
 msgid "Anonymous Swap"
-msgstr ""
+msgstr "Анонімний своп"
 
 msgid "Antenna 1"
 msgstr "Антена 1"
@@ -420,15 +418,20 @@ msgstr "Конфигурація антени"
 msgid "Any zone"
 msgstr "Будь-яка зона"
 
-msgid "Apply"
-msgstr "Застосувати"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr "Сталася помилка запиту на застосування зі статусом <code>%h</code>"
+
+msgid "Apply unchecked"
+msgstr "Застосування не позначено"
 
-msgid "Applying changes"
-msgstr "Ð\97аÑ\81Ñ\82оÑ\81Ñ\83ваннÑ\8f Ð·Ð¼Ñ\96н"
+msgid "Architecture"
+msgstr "Ð\90Ñ\80Ñ\85Ñ\96Ñ\82екÑ\82Ñ\83Ñ\80а"
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
+"Призначати частину заданої довжини до кожного публічного IPv6-префікса "
+"цього інтерфейсу"
 
 msgid "Assign interfaces..."
 msgstr "Призначення інтерфейсів..."
@@ -436,18 +439,23 @@ msgstr "Призначення інтерфейсів..."
 msgid ""
 "Assign prefix parts using this hexadecimal subprefix ID for this interface."
 msgstr ""
+"Призначати для цього інтерфейсу частину префікса, використовуючи цей "
+"шістнадцятковий ID субпрефікса."
 
 msgid "Associated Stations"
-msgstr "Приєднані станції"
+msgstr "Приєднано станції"
+
+msgid "Associations"
+msgstr "З’єднань"
 
 msgid "Auth Group"
-msgstr ""
+msgstr "Група автентифікації"
 
 msgid "Authentication"
 msgstr "Автентифікація"
 
 msgid "Authentication Type"
-msgstr ""
+msgstr "Тип автентифікації"
 
 msgid "Authoritative"
 msgstr "Надійний"
@@ -459,25 +467,28 @@ msgid "Auto Refresh"
 msgstr "Автоматичне оновлення"
 
 msgid "Automatic"
-msgstr ""
+msgstr "Автоматично"
 
 msgid "Automatic Homenet (HNCP)"
-msgstr ""
+msgstr "Автоматично Homenet (HNCP)"
 
 msgid "Automatically check filesystem for errors before mounting"
 msgstr ""
+"Автоматично перевіряти файлову систему на наявність помилок перед "
+"монтуванням"
 
 msgid "Automatically mount filesystems on hotplug"
 msgstr ""
+"Автоматично монтувати файлові системи при оперативниму підключенні"
 
 msgid "Automatically mount swap on hotplug"
-msgstr ""
+msgstr "Автоматично монтувати своп при оперативниму підключенні"
 
 msgid "Automount Filesystem"
-msgstr ""
+msgstr "Автомонтування ФС"
 
 msgid "Automount Swap"
-msgstr ""
+msgstr "Автомонтування своп"
 
 msgid "Available"
 msgstr "Доступно"
@@ -516,7 +527,7 @@ msgid "Back to scan results"
 msgstr "Повернутися до результатів сканування"
 
 msgid "Backup / Flash Firmware"
-msgstr "РезеÑ\80вне ÐºÐ¾Ð¿Ñ\96Ñ\8eваннÑ\8f / Ð\9eновленнÑ\8f Ð¿Ñ\80оÑ\88ивки"
+msgstr "РезеÑ\80вне ÐºÐ¾Ð¿Ñ\96Ñ\8eваннÑ\8f / Ð\9fÑ\80оÑ\88ивка Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами"
 
 msgid "Backup / Restore"
 msgstr "Резервне копіювання/відновлення"
@@ -525,13 +536,10 @@ msgid "Backup file list"
 msgstr "Список файлів резервних копій"
 
 msgid "Bad address specified!"
-msgstr "Ð\92казана Ð½ÐµÐ¿Ñ\80авилÑ\8cна Ð°Ð´Ñ\80еÑ\81а!"
+msgstr "Ð\92казано Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83!"
 
 msgid "Band"
-msgstr ""
-
-msgid "Behind NAT"
-msgstr ""
+msgstr "Група"
 
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
@@ -543,16 +551,16 @@ msgstr ""
 "базових файлів, та файлів за користувацькими шаблонами резервного копіювання."
 
 msgid "Bind interface"
-msgstr ""
+msgstr "Прив’язка інтерфейсу"
 
 msgid "Bind only to specific interfaces rather than wildcard address."
-msgstr ""
+msgstr "Прив’язка тільки до певних інтерфейсів, а не шаблонної адреси."
 
 msgid "Bind the tunnel to this interface (optional)."
-msgstr ""
+msgstr "Прив’язка тунелю до цього інтерфейсу (за бажання)."
 
 msgid "Bitrate"
-msgstr "Швидкість передачі даних"
+msgstr "Швидкість передавання даних"
 
 msgid "Bogus NX Domain Override"
 msgstr "Відкидати підробки NX-домену"
@@ -561,7 +569,7 @@ msgid "Bridge"
 msgstr "Міст"
 
 msgid "Bridge interfaces"
-msgstr "Об'єднати інтерфейси в міст"
+msgstr "Обєднати інтерфейси в міст"
 
 msgid "Bridge unit number"
 msgstr "Номер моста"
@@ -582,9 +590,12 @@ msgid ""
 "Build/distribution specific feed definitions. This file will NOT be "
 "preserved in any sysupgrade."
 msgstr ""
+"Специфічні для збірки/поширення визначення каналів. Цей файл НЕ БУДЕ "
+"збережено при будь-якому оновленні системи."
 
 msgid "CA certificate; if empty it will be saved after the first connection."
 msgstr ""
+"Сертифікат CA; якщо порожньо, його буде збережено після першого підключення."
 
 msgid "CPU usage (%)"
 msgstr "Завантаження ЦП, %"
@@ -593,7 +604,7 @@ msgid "Cancel"
 msgstr "Скасувати"
 
 msgid "Category"
-msgstr ""
+msgstr "Категорія"
 
 msgid "Chain"
 msgstr "Ланцюжок"
@@ -604,20 +615,30 @@ msgstr "Зміни"
 msgid "Changes applied."
 msgstr "Зміни застосовано."
 
+msgid "Changes have been reverted."
+msgstr "Зміни було скасовано."
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "Зміна пароля адміністратора для доступу до пристрою"
 
 msgid "Channel"
 msgstr "Канал"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+"Канал %d не доступний у %s регуляторному домені й був автоматично "
+"скоригований на %d."
+
 msgid "Check"
 msgstr "Перевірити"
 
 msgid "Check filesystems before mount"
-msgstr ""
+msgstr "Перевірити файлову систему перед монтуванням"
 
 msgid "Check this option to delete the existing networks from this radio."
-msgstr ""
+msgstr "Позначте цей параметр, щоб видалити існуючі мережі з цього радіо."
 
 msgid "Checksum"
 msgstr "Контрольна сума"
@@ -644,7 +665,7 @@ msgid "Cipher"
 msgstr "Шифр"
 
 msgid "Cisco UDP encapsulation"
-msgstr ""
+msgstr "Інкапсуляція UDP Cisco"
 
 msgid ""
 "Click \"Generate archive\" to download a tar archive of the current "
@@ -652,8 +673,8 @@ msgid ""
 "\"Perform reset\" (only possible with squashfs images)."
 msgstr ""
 "Натисніть кнопку \"Створити архів\", щоб завантажити tar-архів поточних "
-"Ñ\84айлÑ\96в ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97. Ð\94лÑ\8f Ð²Ñ\96дновленнÑ\8f Ð¿Ñ\80оÑ\88ивки Ð´Ð¾ Ñ\97Ñ\97 Ð¿Ð¾Ñ\87аÑ\82кового Ñ\81Ñ\82анÑ\83, "
-"натисніть кнопку \"Відновити\" (можливе тільки з образами SquashFS)."
+"Ñ\84айлÑ\96в ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97. Ð\94лÑ\8f Ð²Ñ\96дновленнÑ\8f Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами Ð´Ð¾ Ñ\97Ñ\97 Ð¿Ð¾Ñ\87аÑ\82кового "
+"стану натисніть кнопку \"Відновити\" (можливо тільки з образами SquashFS)."
 
 msgid "Client"
 msgstr "Клієнт"
@@ -665,8 +686,8 @@ msgid ""
 "Close inactive connection after the given amount of seconds, use 0 to "
 "persist connection"
 msgstr ""
-"Закривати неактивні з'єднання після певного інтервалу часу (секунди). Для "
-"утримання неактивних з'єднань використовуйте 0"
+"Закривати неактивні зєднання після певного інтервалу часу (секунди). Для "
+"утримання неактивних зєднань використовуйте 0"
 
 msgid "Close list..."
 msgstr "Згорнути список..."
@@ -686,15 +707,22 @@ msgid ""
 "workaround might cause interoperability issues and reduced robustness of key "
 "negotiation especially in environments with heavy traffic load."
 msgstr ""
+"Ускладнює атаки перевстановлення ключа на стороні клієнта, відключаючи "
+"ретрансляцію кадрів EAPOL-Key, що використовуються для встановлення ключів. "
+"Може викликати проблеми сумісності та зниження стійкості узгодження ключа, "
+"особливо в середовищах з великою завантаженістю трафіку."
 
 msgid "Configuration"
 msgstr "Конфігурація"
 
-msgid "Configuration applied."
-msgstr "Конфігурація застосована."
-
 msgid "Configuration files will be kept."
-msgstr "Конфігураційні файли будуть збережені."
+msgstr "Конфігураційні файли буде збережено."
+
+msgid "Configuration has been applied."
+msgstr "Конфігурацію застосовано."
+
+msgid "Configuration has been rolled back!"
+msgstr "Конфігурацію було відкочено!"
 
 msgid "Confirmation"
 msgstr "Підтвердження"
@@ -703,17 +731,23 @@ msgid "Connect"
 msgstr "Підключити"
 
 msgid "Connected"
-msgstr "Ð\9fÑ\96дклÑ\8eÑ\87ений"
+msgstr "Ð\9fÑ\96дклÑ\8eÑ\87ено"
 
 msgid "Connection Limit"
 msgstr "Гранична кількість підключень"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "Підключення"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+"Після застосування змін конфігурації не вдалося відновити доступ до пристрою. "
+"Вам, можливо, знадобитися повторне підключення, якщо ви змінили налаштування "
+"мережі, такі як IP-адреса або облікові дані безпеки бездротової мережі."
+
 msgid "Country"
 msgstr "Країна"
 
@@ -745,26 +779,30 @@ msgid "Custom Interface"
 msgstr "Інтерфейс користувача"
 
 msgid "Custom delegated IPv6-prefix"
-msgstr ""
+msgstr "Користувацький делегований префікс IPv6"
 
 msgid ""
 "Custom feed definitions, e.g. private feeds. This file can be preserved in a "
 "sysupgrade."
 msgstr ""
+"Користувацькі визначення каналів, наприклад, приватних. Цей файл може бути "
+"збережено при оновленні системи."
 
 msgid "Custom feeds"
-msgstr ""
+msgstr "Користувацькі канали"
 
 msgid ""
 "Custom files (certificates, scripts) may remain on the system. To prevent "
 "this, perform a factory-reset first."
 msgstr ""
+"Користувацькі файли (сертифікати, скрипти) можуть залишитися в системі. Щоб "
+"запобігти цьому, спочатку виконайте скидання до заводських налаштувань."
 
 msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
-"Настроювання поведінки <abbr title=\"Light Emitting Diode — світлодіод"
+"Налаштування поведінки <abbr title=\"Light Emitting Diode — світлодіод"
 "\">LED</abbr>, якщо це можливо."
 
 msgid "DHCP Leases"
@@ -786,49 +824,49 @@ msgid "DHCPv6 Leases"
 msgstr "Оренди DHCPv6"
 
 msgid "DHCPv6 client"
-msgstr ""
+msgstr "Клієнт DHCPv6"
 
 msgid "DHCPv6-Mode"
-msgstr ""
+msgstr "Режим DHCPv6"
 
 msgid "DHCPv6-Service"
-msgstr ""
+msgstr "Служба DHCPv6"
 
 msgid "DNS"
 msgstr "DNS"
 
 msgid "DNS forwardings"
-msgstr "СпÑ\80Ñ\8fмовÑ\83ваннÑ\8f DNS-запиÑ\82Ñ\96в"
+msgstr "Ð\9fеÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83ваннÑ\8f<br />запиÑ\82Ñ\96в DNS"
 
 msgid "DNS-Label / FQDN"
-msgstr ""
+msgstr "DNS-мітка / FQDN"
 
 msgid "DNSSEC"
 msgstr ""
 
 msgid "DNSSEC check unsigned"
-msgstr ""
+msgstr "Перевірка непідписаного DNSSEC"
 
 msgid "DPD Idle Timeout"
-msgstr ""
+msgstr "Тайм-аут простою DPD"
 
 msgid "DS-Lite AFTR address"
-msgstr ""
+msgstr "AFTR-адреса DS-Lite"
 
 msgid "DSL"
-msgstr ""
+msgstr "DSL"
 
 msgid "DSL Status"
-msgstr ""
+msgstr "Стан DSL"
 
 msgid "DSL line mode"
-msgstr ""
+msgstr "Режим лінії DSL"
 
 msgid "DUID"
 msgstr "DUID"
 
 msgid "Data Rate"
-msgstr ""
+msgstr "Швидк. передавання"
 
 msgid "Debug"
 msgstr "Зневаджування"
@@ -840,10 +878,7 @@ msgid "Default gateway"
 msgstr "Типовий шлюз"
 
 msgid "Default is stateless + stateful"
-msgstr ""
-
-msgid "Default route"
-msgstr ""
+msgstr "Типовим є БЕЗ та ЗІ збереженням стану"
 
 msgid "Default state"
 msgstr "Типовий стан"
@@ -882,16 +917,19 @@ msgid "Device Configuration"
 msgstr "Конфігурація пристрою"
 
 msgid "Device is rebooting..."
-msgstr ""
+msgstr "Пристрій перезавантажується..."
 
 msgid "Device unreachable"
-msgstr ""
+msgstr "Пристрій недосяжний"
+
+msgid "Device unreachable!"
+msgstr "Пристрій недосяжний!"
 
 msgid "Diagnostics"
 msgstr "Діагностика"
 
 msgid "Dial number"
-msgstr ""
+msgstr "Набір номера"
 
 msgid "Directory"
 msgstr "Каталог"
@@ -907,22 +945,25 @@ msgstr ""
 "динамічної конфігурації вузла\">DHCP</abbr> для цього інтерфейсу."
 
 msgid "Disable DNS setup"
-msgstr "Вимкнути настроювання DNS"
+msgstr "Вимкнути налаштування DNS"
 
 msgid "Disable Encryption"
-msgstr ""
+msgstr "Вимкнути шифрування"
 
 msgid "Disabled"
 msgstr "Вимкнено"
 
 msgid "Disabled (default)"
-msgstr ""
+msgstr "Вимкнено (типово)"
 
 msgid "Discard upstream RFC1918 responses"
-msgstr "Відкидати RFC1918-відповіді від клієнта на сервер"
+msgstr "Відкидати висхідні RFC1918-відповіді"
+
+msgid "Dismiss"
+msgstr "Відхилити"
 
 msgid "Displaying only packages containing"
-msgstr "Ð\9fоказанÑ\96 Ñ\82Ñ\96лÑ\8cки Ð½ÐµÐ¿Ð¾Ñ\80ожнÑ\96 Ð¿Ð°ÐºÐµÑ\82и"
+msgstr "Ð\92Ñ\96добÑ\80аженнÑ\8f Ð»Ð¸Ñ\88е Ð½ÐµÐ¿Ð¾Ñ\80ожнÑ\96Ñ\85 Ð¿Ð°ÐºÐµÑ\82Ñ\96в"
 
 msgid "Distance Optimization"
 msgstr "Оптимізація за відстанню"
@@ -931,7 +972,7 @@ msgid "Distance to farthest network member in meters."
 msgstr "Відстань до найвіддаленішого вузла мережі в метрах."
 
 msgid "Distribution feeds"
-msgstr ""
+msgstr "Канали поширення"
 
 msgid "Diversity"
 msgstr "Різновидність"
@@ -945,7 +986,7 @@ msgstr ""
 "Dnsmasq являє собою комбінований <abbr title=\"Dynamic Host Configuration "
 "Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-сервер і "
 "<abbr title=\"Domain Name System — система доменних імен\">DNS</abbr>-"
-"транспортер для брандмауерів <abbr title=\"Network Address Translation — "
+"проксі для брандмауерів <abbr title=\"Network Address Translation — "
 "перетворення (трансляція) мережевих адрес\">NAT</abbr>"
 
 msgid "Do not cache negative replies, e.g. for not existing domains"
@@ -953,11 +994,13 @@ msgstr "Не кешувати негативні відповіді, напри
 
 msgid "Do not forward requests that cannot be answered by public name servers"
 msgstr ""
-"Не спрямовувати запити, які не можуть бути оброблені публічними серверами "
+"Не переспрямовувати запити, які не може бути оброблено публічними серверами "
 "імен"
 
 msgid "Do not forward reverse lookups for local networks"
-msgstr "Не спрямовувати зворотний перегляд для локальних мереж"
+msgstr ""
+"Не переспрямовувати зворотні <abbr title=\"Domain Name System — система "
+"доменних імен\">DNS</abbr>-запити для локальних мереж"
 
 msgid "Domain required"
 msgstr "Потрібен домен"
@@ -966,13 +1009,13 @@ msgid "Domain whitelist"
 msgstr "\"Білий список\" доменів"
 
 msgid "Don't Fragment"
-msgstr ""
+msgstr "Не фрагментувати"
 
 msgid ""
 "Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
 "<abbr title=\"Domain Name System\">DNS</abbr>-Name"
 msgstr ""
-"Ð\9dе Ð¿ÐµÑ\80еÑ\81илати <abbr title=\"Domain Name System — система доменних імен"
+"Ð\9dе Ð¿ÐµÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83вати <abbr title=\"Domain Name System — система доменних імен"
 "\">DNS</abbr>-запити без <abbr title=\"Domain Name System — система доменних "
 "імен\">DNS</abbr>-імені"
 
@@ -983,7 +1026,7 @@ msgid "Download backup"
 msgstr "Завантажити резервну копію"
 
 msgid "Downstream SNR offset"
-msgstr ""
+msgstr "Низхідний зсув SNR"
 
 msgid "Dropbear Instance"
 msgstr "Реалізація Dropbear"
@@ -1014,7 +1057,7 @@ msgstr ""
 "обслуговуватися тільки клієнти, які мають статичні оренди."
 
 msgid "EA-bits length"
-msgstr ""
+msgstr "Довжина EA-бітів"
 
 msgid "EAP-Method"
 msgstr "EAP-Метод"
@@ -1026,6 +1069,8 @@ msgid ""
 "Edit the raw configuration data above to fix any error and hit \"Save\" to "
 "reload the page."
 msgstr ""
+"Щоб виправити якусь помилку, відредагуйте вихідні дані конфігурації вище і "
+"натисніть \"Зберегти\", щоб перезавантажити сторінку."
 
 msgid "Edit this interface"
 msgstr "Редагувати цей інтерфейс"
@@ -1043,6 +1088,8 @@ msgid ""
 "Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
 "snooping"
 msgstr ""
+"Увімкнути відстеження <abbr title=\"Internet Group Management Protocol"
+"\">IGMP</abbr>"
 
 msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
 msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1051,19 +1098,19 @@ msgid "Enable HE.net dynamic endpoint update"
 msgstr "Увімкнути динамічне оновлення кінцевої точки HE.net"
 
 msgid "Enable IPv6 negotiation"
-msgstr ""
+msgstr "Увімкнути узгодження IPv6"
 
 msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Увімкнути узгодження IPv6 для PPP-з'єднань"
+msgstr "Увімкнути узгодження IPv6 для PPP-зєднань"
 
 msgid "Enable Jumbo Frame passthrough"
 msgstr "Пропускати Jumbo-фрейми"
 
 msgid "Enable NTP client"
-msgstr "Увімкнути NTP-клієнт"
+msgstr "Увімкнути клієнта NTP"
 
 msgid "Enable Single DES"
-msgstr ""
+msgstr "Увімкнути Single DES"
 
 msgid "Enable TFTP server"
 msgstr "Увімкнути TFTP-сервер"
@@ -1072,28 +1119,28 @@ msgid "Enable VLAN functionality"
 msgstr "Увімкнути підтримку VLAN"
 
 msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
-msgstr ""
+msgstr "Увімкнути кнопку WPS, потребує WPA(2)-PSK"
 
 msgid "Enable key reinstallation (KRACK) countermeasures"
-msgstr ""
+msgstr "Увімкнути протидію<br />перевстановленню ключів (KRACK)"
 
 msgid "Enable learning and aging"
 msgstr "Увімкнути learning та aging"
 
 msgid "Enable mirroring of incoming packets"
-msgstr ""
+msgstr "Увімкнути віддзеркалення вхідних пакетів"
 
 msgid "Enable mirroring of outgoing packets"
-msgstr ""
+msgstr "Увімкнути віддзеркалення вихідних пакетів"
 
 msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
-msgstr ""
+msgstr "Увімкнути прапорець DF (Don't Fragment) для інкапсульованих пакетів."
 
 msgid "Enable this mount"
 msgstr "Увімкнути це монтування"
 
 msgid "Enable this swap"
-msgstr "Увімкнути це довантаження"
+msgstr "Увімкнути цей своп"
 
 msgid "Enable/Disable"
 msgstr "Увімкнено/Вимкнено"
@@ -1102,16 +1149,18 @@ msgid "Enabled"
 msgstr "Увімкнено"
 
 msgid "Enables IGMP snooping on this bridge"
-msgstr ""
+msgstr "Вмикає відстеження IGMP на цьому мосту"
 
 msgid ""
 "Enables fast roaming among access points that belong to the same Mobility "
 "Domain"
 msgstr ""
+"Вмикає швидкий роумінг між точками доступу, що належать до одного і "
+"того ж домену мобільності"
 
 msgid "Enables the Spanning Tree Protocol on this bridge"
 msgstr ""
-"УвÑ\96мкнÑ\83Ñ\82и <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому мосту"
+"Ð\92микаÑ\94 <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому мосту"
 
 msgid "Encapsulation mode"
 msgstr "Режим інкапсуляції"
@@ -1120,10 +1169,10 @@ msgid "Encryption"
 msgstr "Шифрування"
 
 msgid "Endpoint Host"
-msgstr ""
+msgstr "Хост кінцевої точки"
 
 msgid "Endpoint Port"
-msgstr ""
+msgstr "Порт кінцевої точки"
 
 msgid "Erasing..."
 msgstr "Видалення..."
@@ -1132,22 +1181,22 @@ msgid "Error"
 msgstr "Помилка"
 
 msgid "Errored seconds (ES)"
-msgstr ""
+msgstr "Секунд з помилками (<abbr title=\"Errored seconds\">ES</abbr>)"
 
 msgid "Ethernet Adapter"
-msgstr "Адаптер Ethernet"
+msgstr "Ethernet-адаптер"
 
 msgid "Ethernet Switch"
 msgstr "Ethernet-комутатор"
 
 msgid "Exclude interfaces"
-msgstr ""
+msgstr "Виключити інтерфейси"
 
 msgid "Expand hosts"
 msgstr "Розширення вузлів"
 
 msgid "Expires"
-msgstr "Ð\94Ñ\96йÑ\81ний Ñ\89е"
+msgstr "Ð\97бÑ\96гаÑ\94 Ð·Ð°"
 
 #, fuzzy
 msgid ""
@@ -1155,13 +1204,13 @@ msgid ""
 msgstr "Термін оренди адрес, мінімум 2 хвилини (<code>2m</code>)."
 
 msgid "External"
-msgstr ""
+msgstr "Зовнішнє"
 
 msgid "External R0 Key Holder List"
-msgstr ""
+msgstr "Зовнішній список власників ключів R0"
 
 msgid "External R1 Key Holder List"
-msgstr ""
+msgstr "Зовнішній список власників ключів R1"
 
 msgid "External system log server"
 msgstr "Зовнішній сервер системного журналу"
@@ -1170,25 +1219,28 @@ msgid "External system log server port"
 msgstr "Порт зовнішнього сервера системного журналу"
 
 msgid "External system log server protocol"
-msgstr ""
+msgstr "Протокол зовнішнього сервера системного журналу"
 
 msgid "Extra SSH command options"
-msgstr ""
+msgstr "Додаткові параметри команд SSH"
 
 msgid "FT over DS"
-msgstr ""
+msgstr "FT через DS"
 
 msgid "FT over the Air"
-msgstr ""
+msgstr "FT через повітря"
 
 msgid "FT protocol"
-msgstr ""
+msgstr "Протокол FT"
+
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr "Не вдалося підтвердити застосування на протязі %d с, очікуємо відкату…"
 
 msgid "File"
 msgstr "Файл"
 
 msgid "Filename of the boot image advertised to clients"
-msgstr "І'мя завантажувального образу, що оголошується клієнтам"
+msgstr "Імя завантажувального образу, що оголошується клієнтам"
 
 msgid "Filesystem"
 msgstr "Файлова система"
@@ -1206,6 +1258,8 @@ msgid ""
 "Find all currently attached filesystems and swap and replace configuration "
 "with defaults based on what was detected"
 msgstr ""
+"Знайти всі файлові системи та свопи, які наразі підключено і замінити "
+"конфігурацію типовою на підставі того, що було виявлено"
 
 msgid "Find and join network"
 msgstr "Знайти мережу й приєднатися"
@@ -1220,37 +1274,37 @@ msgid "Firewall"
 msgstr "Брандмауер"
 
 msgid "Firewall Mark"
-msgstr ""
+msgstr "Позначка брандмауера"
 
 msgid "Firewall Settings"
-msgstr "Настройки брандмауера"
+msgstr "Налаштування брандмауера"
 
 msgid "Firewall Status"
-msgstr "Статус брандмауера"
+msgstr "Стан брандмауера"
 
 msgid "Firmware File"
-msgstr ""
+msgstr "Файл мікропрограми"
 
 msgid "Firmware Version"
-msgstr "Ð\92еÑ\80Ñ\81Ñ\96Ñ\8f Ð¿Ñ\80оÑ\88ивки"
+msgstr "Ð\92еÑ\80Ñ\81Ñ\96Ñ\8f Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами"
 
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Фіксований порт для вихідних DNS-запитів"
 
 msgid "Flash Firmware"
-msgstr "Ð\97аливаÑ\94мо Ð¿Ñ\80оÑ\88ивку"
+msgstr "Ð\9fÑ\80оÑ\88иваÑ\94мо Ð¼Ñ\96кÑ\80опÑ\80огÑ\80аму"
 
 msgid "Flash image..."
-msgstr "Ð\92Ñ\96дванÑ\82ажити образ..."
+msgstr "Ð\9fÑ\80оÑ\88ити образ..."
 
 msgid "Flash new firmware image"
-msgstr "Ð\97алиÑ\82и Ð½Ð¾Ð²Ð¸Ð¹ Ð¾Ð±Ñ\80аз Ð¿Ñ\80оÑ\88ивки"
+msgstr "Ð\9fÑ\80оÑ\88иÑ\82и Ð½Ð¾Ð²Ð¸Ð¹ Ð¾Ð±Ñ\80аз Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами"
 
 msgid "Flash operations"
-msgstr "Ð\9eпеÑ\80аÑ\86Ñ\96Ñ\97 Ð·Ð°Ð»ивання"
+msgstr "Ð\9eпеÑ\80аÑ\86Ñ\96Ñ\97 Ð¿Ñ\80оÑ\88ивання"
 
 msgid "Flashing..."
-msgstr "Ð\97аливаємо..."
+msgstr "Ð\9fÑ\80оÑ\88иваємо..."
 
 msgid "Force"
 msgstr "Примусово"
@@ -1268,28 +1322,28 @@ msgid "Force TKIP and CCMP (AES)"
 msgstr "Примусово TKIP та CCMP (AES)"
 
 msgid "Force link"
-msgstr ""
+msgstr "Примусове з’єднання"
 
 msgid "Force use of NAT-T"
-msgstr ""
+msgstr "Примусово використовувати NAT-T"
 
 msgid "Form token mismatch"
-msgstr ""
+msgstr "Неузгодженість маркера форми"
 
 msgid "Forward DHCP traffic"
-msgstr "Спрямовувати DHCP-трафік"
+msgstr "Ð\9fеÑ\80еÑ\81прямовувати DHCP-трафік"
 
 msgid "Forward Error Correction Seconds (FECS)"
-msgstr ""
+msgstr "Секунди прямого коригування помилок (FECS)"
 
 msgid "Forward broadcast traffic"
-msgstr "Спрямовувати широкомовний трафік"
+msgstr "Ð\9fеÑ\80еÑ\81прямовувати широкомовний трафік"
 
 msgid "Forward mesh peer traffic"
-msgstr ""
+msgstr "Переспрямовувати одноранговий трафік"
 
 msgid "Forwarding mode"
-msgstr "Режим спрямовування"
+msgstr "Режим переспрямовування"
 
 msgid "Fragmentation Threshold"
 msgstr "Поріг фрагментації"
@@ -1305,8 +1359,10 @@ msgstr "Вільне місце"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
+"Більш детальна інформація про інтерфейси та вузли WireGuard на <a href="
+"\"http://wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "ГГц"
@@ -1321,19 +1377,19 @@ msgid "Gateway ports"
 msgstr "Порти шлюзу"
 
 msgid "General Settings"
-msgstr "Ð\97агалÑ\8cнÑ\96 Ð½Ð°Ñ\81Ñ\82Ñ\80ойки"
+msgstr "Ð\97агалÑ\8cнÑ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и"
 
 msgid "General Setup"
-msgstr "Загальні настройки"
+msgstr "Загальні налаштування"
 
 msgid "General options for opkg"
-msgstr ""
+msgstr "Загальні параметри OPKG"
 
 msgid "Generate Config"
-msgstr ""
+msgstr "Cтворити конфігурацію"
 
 msgid "Generate PMK locally"
-msgstr ""
+msgstr "Генерувати PMK локально"
 
 msgid "Generate archive"
 msgstr "Cтворити архів"
@@ -1345,10 +1401,10 @@ msgid "Given password confirmation did not match, password not changed!"
 msgstr "Оскільки пароль і підтвердження не співпадають, то пароль не змінено!"
 
 msgid "Global Settings"
-msgstr ""
+msgstr "Загальні параметри"
 
 msgid "Global network options"
-msgstr ""
+msgstr "Глобальні параметри мережі"
 
 msgid "Go to password configuration..."
 msgstr "Перейти до конфігурації пароля..."
@@ -1357,19 +1413,19 @@ msgid "Go to relevant configuration page"
 msgstr "Перейти до відповідної сторінки конфігурації"
 
 msgid "Group Password"
-msgstr ""
+msgstr "Пароль групи"
 
 msgid "Guest"
-msgstr ""
+msgstr "Гість"
 
 msgid "HE.net password"
 msgstr "Пароль HE.net"
 
 msgid "HE.net username"
-msgstr ""
+msgstr "Ім’я користувача HE.net"
 
 msgid "HT mode (802.11n)"
-msgstr ""
+msgstr "Режим HT (802.11n)"
 
 msgid "Hang Up"
 msgstr "Призупинити"
@@ -1377,14 +1433,11 @@ msgstr "Призупинити"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
 msgstr ""
-"Тут ви можете настроїти основні параметри вигляду вашого пристрою, такі як "
+"Тут ви можете налаштувати основні параметри вигляду вашого пристрою, такі як "
 "назва (ім’я) вузла або часовий пояс."
 
 msgid ""
@@ -1403,7 +1456,7 @@ msgstr ""
 "розширеної служби послуг\">ESSID</abbr>"
 
 msgid "Host"
-msgstr ""
+msgstr "Вузол"
 
 msgid "Host entries"
 msgstr "Записи вузлів"
@@ -1415,10 +1468,10 @@ msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
 msgstr "<abbr title=\"Internet Protocol Address\">IP</abbr> вузла або мережа"
 
 msgid "Hostname"
-msgstr "Назва (ім'я) вузла"
+msgstr "Назва (імя) вузла"
 
 msgid "Hostname to send when requesting DHCP"
-msgstr "Ім'я вузла для надсилання при запиті DHCP"
+msgstr "Імя вузла для надсилання при запиті DHCP"
 
 msgid "Hostnames"
 msgstr "Імена вузлів"
@@ -1430,7 +1483,7 @@ msgid "IKE DH Group"
 msgstr ""
 
 msgid "IP Addresses"
-msgstr ""
+msgstr "Адреси IP"
 
 msgid "IP address"
 msgstr "IP-адреса"
@@ -1441,8 +1494,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Брандмауер IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "СÑ\82аÑ\82Ñ\83Ñ\81 IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr "Ð\92иÑ\81Ñ\85Ñ\96дне Ð·â\80\99Ñ\94днаннÑ\8f IPv4"
 
 msgid "IPv4 address"
 msgstr "Адреса IPv4"
@@ -1451,7 +1504,7 @@ msgid "IPv4 and IPv6"
 msgstr "IPv4 та IPv6"
 
 msgid "IPv4 assignment length"
-msgstr ""
+msgstr "Довжина присвоювання IPv4"
 
 msgid "IPv4 broadcast"
 msgstr "Широкомовний IPv4"
@@ -1484,28 +1537,27 @@ msgid "IPv6 Firewall"
 msgstr "Брандмауер IPv6"
 
 msgid "IPv6 Neighbours"
-msgstr ""
+msgstr "Сусіди IPv6"
 
 msgid "IPv6 Settings"
-msgstr ""
+msgstr "Налаштування IPv6"
 
 msgid "IPv6 ULA-Prefix"
 msgstr ""
+"<abbr title=\"Unique Local Address — унікальна локальна адреса\">ULA"
+"</abbr>-префікс IPv6"
 
-msgid "IPv6 WAN Status"
-msgstr "СÑ\82аÑ\82Ñ\83Ñ\81 IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr "Ð\92иÑ\81Ñ\85Ñ\96дне Ð·â\80\99Ñ\94днаннÑ\8f IPv6"
 
 msgid "IPv6 address"
 msgstr "Адреса IPv6"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
-msgstr ""
+msgstr "Натяк призначення IPv6"
 
 msgid "IPv6 assignment length"
-msgstr ""
+msgstr "Довжина призначення IPv6"
 
 msgid "IPv6 gateway"
 msgstr "Шлюз IPv6"
@@ -1520,10 +1572,10 @@ msgid "IPv6 prefix length"
 msgstr "Довжина префікса IPv6"
 
 msgid "IPv6 routed prefix"
-msgstr ""
+msgstr "Надісланий префікс IPv6"
 
 msgid "IPv6 suffix"
-msgstr ""
+msgstr "Суфікс IPv6"
 
 msgid "IPv6-Address"
 msgstr "IPv6-адреса"
@@ -1541,13 +1593,13 @@ msgid "IPv6-over-IPv4 (6to4)"
 msgstr "IPv6 через IPv4 (6to4)"
 
 msgid "Identity"
-msgstr "Ð\86денÑ\82иÑ\87нÑ\96Ñ\81Ñ\82Ñ\8c"
+msgstr "Ð\9fоÑ\81вÑ\96дÑ\87еннÑ\8f"
 
 msgid "If checked, 1DES is enabled"
-msgstr ""
+msgstr "Якщо позначено, 1DES увімкнено"
 
 msgid "If checked, encryption is disabled"
-msgstr ""
+msgstr "Якщо позначено, шифрування вимкнено"
 
 msgid ""
 "If specified, mount the device by its UUID instead of a fixed device node"
@@ -1559,11 +1611,11 @@ msgid ""
 "If specified, mount the device by the partition label instead of a fixed "
 "device node"
 msgstr ""
-"ЯкÑ\89о Ð¾Ð±Ñ\80ано, Ð¼Ð¾Ð½Ñ\82Ñ\83ваÑ\82и Ð¿Ñ\80иÑ\81Ñ\82Ñ\80Ñ\96й Ð·Ð° Ð½Ð°Ð·Ð²ою його розділу замість фіксованого "
+"ЯкÑ\89о Ð¾Ð±Ñ\80ано, Ð¼Ð¾Ð½Ñ\82Ñ\83ваÑ\82и Ð¿Ñ\80иÑ\81Ñ\82Ñ\80Ñ\96й Ð·Ð° Ð¼Ñ\96Ñ\82кою його розділу замість фіксованого "
 "вузла пристрою"
 
 msgid "If unchecked, no default route is configured"
-msgstr "Якщо не позначено, типовий маршрут не настроєно"
+msgstr "Якщо не позначено, типовий маршрут не налаштовано"
 
 msgid "If unchecked, the advertised DNS server addresses are ignored"
 msgstr "Якщо не позначено, оголошувані адреси DNS-серверів ігноруються"
@@ -1575,15 +1627,15 @@ msgid ""
 "slow process as the swap-device cannot be accessed with the high datarates "
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
-"Якщо фізичної пам'яті недостатньо, невикористовувані дані можуть тимчасово "
+"Якщо фізичної памяті недостатньо, невикористовувані дані можуть тимчасово "
 "витіснятися на своп-пристрій, у результаті чого збільшується кількість "
-"корисної оперативної пам'яті (<abbr title=\"Random Access Memory\">RAM</"
+"корисної оперативної памяті (<abbr title=\"Random Access Memory\">RAM</"
 "abbr>). Майте на увазі, що свопінг даних є дуже повільним процесом, оскільки "
 "своп-пристрої не можуть бути доступні з такою високою швидкістю, як <abbr "
 "title=\"Random Access Memory\">RAM</abbr>."
 
 msgid "Ignore <code>/etc/hosts</code>"
-msgstr ""
+msgstr "Ігнорувати<code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ігнорувати интерфейс"
@@ -1601,6 +1653,9 @@ msgid ""
 "In order to prevent unauthorized access to the system, your request has been "
 "blocked. Click \"Continue »\" below to return to the previous page."
 msgstr ""
+"Щоб запобігти несанкціонованому доступу до системи, ваш запит було "
+"заблоковано. Натисніть \"Продовжити »\" нижче, щоб повернутися до "
+"попередньої сторінки."
 
 msgid "Inactivity timeout"
 msgstr "Тайм-аут бездіяльності"
@@ -1630,13 +1685,13 @@ msgid "Install protocol extensions..."
 msgstr "Інсталяція розширень протоколу..."
 
 msgid "Installed packages"
-msgstr "Інстальовані пакети"
+msgstr "Інстальовано пакети"
 
 msgid "Interface"
 msgstr "Інтерфейс"
 
 msgid "Interface %q device auto-migrated from %q to %q."
-msgstr ""
+msgstr "Пристрій інтерфейсу %q автоматичного мігрував із %q на %q."
 
 msgid "Interface Configuration"
 msgstr "Конфігурація інтерфейсу"
@@ -1651,10 +1706,10 @@ msgid "Interface is shutting down..."
 msgstr "Інтерфейс завершує роботу..."
 
 msgid "Interface name"
-msgstr ""
+msgstr "Ім’я інтерфейсу"
 
 msgid "Interface not present or not connected yet."
-msgstr "Інтерфейс відсутній або ще не підключений."
+msgstr "Інтерфейс відсутній або його ще не підключено."
 
 msgid "Interface reconnected"
 msgstr "Інтерфейс перепідключено"
@@ -1685,14 +1740,13 @@ msgid "Invalid username and/or password! Please try again."
 msgstr "Неприпустиме ім’я користувача та/або пароль! Спробуйте ще раз."
 
 msgid "Isolate Clients"
-msgstr ""
+msgstr "Ізолювати клієнтів"
 
-#, fuzzy
 msgid ""
 "It appears that you are trying to flash an image that does not fit into the "
 "flash memory, please verify the image file!"
 msgstr ""
-"СÑ\85оже, Ñ\89о Ð²Ð¸ Ð½Ð°Ð¼Ð°Ð³Ð°Ñ\94Ñ\82еÑ\81Ñ\8f Ð·Ð°Ð»Ð¸Ñ\82и Ð¾Ð±Ñ\80аз, Ñ\8fкий Ð½Ðµ Ð²Ð¼Ñ\96Ñ\89аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ñ\84леÑ\88-пам'Ñ\8fÑ\82Ñ\8c! "
+"СÑ\85оже, Ñ\89о Ð²Ð¸ Ð½Ð°Ð¼Ð°Ð³Ð°Ñ\94Ñ\82еÑ\81Ñ\8f Ð¿Ñ\80оÑ\88иÑ\82и Ð¾Ð±Ñ\80аз, Ñ\8fкий Ð½Ðµ Ð²Ð¼Ñ\96Ñ\89аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð¾ Ñ\84леÑ\88-памâ\80\99Ñ\8fÑ\82Ñ\96! "
 "Перевірте файл образу!"
 
 msgid "JavaScript required!"
@@ -1705,10 +1759,10 @@ msgid "Join Network: Wireless Scan"
 msgstr "Підключення до мережі: Сканування бездротових мереж"
 
 msgid "Joining Network: %q"
-msgstr ""
+msgstr "Приєднання до мережі: %q"
 
 msgid "Keep settings"
-msgstr "Зберегти настройки"
+msgstr "Зберегти налаштування"
 
 msgid "Kernel Log"
 msgstr "Журнал ядра"
@@ -1750,13 +1804,13 @@ msgid "Language and Style"
 msgstr "Мова та стиль"
 
 msgid "Latency"
-msgstr ""
+msgstr "Затримка"
 
 msgid "Leaf"
-msgstr ""
+msgstr "Лист"
 
 msgid "Lease time"
-msgstr ""
+msgstr "Час оренди"
 
 msgid "Lease validity time"
 msgstr "Час чинності оренди"
@@ -1781,9 +1835,11 @@ msgstr "Межа"
 
 msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
 msgstr ""
+"Обмежувати службу DNS інтерфейсами підмереж, на яких ми обслуговуємо DNS."
 
 msgid "Limit listening to these interfaces, and loopback."
 msgstr ""
+"Обмежитися прослуховуванням цих інтерфейсів і повернутися до початку циклу."
 
 msgid "Line Attenuation (LATN)"
 msgstr ""
@@ -1798,14 +1854,14 @@ msgid "Line Uptime"
 msgstr ""
 
 msgid "Link On"
-msgstr "Зв'язок встановлено"
+msgstr "Звязок встановлено"
 
 msgid ""
 "List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
 "requests to"
 msgstr ""
-"Список <abbr title=\"Domain Name System\">DNS</abbr>-серверів, до яких "
-"пеÑ\80еÑ\81илаÑ\82и Ð·Ð°Ð¿Ð¸Ñ\82и"
+"Список <abbr title=\"Domain Name System\">DNS</abbr>-серверів для "
+"пеÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83ваннÑ\8f Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96в"
 
 msgid ""
 "List of R0KHs in the same Mobility Domain. <br />Format: MAC-address,NAS-"
@@ -1814,6 +1870,13 @@ msgid ""
 "from the R0KH that the STA used during the Initial Mobility Domain "
 "Association."
 msgstr ""
+"Список власників ключів R0 у тому ж домені мобільності. <br />Формат: MAC-"
+"адреса,NAS-ідентифікатор,128-бітний ключ у вигляді шістнадцяткового рядка. "
+"<br />Цей список використовується для відображення <abbr title="
+"\"ідентифікатор власника ключа R0\">R0KH-ID</abbr> (NAS-ідентифікатор) на "
+"MAC-адреси призначення при запиті ключа PMK-R1 від <abbr title=\"власник "
+"ключа R0\">R0KH</abbr>, як станції, що була використана під час початкової "
+"асоціації домену мобільності."
 
 msgid ""
 "List of R1KHs in the same Mobility Domain. <br />Format: MAC-address,R1KH-ID "
@@ -1822,21 +1885,30 @@ msgid ""
 "R0KH. This is also the list of authorized R1KHs in the MD that can request "
 "PMK-R1 keys."
 msgstr ""
+"Список власників ключів R1 у тому ж домені мобільності. <br />Формат: MAC-"
+"адреса,<abbr title=\"ідентифікатор власника ключа R1\">R1KH-ID</abbr> у "
+"формі 6 октетів з двокрапками,128-бітний ключ у вигляді шістнадцяткового "
+"рядка. <br />Цей список використовується для відображення <abbr title="
+"\"ідентифікатор власника ключа R1\">R1KH-ID</abbr> на MAC-адреси призначення "
+"при передаванні ключа PMK-R1 від <abbr title=\"власник ключа R0\">R0KH</"
+"abbr>. Це також список авторизованих <abbr title=\"власник ключа R1\">R1KH</"
+"abbr> у формі <abbr title=\"Message Digest — дайджест повідомлення\">MD</"
+"abbr>, які можуть запитувати ключі PMK-R1."
 
 msgid "List of SSH key files for auth"
 msgstr ""
 
 msgid "List of domains to allow RFC1918 responses for"
-msgstr "Список доменів, для яких дозволені RFC1918-відповіді"
+msgstr "Список доменів, для яких дозволено RFC1918-відповіді"
 
 msgid "List of hosts that supply bogus NX domain results"
 msgstr "Список доменів, які підтримують результати підробки NX-доменів"
 
 msgid "Listen Interfaces"
-msgstr ""
+msgstr "Інтерфейси прослуховування"
 
 msgid "Listen Port"
-msgstr ""
+msgstr "Порти прослуховування"
 
 msgid "Listen only on the given interface or, if unspecified, on all"
 msgstr ""
@@ -1865,7 +1937,7 @@ msgid "Local IPv6 address"
 msgstr "Локальна адреса IPv6"
 
 msgid "Local Service Only"
-msgstr ""
+msgstr "Тільки локальна служба"
 
 msgid "Local Startup"
 msgstr "Локальний запуск"
@@ -1876,13 +1948,13 @@ msgstr "Місцевий час"
 msgid "Local domain"
 msgstr "Локальний домен"
 
-#, fuzzy
 msgid ""
 "Local domain specification. Names matching this domain are never forwarded "
 "and are resolved from DHCP or hosts files only"
 msgstr ""
-"Специфікація локальних доменів. Імена, зіставлені цьому домену, ніколи не "
-"спрямовуються і виділяються тільки через DHCP або файли hosts"
+"Специфікація локального домену. Імена, які зіставлено цьому домену, ніколи "
+"не пересилаються і вирізняються тільки з файлу DHCP (/etc/config/dhcp) або "
+"файлу hosts (/etc/hosts)"
 
 msgid "Local domain suffix appended to DHCP names and hosts file entries"
 msgstr ""
@@ -1896,7 +1968,7 @@ msgid ""
 "Localise hostname depending on the requesting subnet if multiple IPs are "
 "available"
 msgstr ""
-"Локалізувати ім'я хоста залежно від запитуючої підмережі, якщо доступні "
+"Локалізувати ім’я хоста залежно від запитуючої підмережі, якщо доступно "
 "кілька IP-адрес"
 
 msgid "Localise queries"
@@ -1924,7 +1996,7 @@ msgid "Loss of Signal Seconds (LOSS)"
 msgstr ""
 
 msgid "Lowest leased address as offset from the network address."
-msgstr "Найнижча орендована адреса"
+msgstr "Найнижча орендована адреса."
 
 msgid "MAC-Address"
 msgstr "MAC-адреса"
@@ -1988,34 +2060,34 @@ msgid "Mbit/s"
 msgstr "Мбіт/с"
 
 msgid "Memory"
-msgstr "Пам'ять"
+msgstr "Память"
 
 msgid "Memory usage (%)"
-msgstr "Використання пам'яті, %"
+msgstr "Використання памяті, %"
 
 msgid "Mesh Id"
-msgstr ""
+msgstr "Mesh Id"
 
 msgid "Metric"
 msgstr "Метрика"
 
 msgid "Mirror monitor port"
-msgstr ""
+msgstr "Дзеркало порту диспетчера"
 
 msgid "Mirror source port"
-msgstr ""
+msgstr "Дзеркало вихідного порту"
 
 msgid "Missing protocol extension for proto %q"
 msgstr "Відсутні розширення для протоколу %q"
 
 msgid "Mobility Domain"
-msgstr ""
+msgstr "Домен мобільності"
 
 msgid "Mode"
 msgstr "Режим"
 
 msgid "Model"
-msgstr ""
+msgstr "Модель"
 
 msgid "Modem device"
 msgstr "Модем"
@@ -2024,7 +2096,7 @@ msgid "Modem init timeout"
 msgstr "Тайм-аут ініціалізації модему"
 
 msgid "Monitor"
-msgstr "Ð\9cонÑ\96Ñ\82ор"
+msgstr "Ð\94иÑ\81пеÑ\82Ñ\87ер"
 
 msgid "Mount Entry"
 msgstr "Вхід монтування"
@@ -2036,20 +2108,20 @@ msgid "Mount Points"
 msgstr "Точки монтування"
 
 msgid "Mount Points - Mount Entry"
-msgstr "Точки монтування - Записи монтування"
+msgstr "Точки монтування  Записи монтування"
 
 msgid "Mount Points - Swap Entry"
-msgstr "Точки монтування - Вхід довантаження"
+msgstr "Точки монтування – Вхід свопу"
 
 msgid ""
 "Mount Points define at which point a memory device will be attached to the "
 "filesystem"
 msgstr ""
-"Точки монтування визначають, до якої точки пристрою пам'яті буде прикріплена "
-"файлова система"
+"Точки монтування визначають, до якої точки пристрою пам’яті буде прикріплено "
+"файлову систему"
 
 msgid "Mount filesystems not specifically configured"
-msgstr ""
+msgstr "Монтувати не конкретно налаштовані файлові системи"
 
 msgid "Mount options"
 msgstr "Опції монтування"
@@ -2058,10 +2130,10 @@ msgid "Mount point"
 msgstr "Точка монтування"
 
 msgid "Mount swap not specifically configured"
-msgstr ""
+msgstr "Монтувати не конкретно налаштований своп"
 
 msgid "Mounted file systems"
-msgstr "Змонтовані файлові системи"
+msgstr "Змонтовано файлові системи"
 
 msgid "Move down"
 msgstr "Вниз"
@@ -2091,19 +2163,16 @@ msgid "NT Domain"
 msgstr ""
 
 msgid "NTP server candidates"
-msgstr "Кандидати для синхронізації NTP-сервера"
-
-msgid "NTP sync time-out"
-msgstr ""
+msgstr "Кандидати для синхронізації сервера NTP"
 
 msgid "Name"
-msgstr "Ім'я"
+msgstr "Імя"
 
 msgid "Name of the new interface"
-msgstr "Ім'я нового інтерфейсу"
+msgstr "Імя нового інтерфейсу"
 
 msgid "Name of the new network"
-msgstr "Назва (ім'я) нової мережі"
+msgstr "Назва (імя) нової мережі"
 
 msgid "Navigation"
 msgstr "Навігація"
@@ -2127,7 +2196,7 @@ msgid "Next »"
 msgstr "Наступний »"
 
 msgid "No DHCP Server configured for this interface"
-msgstr "Немає DHCP-сервера, настроєного для цього інтерфейсу"
+msgstr "Немає DHCP-сервера, налаштованого для цього інтерфейсу"
 
 msgid "No NAT-T"
 msgstr ""
@@ -2145,10 +2214,10 @@ msgid "No negative cache"
 msgstr "Ніяких негативних кешувань"
 
 msgid "No network configured on this device"
-msgstr "На цьому пристрої нема настроєної мережі"
+msgstr "На цьому пристрої немає налаштованої мережі"
 
 msgid "No network name specified"
-msgstr "Ім'я мережі не визначене"
+msgstr "Ім’я мережі не визначено"
 
 msgid "No package lists available"
 msgstr "Немає доступних списків пакетів"
@@ -2160,22 +2229,22 @@ msgid "No rules in this chain"
 msgstr "У цьму ланцюжку нема правил"
 
 msgid "No zone assigned"
-msgstr "Зона не призначена"
+msgstr "Зону не призначено"
 
 msgid "Noise"
 msgstr "Шум"
 
 msgid "Noise Margin (SNR)"
-msgstr ""
+msgstr "Співвідношення сигнал/шум"
 
 msgid "Noise:"
 msgstr "Шум:"
 
 msgid "Non Pre-emtive CRC errors (CRC_P)"
-msgstr ""
+msgstr "Не запобіжні помилки CRC (CRC_P)"
 
 msgid "Non-wildcard"
-msgstr ""
+msgstr "Без шаблону заміни"
 
 msgid "None"
 msgstr "Жоден"
@@ -2187,16 +2256,16 @@ msgid "Not Found"
 msgstr "Не знайдено"
 
 msgid "Not associated"
-msgstr "Не пов'язаний"
+msgstr "Не повязаний"
 
 msgid "Not connected"
 msgstr "Не підключено"
 
 msgid "Note: Configuration files will be erased."
-msgstr "Примітка: конфігураційні файли будуть видалені."
+msgstr "Примітка: конфігураційні файли буде видалено."
 
 msgid "Note: interface name length"
-msgstr ""
+msgstr "Примітка: довжина імені інтерфейсу"
 
 msgid "Notice"
 msgstr "Попередження"
@@ -2205,7 +2274,7 @@ msgid "Nslookup"
 msgstr "DNS-запит"
 
 msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
-msgstr ""
+msgstr "Кількість кешованих записів DNS (макс. - 10000, 0 - без кешування)"
 
 msgid "OK"
 msgstr "OK"
@@ -2214,10 +2283,13 @@ msgid "OPKG-Configuration"
 msgstr "Конфігурація OPKG"
 
 msgid "Obfuscated Group Password"
-msgstr ""
+msgstr "Обфусований груповий пароль"
 
 msgid "Obfuscated Password"
-msgstr ""
+msgstr "Обфусований пароль"
+
+msgid "Obtain IPv6-Address"
+msgstr "Отримати IPv6-адресу"
 
 msgid "Off-State Delay"
 msgstr "Затримка Off-State"
@@ -2230,18 +2302,18 @@ msgid ""
 "<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
 "<samp>eth0.1</samp>)."
 msgstr ""
-"На цій сторінці ви можете настроїти мережеві інтерфейси. Ви можете "
-"об'єднатиати кілька інтерфейсів мостом, відзначивши поле \"Об'єднати "
-"інтерфейси в міст\" та ввівши імена кількох мережевих інтерфейсів, розділені "
-"пÑ\80обÑ\96лами. Ð¢Ð°ÐºÐ¾Ð¶ Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и <abbr title=\"Virtual Local Area "
-"Network — віртуальна локальна комп'ютерна мережа\">VLAN</abbr>-позначення "
+"На цій сторінці ви можете налаштувати мережеві інтерфейси. Ви можете "
+"об’єднати кілька інтерфейсів мостом, відзначивши поле \"Об’єднати інтерфейси "
+"в міст\" та ввівши імена кількох мережевих інтерфейсів, розділені пробілами. "
+"Також Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и <abbr title=\"Virtual Local Area Network â\80\94 "
+"віртуальна локальна комп’ютерна мережа\">VLAN</abbr>-позначення "
 "<samp>ІНТЕРФЕЙС.НОМЕР_VLAN</samp> (наприклад, <samp>eth0.1</samp>)."
 
 msgid "On-State Delay"
 msgstr "Затримка On-State"
 
 msgid "One of hostname or mac address must be specified!"
-msgstr "Ð\9cаÑ\94 Ð±Ñ\83Ñ\82и Ð²ÐºÐ°Ð·Ð°Ð½Ðµ Ð¾Ð´Ð½Ðµ Ð· Ð´Ð²Ð¾Ñ\85 - Ñ\96м'я вузла або МАС-адреса!"
+msgstr "Ð\9cаÑ\94 Ð±Ñ\83Ñ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87ено Ð¾Ð´Ð½Ðµ Ð· Ð´Ð²Ð¾Ñ\85 â\80\93 Ñ\96мâ\80\99я вузла або МАС-адреса!"
 
 msgid "One or more fields contain invalid values!"
 msgstr "Одне або декілька полів містять неприпустимі значення!"
@@ -2250,7 +2322,7 @@ msgid "One or more invalid/required values on tab"
 msgstr ""
 
 msgid "One or more required fields have no value!"
-msgstr "Одне або декілька обов'язкових полів не мають значень!"
+msgstr "Одне або декілька обовязкових полів не мають значень!"
 
 msgid "Open list..."
 msgstr "Відкрити список..."
@@ -2259,7 +2331,7 @@ msgid "OpenConnect (CISCO AnyConnect)"
 msgstr ""
 
 msgid "Operating frequency"
-msgstr ""
+msgstr "Робоча частота"
 
 msgid "Option changed"
 msgstr "Опція змінена"
@@ -2268,18 +2340,14 @@ msgid "Option removed"
 msgstr "Опція видалена"
 
 msgid "Optional"
-msgstr ""
-
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
+msgstr "Необов’язково"
 
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
 msgstr ""
+"Необов’язково. 32-бітна мітка для вихідних зашифрованих пакетів. Введіть "
+"значення в шістнадцятковому форматі, починаючи з <code>0x</code>."
 
 msgid ""
 "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or "
@@ -2287,25 +2355,34 @@ msgid ""
 "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') "
 "for the interface."
 msgstr ""
+"Необов’язково. Припустимі значення: 'eui64', 'random' чи фіксоване значення, "
+"наприклад '::1' або '::1:2'. Якщо префікс IPv6 (наприклад, 'a:b:c:d::') "
+"отримано від сервера делегування, для формування IPv6-адреси інтерфейсу  "
+"(наприклад, 'a:b:c:d::1') використовуйте суфікс ('::1')."
 
 msgid ""
 "Optional. Base64-encoded preshared key. Adds in an additional layer of "
 "symmetric-key cryptography for post-quantum resistance."
 msgstr ""
+"Необов’язково. Заздалегідь установлений Base64-кодований спільний ключ. "
+"Додавання додатково рівня шифрування із симетричним ключем для пост-"
+"квантової стійкості."
 
 msgid "Optional. Create routes for Allowed IPs for this peer."
-msgstr ""
+msgstr "Необов’язково. Створити для цього вузла маршрути для дозволених IP."
 
 msgid ""
 "Optional. Host of peer. Names are resolved prior to bringing up the "
 "interface."
 msgstr ""
+"Необов’язково. Хост вузла. Імена буде виділено до підняття інтерфейсу"
 
 msgid "Optional. Maximum Transmission Unit of tunnel interface."
 msgstr ""
+"Необов’язково. Максимальний блок передаваних даних тунельного інтерфейсу."
 
 msgid "Optional. Port of peer."
-msgstr ""
+msgstr "Необов’язково. Порт вузла."
 
 msgid ""
 "Optional. Seconds between keep alive messages. Default is 0 (disabled). "
@@ -2314,6 +2391,8 @@ msgstr ""
 
 msgid "Optional. UDP port used for outgoing and incoming packets."
 msgstr ""
+"Необов’язково. UDP-порт, який використовується для вихідних та вхідних "
+"пакетів."
 
 msgid "Options"
 msgstr "Опції"
@@ -2328,7 +2407,7 @@ msgid "Outbound:"
 msgstr "Вихідний:"
 
 msgid "Output Interface"
-msgstr ""
+msgstr "Вихідний інтерфейс"
 
 msgid "Override MAC address"
 msgstr "Перевизначити MAC-адресу"
@@ -2337,13 +2416,13 @@ msgid "Override MTU"
 msgstr "Перевизначити MTU"
 
 msgid "Override TOS"
-msgstr ""
+msgstr "Перевизначити TOS"
 
 msgid "Override TTL"
-msgstr ""
+msgstr "Перевизначити TTL"
 
 msgid "Override default interface name"
-msgstr ""
+msgstr "Перевизначення типового імені інтерфейсу"
 
 msgid "Override the gateway in DHCP responses"
 msgstr "Перевизначення шлюзу у відповідях DHCP"
@@ -2369,7 +2448,7 @@ msgid "PAP/CHAP password"
 msgstr "Пароль PAP/CHAP"
 
 msgid "PAP/CHAP username"
-msgstr "Ім'я користувача PAP/CHAP"
+msgstr "Імя користувача PAP/CHAP"
 
 msgid "PID"
 msgstr "<abbr title=\"Process Identifier — Ідентифікатор процесу\">PID</abbr>"
@@ -2380,7 +2459,7 @@ msgstr ""
 "номер\">>PIN</abbr>"
 
 msgid "PMK R1 Push"
-msgstr ""
+msgstr "Проштовхуваня PMK R1"
 
 msgid "PPP"
 msgstr "PPP"
@@ -2434,13 +2513,13 @@ msgid "Password of Private Key"
 msgstr "Пароль закритого ключа"
 
 msgid "Password of inner Private Key"
-msgstr ""
+msgstr "Пароль внутрішнього закритого ключа"
 
 msgid "Password successfully changed!"
 msgstr "Пароль успішно змінено!"
 
 msgid "Password2"
-msgstr ""
+msgstr "Пароль2"
 
 msgid "Path to CA-Certificate"
 msgstr "Шлях до центру сертифікції"
@@ -2452,25 +2531,25 @@ msgid "Path to Private Key"
 msgstr "Шлях до закритого ключа"
 
 msgid "Path to inner CA-Certificate"
-msgstr ""
+msgstr "Шлях до внутрішнього CA-сертифікату"
 
 msgid "Path to inner Client-Certificate"
-msgstr ""
+msgstr "Шлях до внутрішнього сертифікату клієнта"
 
 msgid "Path to inner Private Key"
-msgstr ""
+msgstr "Шлях до внутрішнього закритого ключа"
 
 msgid "Peak:"
 msgstr "Пік:"
 
 msgid "Peer IP address to assign"
-msgstr ""
+msgstr "Запит IP-адреси призначення"
 
 msgid "Peers"
-msgstr ""
+msgstr "Піри"
 
 msgid "Perfect Forward Secrecy"
-msgstr ""
+msgstr "Perfect Forward Secrecy"
 
 msgid "Perform reboot"
 msgstr "Виконати перезавантаження"
@@ -2479,7 +2558,7 @@ msgid "Perform reset"
 msgstr "Відновити"
 
 msgid "Persistent Keep Alive"
-msgstr ""
+msgstr "Завжди тримати ввімкненим"
 
 msgid "Phy Rate:"
 msgstr "Фізична швидкість:"
@@ -2494,7 +2573,7 @@ msgid "Pkts."
 msgstr "пакетів"
 
 msgid "Please enter your username and password."
-msgstr "Введіть ім'я користувача і пароль"
+msgstr "Введіть ім’я користувача і пароль."
 
 msgid "Policy"
 msgstr "Політика"
@@ -2503,25 +2582,25 @@ msgid "Port"
 msgstr "Порт"
 
 msgid "Port status:"
-msgstr "Статус порту:"
+msgstr "Стан порту:"
 
 msgid "Power Management Mode"
-msgstr ""
+msgstr "Режим керування живленням"
 
 msgid "Pre-emtive CRC errors (CRCP_P)"
-msgstr ""
+msgstr "Попереджувати помилки CRC (CRCP_P)"
 
 msgid "Prefer LTE"
-msgstr ""
+msgstr "Переважно LTE"
 
 msgid "Prefer UMTS"
-msgstr ""
+msgstr "Переважно UMTS"
 
 msgid "Prefix Delegated"
-msgstr ""
+msgstr "Делеговано префікс"
 
 msgid "Preshared Key"
-msgstr ""
+msgstr "Заздалегідь установлений спільний ключ"
 
 msgid ""
 "Presume peer to be dead after given amount of LCP echo failures, use 0 to "
@@ -2531,10 +2610,10 @@ msgstr ""
 "пакета LCP, використовуйте 0, щоб ігнорувати невдачі"
 
 msgid "Prevent listening on these interfaces."
-msgstr ""
+msgstr "Перешкоджати прослуховуванню цих інтерфейсів."
 
 msgid "Prevents client-to-client communication"
-msgstr "Ð\97апобÑ\96гаÑ\94 Ð·Ð²'Ñ\8fзкам клієнт-клієнт"
+msgstr "Ð\9fеÑ\80еÑ\88коджаÑ\82и Ñ\81пÑ\96лкÑ\83ваннÑ\8e клієнт-клієнт"
 
 msgid "Prism2/2.5/3 802.11b Wireless Controller"
 msgstr "Бездротовий 802.11b контролер Prism2/2.5/3"
@@ -2567,10 +2646,10 @@ msgid "Protocol support is not installed"
 msgstr "Підтримка протоколу не інстальована"
 
 msgid "Provide NTP server"
-msgstr "Забезпечувати NTP-сервер"
+msgstr "Забезпечувати сервер NTP"
 
 msgid "Provide new network"
-msgstr "Ð\9fоÑ\81Ñ\82аÑ\87иÑ\82и нову мережу"
+msgstr "УкажÑ\96Ñ\82Ñ\8c нову мережу"
 
 msgid "Pseudo Ad-Hoc (ahdemo)"
 msgstr "Псевдо Ad-Hoc (ahdemo)"
@@ -2588,10 +2667,10 @@ msgid "Quality"
 msgstr "Якість"
 
 msgid "R0 Key Lifetime"
-msgstr ""
+msgstr "Тривалість життя ключа R0"
 
 msgid "R1 Key Holder"
-msgstr ""
+msgstr "Власник ключа R1"
 
 msgid "RFC3947 NAT-T mode"
 msgstr ""
@@ -2630,24 +2709,23 @@ msgid ""
 "Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
 "Configuration Protocol\">DHCP</abbr>-Server"
 msgstr ""
-"Читати <code>/etc/ethers</code> для настроювання <abbr title=\"Dynamic Host "
+"Читати <code>/etc/ethers</code> для налаштування <abbr title=\"Dynamic Host "
 "Configuration Protocol — Протокол динамічної конфігурації вузла\">DHCP</"
 "abbr>-сервера"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
-"Дійсно видалити цей інтерфейс? Скасувати видалення неможливо!\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цей "
-"інтерфейс."
+"Дійсно видалити цей інтерфейс? Скасувати видалення неможливо! Ви можете "
+"втратити доступ до цього пристрою, якщо вас підключено через цей інтерфейс."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
-"Дійсно видалити цю бездротову мережу? Скасувати видалення неможливо!\n"
-"Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\82Ñ\80аÑ\82иÑ\82и Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð¾ Ñ\86Ñ\8cого Ð¿Ñ\80иÑ\81Ñ\82Ñ\80оÑ\8e, Ñ\8fкÑ\89о Ð²Ð¸ Ð¿Ñ\96дклÑ\8eÑ\87енÑ\96 через цю "
+"Дійсно видалити цю бездротову мережу? Скасувати видалення неможливо! Ви "
+"можеÑ\82е Ð²Ñ\82Ñ\80аÑ\82иÑ\82и Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð¾ Ñ\86Ñ\8cого Ð¿Ñ\80иÑ\81Ñ\82Ñ\80оÑ\8e, Ñ\8fкÑ\89о Ð²Ð°Ñ\81 Ð¿Ñ\96дклÑ\8eÑ\87ено через цю "
 "мережу."
 
 msgid "Really reset all changes?"
@@ -2655,20 +2733,18 @@ msgstr "Дійсно скинути всі зміни?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
-"Дійсно вимкнути мережу?\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цю "
-"мережу."
+"Дійсно вимкнути мережу? Ви можете втратити доступ до цього пристрою, якщо "
+"вас підключено через цю мережу."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
-"Дійсно вимкнути інтерфейс \"%s\"?\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цей "
-"інтерфейс."
+"Дійсно вимкнути інтерфейс \"%s\"? Ви можете втратити доступ до цього "
+"пристрою, якщо вас підключено через цей інтерфейс."
 
 msgid "Really switch protocol?"
 msgstr "Дійсно змінити протокол?"
@@ -2689,10 +2765,10 @@ msgid "Realtime Wireless"
 msgstr "Бездротові мережі у реальному часі"
 
 msgid "Reassociation Deadline"
-msgstr ""
+msgstr "Кінцевий термін реассоціації"
 
 msgid "Rebind protection"
-msgstr "Захист від переприв'язки"
+msgstr "Захист від перепривязки"
 
 msgid "Reboot"
 msgstr "Перезавантаження"
@@ -2704,7 +2780,7 @@ msgid "Reboots the operating system of your device"
 msgstr "Перезавантажити операційну систему вашого пристрою"
 
 msgid "Receive"
-msgstr "Ð\9fÑ\80ийом"
+msgstr "Ð\9fÑ\80ийманнÑ\8f"
 
 msgid "Receiver Antenna"
 msgstr "Антена приймача"
@@ -2752,25 +2828,22 @@ msgid "Replace wireless configuration"
 msgstr "Замінити конфігурацію бездротової мережі"
 
 msgid "Request IPv6-address"
-msgstr ""
+msgstr "Запит IPv6-адреси"
 
 msgid "Request IPv6-prefix of length"
-msgstr ""
-
-msgid "Require TLS"
-msgstr ""
+msgstr "Запит довжини IPv6-префіксу"
 
 msgid "Required"
-msgstr ""
+msgstr "Потрібно"
 
 msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
 msgstr "Потрібно для деяких провайдерів, наприклад, Charter із DOCSIS 3"
 
 msgid "Required. Base64-encoded private key for this interface."
-msgstr ""
+msgstr "Потрібно. Base64-закодований закритий ключ для цього інтерфейсу."
 
 msgid "Required. Base64-encoded public key of peer."
-msgstr ""
+msgstr "Потрібно. Base64-закодований публічний ключ вузла."
 
 msgid ""
 "Required. IP addresses and prefixes that this peer is allowed to use inside "
@@ -2782,6 +2855,8 @@ msgid ""
 "Requires the 'full' version of wpad/hostapd and support from the wifi driver "
 "<br />(as of Feb 2017: ath9k and ath10k, in LEDE also mwlwifi and mt76)"
 msgstr ""
+"Потребує \"повної\" версії wpad/hostapd та підтримки драйвером WiFi <br />"
+"(станом на лютий 2017 року: ath9k та ath10k, у LEDE також mwlwifi та mt76)"
 
 msgid ""
 "Requires upstream supports DNSSEC; verify unsigned domain responses really "
@@ -2816,8 +2891,17 @@ msgid "Reveal/hide password"
 msgstr "Показати/приховати пароль"
 
 msgid "Revert"
+msgstr "Скасувати"
+
+msgid "Revert changes"
 msgstr "Скасувати зміни"
 
+msgid "Revert request failed with status <code>%h</code>"
+msgstr "Сталася помилка запиту на скасування зі статусом <code>%h</code>"
+
+msgid "Reverting configuration…"
+msgstr "Відкат конфігурації…"
+
 msgid "Root"
 msgstr "Корінь"
 
@@ -2825,19 +2909,16 @@ msgid "Root directory for files served via TFTP"
 msgstr "Кореневий каталог для файлів TFTP"
 
 msgid "Root preparation"
-msgstr ""
+msgstr "Підготовка Root"
 
 msgid "Route Allowed IPs"
-msgstr ""
+msgstr "Маршрутизація дозволених IP-адрес"
 
 msgid "Route type"
-msgstr ""
-
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
+msgstr "Тип маршруту"
 
 msgid "Router Advertisement-Service"
-msgstr ""
+msgstr "Служба оголошень маршрутизатора"
 
 msgid "Router Password"
 msgstr "Пароль маршрутизатора"
@@ -2861,14 +2942,6 @@ msgstr "Виконати перевірку файлової системи"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2896,9 +2969,6 @@ msgstr "Зберегти"
 msgid "Save & Apply"
 msgstr "Зберегти і застосувати"
 
-msgid "Save &#38; Apply"
-msgstr "Зберегти і застосувати"
-
 msgid "Scan"
 msgstr "Сканувати"
 
@@ -2912,7 +2982,7 @@ msgid "Section removed"
 msgstr "Секція видалена"
 
 msgid "See \"mount\" manpage for details"
-msgstr "Подробиці див. на сторінці керівництва \"mount\""
+msgstr "Подробиці дивись на сторінці керівництва \"mount\""
 
 msgid ""
 "Send LCP echo requests at the given interval in seconds, only effective in "
@@ -2925,21 +2995,10 @@ msgid "Separate Clients"
 msgstr "Розділяти клієнтів"
 
 msgid "Server Settings"
-msgstr "Настройки сервера"
-
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
+msgstr "Налаштування сервера"
 
 msgid "Service Name"
-msgstr "Назва (ім'я) сервісу"
+msgstr "Назва (імя) сервісу"
 
 msgid "Service Type"
 msgstr "Тип сервісу"
@@ -2951,13 +3010,14 @@ msgid ""
 "Set interface properties regardless of the link carrier (If set, carrier "
 "sense events do not invoke hotplug handlers)."
 msgstr ""
+"Властивості інтерфейсу встановлюються незалежно від каналу зв’язку (якщо "
+"позначено, обробник автовизначення не викликається при змінах)."
 
-#, fuzzy
 msgid "Set up Time Synchronization"
-msgstr "Настройки синхронізації часу"
+msgstr "Налаштування синхронізації часу"
 
 msgid "Setup DHCP Server"
-msgstr "Настройки DHCP-сервера"
+msgstr "Налаштування DHCP-сервера"
 
 msgid "Severely Errored Seconds (SES)"
 msgstr ""
@@ -2990,7 +3050,7 @@ msgid "Size (.ipk)"
 msgstr ""
 
 msgid "Size of DNS query cache"
-msgstr ""
+msgstr "Розмір кешу запитів DNS"
 
 msgid "Skip"
 msgstr "Пропустити"
@@ -3014,7 +3074,7 @@ msgid "Some fields are invalid, cannot save values!"
 msgstr "Деякі поля є неприпустимими, неможливо зберегти значення!"
 
 msgid "Sorry, the object you requested was not found."
-msgstr "На жаль, об'єкт, який ви просили, не знайдено."
+msgstr "На жаль, обєкт, який ви просили, не знайдено."
 
 msgid "Sorry, the server encountered an unexpected error."
 msgstr "На жаль, на сервері сталася неочікувана помилка."
@@ -3024,9 +3084,9 @@ msgid ""
 "flashed manually. Please refer to the wiki for device specific install "
 "instructions."
 msgstr ""
-"Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ð°Ð²Ñ\82омаÑ\82иÑ\87не Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f Ñ\81иÑ\81Ñ\82еми Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f. Ð\9dовий Ð¾Ð±Ñ\80аз "
-"прошивки повинен бути залитий вручну. Зверніться до Wiki за інструкцією з "
-"інсталяції для конкретного пристрою."
+"Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f Ñ\81иÑ\81Ñ\82еми Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f. Ð\9dовий Ð¾Ð±Ñ\80аз Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами "
+"слід прошити вручну. Зверніться до Wiki за інструкцією з інсталяції "
+"для конкретного пристрою."
 
 msgid "Sort"
 msgstr "Сортування"
@@ -3034,9 +3094,6 @@ msgstr "Сортування"
 msgid "Source"
 msgstr "Джерело"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "Визначає каталог, до якого приєднаний пристрій"
 
@@ -3079,6 +3136,9 @@ msgstr "Запустити"
 msgid "Start priority"
 msgstr "Стартовий пріоритет"
 
+msgid "Starting configuration apply…"
+msgstr "Застосовується стартова конфігурація…"
+
 msgid "Startup"
 msgstr "Запуск"
 
@@ -3095,7 +3155,7 @@ msgid "Static Routes"
 msgstr "Статичні маршрути"
 
 msgid "Static address"
-msgstr "Статичні адреси"
+msgstr "Статична адреса"
 
 msgid ""
 "Static leases are used to assign fixed IP addresses and symbolic hostnames "
@@ -3108,7 +3168,7 @@ msgstr ""
 "орендою."
 
 msgid "Status"
-msgstr "Статус"
+msgstr "Стан"
 
 msgid "Stop"
 msgstr "Зупинити"
@@ -3120,16 +3180,16 @@ msgid "Submit"
 msgstr "Надіслати"
 
 msgid "Suppress logging"
-msgstr ""
+msgstr "Блокувати журналювання"
 
 msgid "Suppress logging of the routine operation of these protocols"
-msgstr ""
+msgstr "Блокувати ведення журналу звичайної роботи цих протоколів"
 
 msgid "Swap"
-msgstr ""
+msgstr "Своп"
 
 msgid "Swap Entry"
-msgstr "Вхід довантаження"
+msgstr "Вхід своп"
 
 msgid "Switch"
 msgstr "Комутатор"
@@ -3143,12 +3203,14 @@ msgstr "Комутатор %q (%s)"
 msgid ""
 "Switch %q has an unknown topology - the VLAN settings might not be accurate."
 msgstr ""
+"Комутатор %q має невідому топологію – параметри VLAN можуть бути "
+"неправильними."
 
 msgid "Switch Port Mask"
-msgstr ""
+msgstr "Маска портів комутатора"
 
 msgid "Switch VLAN"
-msgstr ""
+msgstr "VLAN комутатора"
 
 msgid "Switch protocol"
 msgstr "Протокол комутатора"
@@ -3175,7 +3237,7 @@ msgid "TCP:"
 msgstr "TCP:"
 
 msgid "TFTP Settings"
-msgstr "Настройки TFTP"
+msgstr "Налаштування TFTP"
 
 msgid "TFTP server root"
 msgstr "Корінь TFTP-сервера"
@@ -3206,11 +3268,11 @@ msgid ""
 "multi-SSID capable). Per network settings like encryption or operation mode "
 "are grouped in the <em>Interface Configuration</em>."
 msgstr ""
-"Розділ <em>Конфігурація пристрою</em> охоплює фізичні параметри радіо-"
-"апаратних засобів, такі, як канал, потужність передавача або вибір антени, "
-"які є спільними для всіх визначених бездротових мереж (якщо радіо-апаратні "
+"Розділ <em>Конфігурація пристрою</em> охоплює фізичні параметри апаратних "
+"радіо-засобів, такі, як канал, потужність передавача або вибір антени, "
+"які є спільними для всіх визначених бездротових мереж (якщо апаратні радіо-"
 "засоби здатні підтримувати кілька SSID). Параметри окремих мереж, такі, як "
-"шифрування або режим роботи, згруповані в розділі <em>Конфігурація "
+"шифрування або режим роботи, згруповано в розділі <em>Конфігурація "
 "інтерфейсу</em>."
 
 msgid ""
@@ -3218,7 +3280,7 @@ msgid ""
 "component for working wireless configuration!"
 msgstr ""
 "Пакет <em>libiwinfo-lua</em> не інстальований. Щоб мати можливість "
-"настроювати безпровідні мережі, слід інсталювати цей компонент!"
+"налаштувати безпровідні мережі, слід інсталювати цей компонент!"
 
 msgid ""
 "The HE.net endpoint update configuration changed, you must now use the plain "
@@ -3232,29 +3294,46 @@ msgstr ""
 msgid ""
 "The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
 msgstr ""
-"Призначений провайдеру IPv6-префікс, зазвичай закінчується на <code>::</code>"
+"Призначений провайдером IPv6-префікс, зазвичай закінчується на <code>::</"
+"code>"
 
 msgid ""
 "The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
 "code> and <code>_</code>"
 msgstr ""
-"Дозволені символи: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> та "
+"Дозволено символи: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> та "
 "<code>_</code>"
 
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+"Пристрій недосяжний протягом %d секунд після застосування очікуючих змін, що "
+"призвело до відкочування конфигурації з міркувань безпеки. Проте, якщо ви "
+"впевнені, що зміни конфігурації є правильними, застосуйте неперевірену "
+"конфігурацію. Крім того, ви можете відхилити це попередження та "
+"відредагувати зміни, перш ніж намагатись застосувати їх знову, або ж "
+"скасувати всі очікуючі зміни, щоб зберегти поточну робочу конфігурацію."
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
-msgstr "Файл пристрою пам'яті або розділу (наприклад, <code>/dev/sda1</code>)"
+msgstr "Файл пристрою памяті або розділу (наприклад, <code>/dev/sda1</code>)"
 
 msgid ""
 "The filesystem that was used to format the memory (<abbr title=\"for example"
 "\">e.g.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></"
 "samp>)"
 msgstr ""
-"Файлова система, яка використовуватиметься для форматування пам'яті "
+"Файлова система, яка використовуватиметься для форматування памяті "
 "(наприклад, <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></"
 "samp>)"
 
@@ -3263,29 +3342,26 @@ msgid ""
 "compare them with the original file to ensure data integrity.<br /> Click "
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
-"Образ завантажено. Нижче наведено контрольну суму і розмір файлу. Порівняйте "
-"їх з вихідним файлом для забезпечення цілісності даних.<br /> Натисніть "
-"\"Продовжити\", щоб розпочати процедуру оновлення прошивки."
-
-msgid "The following changes have been committed"
-msgstr "Нижче наведені зміни були застосовані"
+"Образ завантажено. Нижче наведено контрольну суму та розмір файлу. "
+"Порівняйте їх з вихідним файлом, шоб переконатися в цілісності даних.<br /> "
+"Натисніть \"Продовжити\", щоб розпочати процедуру прошивання."
 
 msgid "The following changes have been reverted"
-msgstr "Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\96 Ð·Ð¼Ñ\96ни Ð±Ñ\83ли Ñ\81каÑ\81ованÑ\96"
+msgstr "Ð\9dаведенÑ\96 Ð½Ð¸Ð¶Ñ\87е Ð·Ð¼Ñ\96ни Ð±Ñ\83ло Ñ\81каÑ\81овано"
 
 msgid "The following rules are currently active on this system."
-msgstr "У Ð´Ð°Ð½Ð¸Ð¹ Ñ\87аÑ\81 Ñ\83 цій системі активні такі правила."
+msgstr "Ð\9dаÑ\80азÑ\96 Ð² цій системі активні такі правила."
 
 msgid "The given network name is not unique"
-msgstr "Задане мережеве ім'я не є унікальним"
+msgstr "Задане мережеве імя не є унікальним"
 
 #, fuzzy
 msgid ""
 "The hardware is not multi-SSID capable and the existing configuration will "
 "be replaced if you proceed."
 msgstr ""
-"Обладнання не підтримує мульти-SSID і, якщо ви продовжите, існуюча "
-"конÑ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\8f Ð±Ñ\83де Ð·Ð°Ð¼Ñ\96нена."
+"Обладнання не підтримує мульти-SSID і, якщо ви продовжите, існуючу "
+"конÑ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\8e Ð±Ñ\83де Ð·Ð°Ð¼Ñ\96нено."
 
 msgid ""
 "The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
@@ -3306,12 +3382,12 @@ msgid ""
 "segments. Often there is by default one Uplink port for a connection to the "
 "next greater network like the internet and other ports for a local network."
 msgstr ""
-"Мережеві порти вашого пристрою можуть бути об'єднані у декілька <abbr title="
-"\"Virtual Local Area Network — віртуальна локальна комп'ютерна мережа"
-"\">VLAN</abbr>, у яких комп'ютери можуть напряму спілкуватися один з одним. "
-"<abbr title=\"Virtual Local Area Network — віртуальна локальна комп'ютерна "
+"Мережеві порти вашого пристрою може бути об’єднано у декілька <abbr title="
+"\"Virtual Local Area Network — віртуальна локальна компютерна мережа"
+"\">VLAN</abbr>, у яких компютери можуть напряму спілкуватися один з одним. "
+"<abbr title=\"Virtual Local Area Network — віртуальна локальна компютерна "
 "мережа\">VLAN</abbr> часто використовуються для розділення мережі на окремі "
-"сегменти. Зазвичай один виcхідний порт використовується для з'єднання з "
+"сегменти. Зазвичай один виcхідний порт використовується для зєднання з "
 "більшою мережею, такою наприклад, як Інтернет, а інші порти — для локальної "
 "мережі."
 
@@ -3337,13 +3413,8 @@ msgid ""
 msgstr ""
 "Система перепрошивається.<br /> <strong>НЕ ВИМИКАЙТЕ ЖИВЛЕННЯ ПРИСТРОЮ!</"
 "strong><br /> Зачекайте кілька хвилин перед тим, як пробувати знову "
-"з'єднатися. Залежно від ваших настройок, можливо, вам треба буде оновити "
-"адресу вашого комп'ютера, щоб знову отримати доступ до пристрою."
-
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
+"під’єднатися. Залежно від налаштувань, можливо, треба буде оновити "
+"адресу вашого комп’ютера, щоб знову отримати доступ до пристрою."
 
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
@@ -3355,11 +3426,11 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "Активних оренд немає."
 
-msgid "There are no pending changes to apply!"
-msgstr "Немає жодних змін до застосування!"
+msgid "There are no changes to apply."
+msgstr "Немає жодних змін до застосування."
 
 msgid "There are no pending changes to revert!"
-msgstr "Немає жодних змін до скасування!"
+msgstr "Ð\9dемаÑ\94 Ð¶Ð¾Ð´Ð½Ð¸Ñ\85 Ð¾Ñ\87Ñ\96кÑ\83Ñ\8eÑ\87иÑ\85 Ð·Ð¼Ñ\96н Ð´Ð¾ Ñ\81каÑ\81Ñ\83ваннÑ\8f!"
 
 msgid "There are no pending changes!"
 msgstr "Немає жодних очікуючих змін!"
@@ -3386,6 +3457,9 @@ msgid ""
 "'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
 "Name System\">DNS</abbr> servers."
 msgstr ""
+"Цей файл може містити такі рядки, як 'server=/domain/1.2.3.4' або "
+"'server=1.2.3.4' для домен-орієнтованих або повних висхідних <abbr title="
+"\"Domain Name System\">DNS</abbr>-серверів."
 
 msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
@@ -3400,6 +3474,8 @@ msgid ""
 "This is either the \"Update Key\" configured for the tunnel or the account "
 "password if no update key has been configured"
 msgstr ""
+"Це або \"Update Key\", сконфігурований для тунелю, або пароль облікового "
+"запису, якщо ключ оновлення не налаштовано"
 
 msgid ""
 "This is the content of /etc/rc.local. Insert your own commands here (in "
@@ -3412,8 +3488,8 @@ msgid ""
 "This is the local endpoint address assigned by the tunnel broker, it usually "
 "ends with <code>...:2/64</code>"
 msgstr ""
-"Це локальна адреса кінцевої точки, присвоєна тунельним брокером, зазвичай "
-"закÑ\96нÑ\87Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° <code>...:2/64</code>"
+"Це локальна адреса кінцевої точки, яку присвоєно тунельним брокером, "
+"вона Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð·Ð°ÐºÑ\96нÑ\87Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° <code>â\80¦:2/64</code>"
 
 msgid ""
 "This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@@ -3423,11 +3499,13 @@ msgstr ""
 "динамічної конфігурації вузла\">DHCP</abbr> у локальній мережі"
 
 msgid "This is the plain username for logging into the account"
-msgstr ""
+msgstr "Це звичайне ім’я користувача для входу до облікового запису"
 
 msgid ""
 "This is the prefix routed to you by the tunnel broker for use by clients"
 msgstr ""
+"Це префікс, що надсилається до вас тунельним брокером для використання "
+"клієнтами"
 
 msgid "This is the system crontab in which scheduled tasks can be defined."
 msgstr ""
@@ -3437,15 +3515,14 @@ msgstr ""
 msgid ""
 "This is usually the address of the nearest PoP operated by the tunnel broker"
 msgstr ""
-"Зазвичай, це адреса найближчої точки присутності, що управляється тунелним "
+"Зазвичай, це адреса найближчої точки присутності, що управляється тунельним "
 "брокером"
 
 msgid ""
 "This list gives an overview over currently running system processes and "
 "their status."
 msgstr ""
-"У цьому списку наведені працюючі на даний момент системні процеси та їх "
-"статус."
+"У цьому списку наведено працюючі наразі системні процеси та їх стан."
 
 msgid "This page gives an overview over currently active network connections."
 msgstr "Ця сторінка надає огляд поточних активних мережних підключень."
@@ -3457,7 +3534,7 @@ msgid "Time Synchronization"
 msgstr "Синхронізація часу"
 
 msgid "Time Synchronization is not configured yet."
-msgstr "СинÑ\85Ñ\80онÑ\96заÑ\86Ñ\96Ñ\8f Ñ\87аÑ\81Ñ\83 Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\80оÑ\94на."
+msgstr "СинÑ\85Ñ\80онÑ\96заÑ\86Ñ\96Ñ\8e Ñ\87аÑ\81Ñ\83 Ð½Ðµ Ð½Ð°Ð»Ð°Ñ\88Ñ\82овано."
 
 msgid "Timezone"
 msgstr "Часовий пояс"
@@ -3470,7 +3547,7 @@ msgstr ""
 "архів резервної копії."
 
 msgid "Tone"
-msgstr ""
+msgstr "Тоновий"
 
 msgid "Total Available"
 msgstr "Усього доступно"
@@ -3488,7 +3565,7 @@ msgid "Transmission Rate"
 msgstr "Швидкість передавання"
 
 msgid "Transmit"
-msgstr "Передача"
+msgstr "Передавання"
 
 msgid "Transmit Power"
 msgstr "Потужність передавача"
@@ -3509,16 +3586,7 @@ msgid "Tunnel Interface"
 msgstr "Інтерфейс тунелю"
 
 msgid "Tunnel Link"
-msgstr ""
-
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
+msgstr "Посилання тунелю"
 
 msgid "Tx-Power"
 msgstr "Потужність передавача"
@@ -3539,7 +3607,7 @@ msgid "USB Device"
 msgstr "USB-пристрій"
 
 msgid "USB Ports"
-msgstr ""
+msgstr "USB-порт"
 
 msgid "UUID"
 msgstr "UUID"
@@ -3548,7 +3616,7 @@ msgid "Unable to dispatch"
 msgstr "Не вдалося опрацювати запит"
 
 msgid "Unavailable Seconds (UAS)"
-msgstr ""
+msgstr "Недоступні секунди (<abbr title=\"Unavailable Seconds\">UAS</abbr>)"
 
 msgid "Unknown"
 msgstr "Невідомо"
@@ -3560,7 +3628,7 @@ msgid "Unmanaged"
 msgstr "Некерований"
 
 msgid "Unmount"
-msgstr ""
+msgstr "Демонтувати"
 
 msgid "Unsaved Changes"
 msgstr "Незбережені зміни"
@@ -3569,16 +3637,16 @@ msgid "Unsupported protocol type."
 msgstr "Непідтримуваний тип протоколу."
 
 msgid "Update lists"
-msgstr "Оновити списки..."
+msgstr "Оновити списки"
 
 msgid ""
 "Upload a sysupgrade-compatible image here to replace the running firmware. "
 "Check \"Keep settings\" to retain the current configuration (requires a "
 "compatible firmware image)."
 msgstr ""
-"Ð\92Ñ\96дванÑ\82ажиÑ\82и sysupgrade-Ñ\81Ñ\83мÑ\96Ñ\81ний Ð¾Ð±Ñ\80аз, Ñ\89об Ð·Ð°Ð¼Ñ\96ниÑ\82и Ð¿Ð¾Ñ\82оÑ\87нÑ\83 Ð¿Ñ\80оÑ\88ивкÑ\83. Ð\94лÑ\8f "
-"збеÑ\80еженнÑ\8f Ð¿Ð¾Ñ\82оÑ\87ноÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c Ð¿Ñ\80апоÑ\80еÑ\86Ñ\8c \"Ð\97беÑ\80егÑ\82и Ð½Ð°Ñ\81Ñ\82Ñ\80ойки"
-"\" (потрібен сумісний образ прошивки)."
+"Ð\92Ñ\96дванÑ\82ажиÑ\82и sysupgrade-Ñ\81Ñ\83мÑ\96Ñ\81ний Ð¾Ð±Ñ\80аз, Ñ\89об Ð·Ð°Ð¼Ñ\96ниÑ\82и Ð¿Ð¾Ñ\82оÑ\87нÑ\83 Ð¼Ñ\96кÑ\80опÑ\80огÑ\80амÑ\83. "
+"Ð\94лÑ\8f Ð·Ð±ÐµÑ\80еженнÑ\8f Ð¿Ð¾Ñ\82оÑ\87ноÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c Ð¿Ñ\80апоÑ\80еÑ\86Ñ\8c \"Ð\97беÑ\80егÑ\82и "
+"налаштування\" (потрібен сумісний образ мікропрограми)."
 
 msgid "Upload archive..."
 msgstr "Відвантажити архів..."
@@ -3608,16 +3676,16 @@ msgid "Use TTL on tunnel interface"
 msgstr "Використовувати на тунельному інтерфейсі TTL"
 
 msgid "Use as external overlay (/overlay)"
-msgstr ""
+msgstr "Використовувати як зовнішній оверлей (/overlay)"
 
 msgid "Use as root filesystem (/)"
-msgstr ""
+msgstr "Використовувати як кореневу файлову систему (/)"
 
 msgid "Use broadcast flag"
 msgstr "Використовувати прапорець широкомовності"
 
 msgid "Use builtin IPv6-management"
-msgstr ""
+msgstr "Використовувати вбудоване керування IPv6"
 
 msgid "Use custom DNS servers"
 msgstr "Використовувати особливі DNS-сервери"
@@ -3640,8 +3708,8 @@ msgid ""
 msgstr ""
 "Використовуйте кнопку <em>Додати</em>, щоб додати новий запис оренди. "
 "<em>MAC-адреса</em> ідентифікує вузол, <em>IPv4-адреса</em> визначає "
-"фіксовану адресу, яка буде використовуватися, а <em>Назва (ім'я) вузла</em> "
-"призначає символічне ім'я вузла."
+"фіксовану адресу, яка буде використовуватися, а <em>Назва (імя) вузла</em> "
+"призначає символічне імя вузла."
 
 msgid "Used"
 msgstr "Використано"
@@ -3653,21 +3721,24 @@ msgid ""
 "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not "
 "needed with normal WPA(2)-PSK."
 msgstr ""
+"Використовується для двох різних цілей: RADIUS NAS ID і 802.11r <abbr "
+"title=\"ідентифікатор власника ключа R0\">R0KH-ID</abbr>. Не потрібно за "
+"звичайного WPA(2)-PSK."
 
 msgid "User certificate (PEM encoded)"
-msgstr ""
+msgstr "Сертифікат користувача (PEM-кодований)"
 
 msgid "User key (PEM encoded)"
-msgstr ""
+msgstr "Ключ користувача (PEM-кодований)"
 
 msgid "Username"
-msgstr "Ім'я користувача"
+msgstr "Імя користувача"
 
 msgid "VC-Mux"
 msgstr "VC-Mux"
 
 msgid "VDSL"
-msgstr ""
+msgstr "VDSL"
 
 msgid "VLANs on %q"
 msgstr "VLAN на %q"
@@ -3676,35 +3747,29 @@ msgid "VLANs on %q (%s)"
 msgstr "VLAN на %q (%s)"
 
 msgid "VPN Local address"
-msgstr ""
+msgstr "Локальна адреса VPN"
 
 msgid "VPN Local port"
-msgstr ""
+msgstr "Локальний порт VPN"
 
 msgid "VPN Server"
 msgstr "VPN-сервер"
 
 msgid "VPN Server port"
-msgstr ""
+msgstr "Порт VPN-сервера"
 
 msgid "VPN Server's certificate SHA1 hash"
-msgstr ""
+msgstr "SHA1-геш сертифіката VPN-сервера"
 
 msgid "VPNC (CISCO 3000 (and others) VPN)"
-msgstr ""
+msgstr "VPNC (CISCO 3000 (та інш.) VPN)"
 
 msgid "Vendor"
-msgstr ""
+msgstr "Постачальник"
 
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Клас постачальника для відправки при запиті DHCP"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "Перевірте"
 
@@ -3724,7 +3789,7 @@ msgid "WEP passphrase"
 msgstr "Парольна фраза WEP"
 
 msgid "WMM Mode"
-msgstr "Режим WMM"
+msgstr "Режим <abbr title=\"Wi-Fi Multimedia\">WMM</abbr>"
 
 msgid "WPA passphrase"
 msgstr "Парольна фраза WPA"
@@ -3736,41 +3801,36 @@ msgstr ""
 "WPA-шифрування потребує інсталяції <em>wpa_supplicant</em> (для режиму "
 "клієнта) або <em>hostapd</em> (для Точки доступу та режиму ad-hoc)."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "Очікуємо, доки зміни наберуть чинності..."
 
 msgid "Waiting for command to complete..."
 msgstr "Очікуємо завершення виконання команди..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "Чекаємо на застосування конфігурації… %d c"
+
 msgid "Waiting for device..."
-msgstr ""
+msgstr "Очікуємо пристрій..."
 
 msgid "Warning"
 msgstr "Застереження"
 
 msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
+"Застереження: Є незбережені зміни, які буде втрачено при перезавантаженні!"
 
 msgid ""
 "When using a PSK, the PMK can be generated locally without inter AP "
 "communications"
 msgstr ""
-
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
+"При використанні PSK, PMK може бути створений локально без взаємодії між AP"
 
 msgid "Width"
-msgstr ""
+msgstr "Ширина"
 
 msgid "WireGuard VPN"
-msgstr ""
+msgstr "WireGuard VPN"
 
 msgid "Wireless"
 msgstr "Бездротові мережі"
@@ -3788,19 +3848,19 @@ msgid "Wireless Security"
 msgstr "Безпека бездротової мережі"
 
 msgid "Wireless is disabled or not associated"
-msgstr "Бездротову мережу вимкнено або не пов'язано"
+msgstr "Бездротову мережу вимкнено або не повязано"
 
 msgid "Wireless is restarting..."
 msgstr "Бездротова мережа перезапускається..."
 
 msgid "Wireless network is disabled"
-msgstr "Бездротова мережа вимкнена"
+msgstr "Бездротову мережу вимкнено"
 
 msgid "Wireless network is enabled"
-msgstr "Бездротова мережа ввімкнена"
+msgstr "Бездротову мережу ввімкнено"
 
 msgid "Wireless restarted"
-msgstr "Бездротова мережа перезапущена"
+msgstr "Бездротову мережу перезапущено"
 
 msgid "Wireless shut down"
 msgstr "Бездротова мережа припинила роботу"
@@ -3809,7 +3869,7 @@ msgid "Write received DNS requests to syslog"
 msgstr "Записувати отримані DNS-запити до системного журналу"
 
 msgid "Write system log to file"
-msgstr ""
+msgstr "Записувати cистемний журнал до файлу"
 
 msgid ""
 "You can enable or disable installed init scripts here. Changes will applied "
@@ -3824,14 +3884,17 @@ msgstr ""
 msgid ""
 "You must enable JavaScript in your browser or LuCI will not work properly."
 msgstr ""
-"Ð\92и Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ\96 Ñ\83вÑ\96мкнÑ\83Ñ\82и JavaScript Ñ\83 Ð²Ð°Ñ\88омÑ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96, Ð°Ð±Ð¾ LuCI Ð½Ðµ Ð±Ñ\83де "
-"пÑ\80аÑ\86Ñ\8eваÑ\82и Ð½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ Ñ\87ином."
+"Ð\92ам Ñ\81лÑ\96д Ñ\83вÑ\96мкнÑ\83Ñ\82и JavaScript Ñ\83 Ð²Ð°Ñ\88омÑ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96, Ð°Ð±Ð¾ LuCI Ð½Ðµ Ð±Ñ\83де Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и "
+"належним чином."
 
 msgid ""
 "Your Internet Explorer is too old to display this page correctly. Please "
 "upgrade it to at least version 7 or use another browser like Firefox, Opera "
 "or Safari."
 msgstr ""
+"Ваш Internet Explorer занадто старий, щоб правильно відобразити цю сторінку. "
+"Поновіть його, принаймні, до версії 7 або скористайтесь іншим браузером, "
+"таким як Firefox, Opera або Safari."
 
 msgid "any"
 msgstr "будь-який"
@@ -3843,13 +3906,16 @@ msgid "baseT"
 msgstr "baseT"
 
 msgid "bridged"
-msgstr "зв'язано"
+msgstr "зв’язано"
+
+msgid "create"
+msgstr "створити"
 
 msgid "create:"
 msgstr "створити:"
 
 msgid "creates a bridge over specified interface(s)"
-msgstr "Створити міст через вказаний інтерфейс(и)"
+msgstr "Створює міст через зазначені інтерфейси"
 
 msgid "dB"
 msgstr "дБ"
@@ -3861,7 +3927,7 @@ msgid "disable"
 msgstr "вимкнено"
 
 msgid "disabled"
-msgstr ""
+msgstr "вимкнено"
 
 msgid "expired"
 msgstr "минув"
@@ -3874,7 +3940,7 @@ msgstr ""
 "Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-оренди"
 
 msgid "forward"
-msgstr "пеÑ\80еÑ\81лати"
+msgstr "пеÑ\80еÑ\81пÑ\80Ñ\8fмÑ\83вати"
 
 msgid "full-duplex"
 msgstr "повний дуплекс"
@@ -3889,7 +3955,7 @@ msgid "hidden"
 msgstr "прихований"
 
 msgid "hybrid mode"
-msgstr ""
+msgstr "гібридний режим"
 
 msgid "if target is a network"
 msgstr "якщо мета — мережа"
@@ -3911,23 +3977,20 @@ msgstr ""
 "Локальний <abbr title=\"Domain Name System — система доменних імен\">DNS</"
 "abbr>-файл"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
-msgstr ""
+msgstr "хв."
 
 msgid "no"
 msgstr "ні"
 
 msgid "no link"
-msgstr "нема з'єднання"
+msgstr "нема зєднання"
 
 msgid "none"
 msgstr "нема нічого"
 
 msgid "not present"
-msgstr ""
+msgstr "не присутній"
 
 msgid "off"
 msgstr "вимкнено"
@@ -3938,35 +4001,38 @@ msgstr "увімкнено"
 msgid "open"
 msgstr "відкрита"
 
+msgid "output"
+msgstr "вихід"
+
 msgid "overlay"
-msgstr ""
+msgstr "оверлей"
 
 msgid "random"
-msgstr ""
+msgstr "випадковий"
 
 msgid "relay mode"
-msgstr ""
+msgstr "режим реле"
 
 msgid "routed"
 msgstr "спрямовано"
 
 msgid "server mode"
-msgstr ""
+msgstr "режим сервера"
 
 msgid "stateful-only"
-msgstr ""
+msgstr "тільки ЗІ збереженням стану"
 
 msgid "stateless"
-msgstr ""
+msgstr "БЕЗ збереження стану"
 
 msgid "stateless + stateful"
-msgstr ""
+msgstr "БЕЗ та ЗІ збереженням стану"
 
 msgid "tagged"
-msgstr "з Ð¿Ð¾Ð·Ð½Ð°Ñ\87коÑ\8e"
+msgstr "познаÑ\87ено"
 
 msgid "time units (TUs / 1.024 ms) [1000-65535]"
-msgstr ""
+msgstr "одиниці часу (TUs / 1.024 ms) [1000-65535]"
 
 msgid "unknown"
 msgstr "невідомий"
@@ -3978,106 +4044,13 @@ msgid "unspecified"
 msgstr "не визначено"
 
 msgid "unspecified -or- create:"
-msgstr "не визначено -або- створити"
+msgstr "не визначено -або- створити:"
 
 msgid "untagged"
-msgstr "без Ð¿Ð¾Ð·Ð½Ð°Ñ\87ки"
+msgstr "не Ð¿Ð¾Ð·Ð½Ð°Ñ\87ено"
 
 msgid "yes"
 msgstr "так"
 
 msgid "« Back"
 msgstr "« Назад"
-
-#~ msgid "Action"
-#~ msgstr "Дія"
-
-#~ msgid "Buttons"
-#~ msgstr "Кнопки"
-
-#~ msgid "Handler"
-#~ msgstr "Обробник"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Максимальний час утримування"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Мінімальний час утримування"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "Шлях до програми, яка обробляє натискання кнопки"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Визначає стан кнопки для обробки"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr "Ця сторінка дозволяє настроїти нетипові дії кнопки"
-
-#~ msgid "Leasetime"
-#~ msgstr "Час оренди"
-
-#~ msgid "AR Support"
-#~ msgstr "Підтримка AR"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Бездротовий 802.11%s контролер Atheros"
-
-#~ msgid "Background Scan"
-#~ msgstr "Сканування у фоновому режимі"
-
-#~ msgid "Compression"
-#~ msgstr "Стиснення"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Вимкнути таймер HW-Beacon"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Не надсилати відповіді на зондування"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Швидкі фрейми"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Максимальна швидкість"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Мінімальна швидкість"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Швидкість багатоадресного потоку"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Зовнішні канали"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Регулятивний домен"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Розділяти WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Статичний WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Режим Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Підтримка XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Якщо ви залишите це невибраним, буде створена додаткова мережа."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Підключення до мережі: Настройки"
-
-#~ msgid "CPU"
-#~ msgstr "ЦП"
-
-#~ msgid "Port %d"
-#~ msgstr "Порт %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Порт %d нетегований у кількох VLAN-ах!"
-
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN-інтерфейс"
index 888fc92bfebfd73c6f8245279ac2a36c64948e4d..0a2ccbf85a8df1e080cae738dd0e29457e7a6835 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -166,9 +169,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -202,9 +202,6 @@ msgstr ""
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr ""
 
@@ -307,11 +304,6 @@ msgstr ""
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -390,11 +382,14 @@ msgstr ""
 msgid "Any zone"
 msgstr ""
 
-msgid "Apply"
-msgstr "Áp dụng"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "Tiến hành thay đổi"
+msgid "Apply unchecked"
+msgstr ""
+
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -410,6 +405,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -500,9 +498,6 @@ msgstr ""
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -571,12 +566,20 @@ msgstr "Thay đổi"
 msgid "Changes applied."
 msgstr "Thay đổi đã áp dụng"
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr ""
 
 msgid "Channel"
 msgstr "Kênh"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr ""
 
@@ -646,10 +649,13 @@ msgstr ""
 msgid "Configuration"
 msgstr "Cấu hình"
 
-msgid "Configuration applied."
+msgid "Configuration files will be kept."
 msgstr ""
 
-msgid "Configuration files will be kept."
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
 msgstr ""
 
 msgid "Confirmation"
@@ -664,10 +670,13 @@ msgstr ""
 msgid "Connection Limit"
 msgstr "Giới hạn kết nối"
 
-msgid "Connection to server fails when TLS cannot be used"
+msgid "Connections"
 msgstr ""
 
-msgid "Connections"
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
 msgstr ""
 
 msgid "Country"
@@ -798,9 +807,6 @@ msgstr ""
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr ""
 
@@ -840,6 +846,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr ""
 
@@ -872,6 +881,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr ""
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr ""
 
@@ -1126,6 +1138,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr ""
 
@@ -1247,7 +1262,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1319,9 +1334,6 @@ msgstr "Hang Up"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1379,7 +1391,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1430,15 +1442,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2014,9 +2023,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr ""
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "Tên"
 
@@ -2140,6 +2146,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr ""
 
@@ -2191,12 +2200,6 @@ msgstr ""
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2548,12 +2551,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2561,12 +2564,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -2657,9 +2660,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2718,6 +2718,15 @@ msgstr ""
 msgid "Revert"
 msgstr "Revert"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr ""
 
@@ -2733,9 +2742,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2761,14 +2767,6 @@ msgstr ""
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2796,9 +2794,6 @@ msgstr "Lưu"
 msgid "Save & Apply"
 msgstr "Lưu & áp dụng "
 
-msgid "Save &#38; Apply"
-msgstr ""
-
 msgid "Scan"
 msgstr "Scan"
 
@@ -2825,17 +2820,6 @@ msgstr "Cô lập đối tượng"
 msgid "Server Settings"
 msgstr ""
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr ""
 
@@ -2928,9 +2912,6 @@ msgstr ""
 msgid "Source"
 msgstr "Nguồn"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr ""
 
@@ -2969,6 +2950,9 @@ msgstr "Bắt đầu "
 msgid "Start priority"
 msgstr "Bắt đầu ưu tiên"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr ""
 
@@ -3118,6 +3102,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3139,9 +3133,6 @@ msgid ""
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
 
-msgid "The following changes have been committed"
-msgstr ""
-
 msgid "The following changes have been reverted"
 msgstr "Những thay đối sau đây đã được để trở về tình trạng cũ. "
 
@@ -3198,11 +3189,6 @@ msgstr ""
 "một vài phút cho tới khi kết nối lại. Có thể cần phải làm mới địa chỉ của "
 "máy tính để tiếp cận thiết bị một lần nữa, phụ thuộc vào cài đặt của bạn. "
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3213,7 +3199,7 @@ msgstr ""
 msgid "There are no active leases."
 msgstr ""
 
-msgid "There are no pending changes to apply!"
+msgid "There are no changes to apply."
 msgstr ""
 
 msgid "There are no pending changes to revert!"
@@ -3353,15 +3339,6 @@ msgstr ""
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr ""
 
@@ -3534,12 +3511,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr ""
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr ""
 
@@ -3569,16 +3540,15 @@ msgid ""
 "and ad-hoc mode) to be installed."
 msgstr ""
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr ""
 
 msgid "Waiting for command to complete..."
 msgstr ""
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3593,12 +3563,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3676,6 +3640,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3740,9 +3707,6 @@ msgstr ""
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "Tập tin <abbr title=\"Domain Name System\">DNS</abbr> địa phương"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3767,6 +3731,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3818,6 +3785,12 @@ msgstr ""
 msgid "« Back"
 msgstr ""
 
+#~ msgid "Apply"
+#~ msgstr "Áp dụng"
+
+#~ msgid "Applying changes"
+#~ msgstr "Tiến hành thay đổi"
+
 #~ msgid "Action"
 #~ msgstr "Action"
 
index df6ce8b7465556de07b009b9b515ee225561f91d..751593f68f622077947cba6b9bfaba8ee4d064e5 100644 (file)
@@ -39,6 +39,9 @@ msgstr "-- 根据标签匹配 --"
 msgid "-- match by uuid --"
 msgstr "-- 根据 UUID 匹配 --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 分钟负载:"
 
@@ -162,9 +165,6 @@ msgstr "A43C + J43 + A43 + V43"
 msgid "ADSL"
 msgstr "ADSL"
 
-msgid "AICCU (SIXXS)"
-msgstr "AICCU (SIXXS)"
-
 msgid "ANSI T1.413"
 msgstr "ANSI T1.413"
 
@@ -200,9 +200,6 @@ msgstr "ATM 设备号码"
 msgid "ATU-C System Vendor ID"
 msgstr "ATU-C 系统供应商 ID"
 
-msgid "AYIYA"
-msgstr "AYIYA"
-
 msgid "Access Concentrator"
 msgstr "接入集中器"
 
@@ -305,13 +302,6 @@ msgstr "允许 127.0.0.0/8 回环范围内的上行响应,例如:RBL 服务"
 msgid "Allowed IPs"
 msgstr "允许的 IP"
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-"也请查看 SIXXS 上的<a href=\"https://www.sixxs.net/faq/connectivity/?"
-"faq=comparison\">隧道对比</a>"
-
 msgid "Always announce default router"
 msgstr "总是通告默认路由"
 
@@ -390,11 +380,14 @@ msgstr "天线配置"
 msgid "Any zone"
 msgstr "任意区域"
 
-msgid "Apply"
-msgstr "应用"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr "应用请求失败,状态 <code>%h</code>"
 
-msgid "Applying changes"
-msgstr "正在应用更改"
+msgid "Apply unchecked"
+msgstr "应用未选中"
+
+msgid "Architecture"
+msgstr "架构"
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -410,6 +403,9 @@ msgstr "将此十六进制子 ID 前缀分配给此接口"
 msgid "Associated Stations"
 msgstr "已连接站点"
 
+msgid "Associations"
+msgstr "关联数"
+
 msgid "Auth Group"
 msgstr "认证组"
 
@@ -500,9 +496,6 @@ msgstr "指定了错误的地址!"
 msgid "Band"
 msgstr "频宽"
 
-msgid "Behind NAT"
-msgstr "在 NAT 网络内"
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -571,7 +564,10 @@ msgid "Changes"
 msgstr "修改数"
 
 msgid "Changes applied."
-msgstr "更改已应用"
+msgstr "更改已应用。"
+
+msgid "Changes have been reverted."
+msgstr "更改已取消。"
 
 msgid "Changes the administrator password for accessing the device"
 msgstr "修改访问设备的管理员密码"
@@ -579,6 +575,11 @@ msgstr "修改访问设备的管理员密码"
 msgid "Channel"
 msgstr "信道"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr "信道 %d 在 %s 监管区域内不可用并已自动调整到 %d。"
+
 msgid "Check"
 msgstr "检查"
 
@@ -655,12 +656,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "配置"
 
-msgid "Configuration applied."
-msgstr "配置已应用。"
-
 msgid "Configuration files will be kept."
 msgstr "配置文件将被保留。"
 
+msgid "Configuration has been applied."
+msgstr "配置已应用。"
+
+msgid "Configuration has been rolled back!"
+msgstr "配置已回滚!"
+
 msgid "Confirmation"
 msgstr "确认密码"
 
@@ -673,12 +677,17 @@ msgstr "已连接"
 msgid "Connection Limit"
 msgstr "连接数限制"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr "当 TLS 不可用时,与服务器连接失败"
-
 msgid "Connections"
 msgstr "连接"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+"应用配置更改后,无法重新获得对设备的访问权限。如果您修改了网络相关设置"
+"如 IP 地址或无线安全证书,则可能需要重新连接。"
+
 msgid "Country"
 msgstr "国家"
 
@@ -806,9 +815,6 @@ msgstr "默认网关"
 msgid "Default is stateless + stateful"
 msgstr "默认是无状态的 + 有状态的"
 
-msgid "Default route"
-msgstr "默认路由"
-
 msgid "Default state"
 msgstr "默认状态"
 
@@ -850,6 +856,9 @@ msgstr "设备正在重启..."
 msgid "Device unreachable"
 msgstr "无法连接到设备"
 
+msgid "Device unreachable!"
+msgstr "无法连接到设备!"
+
 msgid "Diagnostics"
 msgstr "网络诊断"
 
@@ -884,6 +893,9 @@ msgstr "禁用(默认)"
 msgid "Discard upstream RFC1918 responses"
 msgstr "丢弃 RFC1918 上行响应数据"
 
+msgid "Dismiss"
+msgstr "解除"
+
 msgid "Displaying only packages containing"
 msgstr "只显示有内容的软件包"
 
@@ -996,7 +1008,7 @@ msgstr "启用"
 msgid ""
 "Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
 "snooping"
-msgstr ""
+msgstr "启用 <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> 窥探"
 
 msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
 msgstr "开启 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1056,7 +1068,7 @@ msgid "Enabled"
 msgstr "启用"
 
 msgid "Enables IGMP snooping on this bridge"
-msgstr ""
+msgstr "在此桥接上启用 IGMP 窥探"
 
 msgid ""
 "Enables fast roaming among access points that belong to the same Mobility "
@@ -1136,6 +1148,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr "FT 协议"
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr "在 %d 秒内确认应用失败,等待回滚..."
+
 msgid "File"
 msgstr "文件"
 
@@ -1257,10 +1272,10 @@ msgstr "空闲空间"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
-"有关 WireGuard 接口和 Peer 的更多信息:<a href=\"http://wireguard.io"
-"\">wireguard.io</a>。"
+"有关 WireGuard 接口和 Peer 的更多信息:<a href=\"http://wireguard.com"
+"\">wireguard.com</a>。"
 
 msgid "GHz"
 msgstr "GHz"
@@ -1331,9 +1346,6 @@ msgstr "挂起"
 msgid "Header Error Code Errors (HEC)"
 msgstr "请求头错误代码错误(HEC)"
 
-msgid "Heartbeat"
-msgstr "心跳"
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1389,8 +1401,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 防火墙"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN 状态"
+msgid "IPv4 Upstream"
+msgstr "IPv4 上游"
 
 msgid "IPv4 address"
 msgstr "IPv4 地址"
@@ -1440,15 +1452,12 @@ msgstr "IPv6 设置"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA 前缀"
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN 状态"
+msgid "IPv6 Upstream"
+msgstr "IPv6 上游"
 
 msgid "IPv6 address"
 msgstr "IPv6 地址"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr "绑定到隧道本端的 IPv6 地址(可选)"
-
 msgid "IPv6 assignment hint"
 msgstr "IPv6 分配提示"
 
@@ -2030,9 +2039,6 @@ msgstr "NT 域"
 msgid "NTP server candidates"
 msgstr "候选 NTP 服务器"
 
-msgid "NTP sync time-out"
-msgstr "NTP 同步超时"
-
 msgid "Name"
 msgstr "名称"
 
@@ -2156,6 +2162,9 @@ msgstr "混淆组密码"
 msgid "Obfuscated Password"
 msgstr "混淆密码"
 
+msgid "Obtain IPv6-Address"
+msgstr "获取 IPv6 地址"
+
 msgid "Off-State Delay"
 msgstr "关闭时间"
 
@@ -2205,12 +2214,6 @@ msgstr "移除的选项"
 msgid "Optional"
 msgstr "可选"
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr "可选,设置这个选项会覆盖默认服务器(tic.sixxs.net)"
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr "可选,如果您的 SIXXS 账号拥有一个以上的隧道请设置此项"
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2568,13 +2571,13 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr> 服务器"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "确定要删除此接口?删除操作无法撤销!\\n删除此接口,可能导致无法再访问路由器!"
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "确定要删除此无线网络?删除操作无法撤销!\\n删除此无线网络,可能导致无法再访问"
@@ -2584,14 +2587,14 @@ msgid "Really reset all changes?"
 msgstr "确定要放弃所有更改?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "确定要关闭此网络?\\n如果您正在使用此接口连接路由器,关闭此网络可能导致连接断"
 "开!"
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "确定要关闭接口 \"%s\"?\\n如果您正在使用此接口连接路由器,关闭此网络可能导致"
@@ -2684,9 +2687,6 @@ msgstr "请求 IPv6 地址"
 msgid "Request IPv6-prefix of length"
 msgstr "请求指定长度的 IPv6 前缀"
 
-msgid "Require TLS"
-msgstr "必须使用 TLS"
-
 msgid "Required"
 msgstr "必须"
 
@@ -2747,7 +2747,16 @@ msgid "Reveal/hide password"
 msgstr "显示/隐藏 密码"
 
 msgid "Revert"
-msgstr "放弃"
+msgstr "恢复"
+
+msgid "Revert changes"
+msgstr "恢复更改"
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr "恢复请求失败,状态 <code>%h</code>"
+
+msgid "Reverting configuration…"
+msgstr "正在恢复配置..."
 
 msgid "Root"
 msgstr "Root"
@@ -2764,9 +2773,6 @@ msgstr "路由允许的 IP"
 msgid "Route type"
 msgstr "路由类型"
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr "下行接口的路由 IPv6 前缀"
-
 msgid "Router Advertisement-Service"
 msgstr "路由通告服务"
 
@@ -2790,14 +2796,6 @@ msgstr "文件系统检查"
 msgid "SHA256"
 msgstr "SHA256"
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr "SIXXS 仅支持 TIC,对于使用 IP 协议 41(RFC4213)的静态隧道,使用 6in4"
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr "SIXXS-handle[/Tunnel-ID]"
-
 msgid "SNR"
 msgstr "SNR"
 
@@ -2823,10 +2821,7 @@ msgid "Save"
 msgstr "保存"
 
 msgid "Save & Apply"
-msgstr "保存&应用"
-
-msgid "Save &#38; Apply"
-msgstr "保存&#38;应用"
+msgstr "保存并应用"
 
 msgid "Scan"
 msgstr "扫描"
@@ -2854,17 +2849,6 @@ msgstr "隔离客户端"
 msgid "Server Settings"
 msgstr "服务器设置"
 
-msgid "Server password"
-msgstr "服务器密码"
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr "服务器密码,如果用户名包含隧道 ID 则在此填写隧道自己的密码"
-
-msgid "Server username"
-msgstr "服务器用户名"
-
 msgid "Service Name"
 msgstr "服务名"
 
@@ -2961,9 +2945,6 @@ msgstr "排序"
 msgid "Source"
 msgstr "源地址"
 
-msgid "Source routing"
-msgstr "源路由"
-
 msgid "Specifies the directory the device is attached to"
 msgstr "指定设备的挂载目录"
 
@@ -3002,6 +2983,9 @@ msgstr "开始"
 msgid "Start priority"
 msgstr "启动优先级"
 
+msgid "Starting configuration apply…"
+msgstr "开始应用配置..."
+
 msgid "Startup"
 msgstr "启动项"
 
@@ -3158,6 +3142,19 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr "由于以下错误,配置文件无法被加载:"
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+"在应用挂起的更改后 %d 秒内无法到达该设备,出于安全原因导致配置回滚。如果您认为配置更改仍"
+"然正确,请执行未选中的配置应用。或者您可以在尝试再次应用之前解除此警告并编辑更改,或者还原"
+"所有未完成的更改以保持当前正在工作的配置状态。"
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3179,9 +3176,6 @@ msgstr ""
 "固件已上传,请注意核对文件大小和校验值!<br />点击下面的“继续”开始刷写,刷新"
 "过程中切勿断电!"
 
-msgid "The following changes have been committed"
-msgstr "以下更改已提交"
-
 msgid "The following changes have been reverted"
 msgstr "以下更改已放弃"
 
@@ -3240,11 +3234,6 @@ msgstr ""
 "正在刷新系统...<br />切勿关闭电源! DO NOT POWER OFF THE DEVICE!<br />等待数分"
 "钟后即可尝试重新连接到路由。您可能需要更改计算机的 IP 地址以重新连接。"
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr "隧道端点在 NAT 之后,默认为禁用,仅适用于 AYIYA"
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3253,8 +3242,8 @@ msgstr "不支持所上传的映像文件格式,请选择适合当前平台的
 msgid "There are no active leases."
 msgstr "没有已分配的租约。"
 
-msgid "There are no pending changes to apply!"
-msgstr "没有待生效的更改"
+msgid "There are no changes to apply."
+msgstr "没有待生效的更改"
 
 msgid "There are no pending changes to revert!"
 msgstr "没有可放弃的更改!"
@@ -3394,15 +3383,6 @@ msgstr "隧道接口"
 msgid "Tunnel Link"
 msgstr "隧道链接"
 
-msgid "Tunnel broker protocol"
-msgstr "隧道协议"
-
-msgid "Tunnel setup server"
-msgstr "隧道配置服务器"
-
-msgid "Tunnel type"
-msgstr "隧道类型"
-
 msgid "Tx-Power"
 msgstr "传输功率"
 
@@ -3582,12 +3562,6 @@ msgstr "Vendor"
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "请求 DHCP 时发送的 Vendor Class 选项"
 
-msgid "Verbose"
-msgstr "详细"
-
-msgid "Verbose logging by aiccu daemon"
-msgstr "Aiccu 守护程序详细日志"
-
 msgid "Verify"
 msgstr "验证"
 
@@ -3619,16 +3593,15 @@ msgstr ""
 "WPA 加密需要安装 wpa_supplicant(客户端模式)或安装 hostapd(接入点 AP、点对"
 "点 Ad-Hoc 模式)。"
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr "NTP 同步前的等待时间,设置为 0 表示不等待(可选)"
-
 msgid "Waiting for changes to be applied..."
 msgstr "正在应用更改..."
 
 msgid "Waiting for command to complete..."
 msgstr "等待命令执行完成..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr "等待应用配置... %d 秒"
+
 msgid "Waiting for device..."
 msgstr "等待设备..."
 
@@ -3643,12 +3616,6 @@ msgid ""
 "communications"
 msgstr "当使用 PSK 时,PMK 可以在没有 AP 间通信的情况下在本地生成"
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr "是否添加一条通向隧道的 IPv6 默认路由"
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr "是否仅路由来自分发前缀的数据包"
-
 msgid "Width"
 msgstr "频宽"
 
@@ -3726,6 +3693,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "桥接的"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "创建:"
 
@@ -3790,9 +3760,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "本地 <abbr title=\"Domain Name Syste\">DNS</abbr> 解析文件"
 
-msgid "minimum 1280, maximum 1480"
-msgstr "最小值 1280,最大值 1480"
-
 msgid "minutes"
 msgstr "分钟"
 
@@ -3817,11 +3784,14 @@ msgstr "开"
 msgid "open"
 msgstr "开放式"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "覆盖"
 
 msgid "random"
-msgstr ""
+msgstr "随机"
 
 msgid "relay mode"
 msgstr "中继模式"
@@ -3868,119 +3838,8 @@ msgstr "是"
 msgid "« Back"
 msgstr "« 后退"
 
-#~ msgid "Action"
-#~ msgstr "动作"
-
-#~ msgid "Buttons"
-#~ msgstr "按键"
-
-#~ msgid "Handler"
-#~ msgstr "处理程序"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "最大持续时间"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "最低持续时间"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "处理按键动作的可执行文件路径"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "指定要处理的按键状态"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr "自定义按键动作。"
-
-#~ msgid "Leasetime"
-#~ msgstr "租用时间"
-
-#~ msgid "Optional."
-#~ msgstr "可选。"
-
-#~ msgid "navigation Navigation"
-#~ msgstr "导航"
-
-#~ msgid "skiplink1 Skip to navigation"
-#~ msgstr "skiplink1 跳转到导航"
-
-#~ msgid "skiplink2 Skip to content"
-#~ msgstr "skiplink2 跳到内容"
-
-#~ msgid "AuthGroup"
-#~ msgstr "认证组"
-
-#~ msgid "automatic"
-#~ msgstr "自动"
-
-#~ msgid "AR Support"
-#~ msgstr "AR 支持"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Qualcomm/Atheros 802.11%s 无线控制器"
-
-#~ msgid "Background Scan"
-#~ msgstr "后台搜索"
-
-#~ msgid "Compression"
-#~ msgstr "压缩"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "停用 HW-Beacon 计时器"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "不回送探测响应"
-
-#~ msgid "Fast Frames"
-#~ msgstr "快速帧"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "最高速率"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "最低速率"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "多播速率"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "户外频道"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "无线网络国家区域"
-
-#~ msgid "Separate WDS"
-#~ msgstr "隔离 WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "静态 WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Turbo 模式"
-
-#~ msgid "XR Support"
-#~ msgstr "XR 支持"
-
-#~ msgid "Required. Public key of peer."
-#~ msgstr "必须,Peer 的公钥。"
-
-#~ msgid "An additional network will be created if you leave this checked."
-#~ msgstr "如果选中此复选框,则会创建一个附加网络。"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "取消选中将会另外创建一个新网络,而不会覆盖当前网络设置"
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "加入网络:设置"
-
-#~ msgid "CPU"
-#~ msgstr "CPU"
-
-#~ msgid "Port %d"
-#~ msgstr "端口 %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "端口 %d 在多个 VLAN 中均未标记!"
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN 状态"
 
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN 接口"
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN 状态"
index edc5207bd9da5f99024311c2f8046161d71c18e4..653c093cdb811dc20d243499c4ce6424996d3700 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1分鐘負載"
 
@@ -167,9 +170,6 @@ msgstr ""
 msgid "ADSL"
 msgstr ""
 
-msgid "AICCU (SIXXS)"
-msgstr ""
-
 msgid "ANSI T1.413"
 msgstr ""
 
@@ -205,9 +205,6 @@ msgstr "ATM裝置號碼"
 msgid "ATU-C System Vendor ID"
 msgstr ""
 
-msgid "AYIYA"
-msgstr ""
-
 msgid "Access Concentrator"
 msgstr "接入集線器"
 
@@ -310,11 +307,6 @@ msgstr "允許127.0.0.0/8範圍內的上游回應,例如:RBL服務"
 msgid "Allowed IPs"
 msgstr ""
 
-msgid ""
-"Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison"
-"\">Tunneling Comparison</a> on SIXXS"
-msgstr ""
-
 msgid "Always announce default router"
 msgstr ""
 
@@ -393,11 +385,14 @@ msgstr "天線設定"
 msgid "Any zone"
 msgstr "任意區域"
 
-msgid "Apply"
-msgstr "套用"
+msgid "Apply request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Apply unchecked"
+msgstr ""
 
-msgid "Applying changes"
-msgstr "正在套用變更"
+msgid "Architecture"
+msgstr ""
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -413,6 +408,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "已連接站點"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -503,9 +501,6 @@ msgstr "指定了錯誤的位置!"
 msgid "Band"
 msgstr ""
 
-msgid "Behind NAT"
-msgstr ""
-
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
 "configuration files marked by opkg, essential base files and the user "
@@ -576,12 +571,20 @@ msgstr "待修改"
 msgid "Changes applied."
 msgstr "修改已套用"
 
+msgid "Changes have been reverted."
+msgstr ""
+
 msgid "Changes the administrator password for accessing the device"
 msgstr "修改管理員密碼"
 
 msgid "Channel"
 msgstr "頻道"
 
+msgid ""
+"Channel %d is not available in the %s regulatory domain and has been auto-"
+"adjusted to %d."
+msgstr ""
+
 msgid "Check"
 msgstr "檢查"
 
@@ -657,12 +660,15 @@ msgstr ""
 msgid "Configuration"
 msgstr "設定"
 
-msgid "Configuration applied."
-msgstr "啟用設定"
-
 msgid "Configuration files will be kept."
 msgstr "設定檔將被存檔"
 
+msgid "Configuration has been applied."
+msgstr ""
+
+msgid "Configuration has been rolled back!"
+msgstr ""
+
 msgid "Confirmation"
 msgstr "再確認"
 
@@ -675,12 +681,15 @@ msgstr "已連線"
 msgid "Connection Limit"
 msgstr "連線限制"
 
-msgid "Connection to server fails when TLS cannot be used"
-msgstr ""
-
 msgid "Connections"
 msgstr "連線數"
 
+msgid ""
+"Could not regain access to the device after applying the configuration "
+"changes. You might need to reconnect if you modified network related "
+"settings such as the IP address or wireless security credentials."
+msgstr ""
+
 msgid "Country"
 msgstr "國別"
 
@@ -809,9 +818,6 @@ msgstr "預設匝道器"
 msgid "Default is stateless + stateful"
 msgstr ""
 
-msgid "Default route"
-msgstr ""
-
 msgid "Default state"
 msgstr "預設狀態"
 
@@ -853,6 +859,9 @@ msgstr ""
 msgid "Device unreachable"
 msgstr ""
 
+msgid "Device unreachable!"
+msgstr ""
+
 msgid "Diagnostics"
 msgstr "診斷"
 
@@ -886,6 +895,9 @@ msgstr ""
 msgid "Discard upstream RFC1918 responses"
 msgstr "丟棄上游RFC1918 虛擬IP網路的回應"
 
+msgid "Dismiss"
+msgstr ""
+
 msgid "Displaying only packages containing"
 msgstr "僅顯示內含的軟體"
 
@@ -1139,6 +1151,9 @@ msgstr ""
 msgid "FT protocol"
 msgstr ""
 
+msgid "Failed to confirm apply within %ds, waiting for rollback…"
+msgstr ""
+
 msgid "File"
 msgstr "檔案"
 
@@ -1260,7 +1275,7 @@ msgstr "剩餘空間"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1332,9 +1347,6 @@ msgstr "斷線"
 msgid "Header Error Code Errors (HEC)"
 msgstr ""
 
-msgid "Heartbeat"
-msgstr ""
-
 msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
@@ -1390,8 +1402,8 @@ msgstr "IPv4版"
 msgid "IPv4 Firewall"
 msgstr "IPv4防火牆"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4寬頻連線狀態"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4位址"
@@ -1441,15 +1453,12 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6寬頻連線狀態"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6位址"
 
-msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
-msgstr ""
-
 msgid "IPv6 assignment hint"
 msgstr ""
 
@@ -2021,9 +2030,6 @@ msgstr ""
 msgid "NTP server candidates"
 msgstr "NTP伺服器備選"
 
-msgid "NTP sync time-out"
-msgstr ""
-
 msgid "Name"
 msgstr "名稱"
 
@@ -2147,6 +2153,9 @@ msgstr ""
 msgid "Obfuscated Password"
 msgstr ""
 
+msgid "Obtain IPv6-Address"
+msgstr ""
+
 msgid "Off-State Delay"
 msgstr "關閉狀態延遲"
 
@@ -2196,12 +2205,6 @@ msgstr "選項已移除"
 msgid "Optional"
 msgstr ""
 
-msgid "Optional, specify to override default server (tic.sixxs.net)"
-msgstr ""
-
-msgid "Optional, use when the SIXXS account has more than one tunnel"
-msgstr ""
-
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
@@ -2553,14 +2556,14 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-伺服器"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "真的要刪除這介面?無法復元刪除!\n"
 "假如您要透過這個介面連線您可能會無法存取這個設備."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "真的要刪除這個無線網路?無法復元的刪除!\n"
@@ -2571,14 +2574,14 @@ msgstr "確定要重置回復原廠?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "真的要刪除這個網路 ?\n"
 "假如您是透過這個介面連線您可能會無法存取這個設備."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "真的要關閉這個介面 \"%s\" ?!\n"
@@ -2671,9 +2674,6 @@ msgstr ""
 msgid "Request IPv6-prefix of length"
 msgstr ""
 
-msgid "Require TLS"
-msgstr ""
-
 msgid "Required"
 msgstr ""
 
@@ -2732,6 +2732,15 @@ msgstr "明示/隱藏 密碼"
 msgid "Revert"
 msgstr "回溯"
 
+msgid "Revert changes"
+msgstr ""
+
+msgid "Revert request failed with status <code>%h</code>"
+msgstr ""
+
+msgid "Reverting configuration…"
+msgstr ""
+
 msgid "Root"
 msgstr "根"
 
@@ -2747,9 +2756,6 @@ msgstr ""
 msgid "Route type"
 msgstr ""
 
-msgid "Routed IPv6 prefix for downstream interfaces"
-msgstr ""
-
 msgid "Router Advertisement-Service"
 msgstr ""
 
@@ -2773,14 +2779,6 @@ msgstr "執行系統檢查"
 msgid "SHA256"
 msgstr ""
 
-msgid ""
-"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
-"use 6in4 instead"
-msgstr ""
-
-msgid "SIXXS-handle[/Tunnel-ID]"
-msgstr ""
-
 msgid "SNR"
 msgstr ""
 
@@ -2808,9 +2806,6 @@ msgstr "保存"
 msgid "Save & Apply"
 msgstr "保存並啟用"
 
-msgid "Save &#38; Apply"
-msgstr "保存 &#38; 啟用"
-
 msgid "Scan"
 msgstr "掃描"
 
@@ -2837,17 +2832,6 @@ msgstr "分隔用戶端"
 msgid "Server Settings"
 msgstr "伺服器設定值"
 
-msgid "Server password"
-msgstr ""
-
-msgid ""
-"Server password, enter the specific password of the tunnel when the username "
-"contains the tunnel ID"
-msgstr ""
-
-msgid "Server username"
-msgstr ""
-
 msgid "Service Name"
 msgstr "服務名稱"
 
@@ -2943,9 +2927,6 @@ msgstr "分類"
 msgid "Source"
 msgstr "來源"
 
-msgid "Source routing"
-msgstr ""
-
 msgid "Specifies the directory the device is attached to"
 msgstr "指定這個設備被附掛到那個目錄"
 
@@ -2984,6 +2965,9 @@ msgstr "啟用"
 msgid "Start priority"
 msgstr "啟用優先權順序"
 
+msgid "Starting configuration apply…"
+msgstr ""
+
 msgid "Startup"
 msgstr "啟動"
 
@@ -3144,6 +3128,16 @@ msgstr ""
 msgid "The configuration file could not be loaded due to the following error:"
 msgstr ""
 
+msgid ""
+"The device could not be reached within %d seconds after applying the pending "
+"changes, which caused the configuration to be rolled back for safety "
+"reasons. If you believe that the configuration changes are correct "
+"nonetheless, perform an unchecked configuration apply. Alternatively, you "
+"can dismiss this warning and edit changes before attempting to apply again, "
+"or revert all pending changes to keep the currently working configuration "
+"state."
+msgstr ""
+
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
@@ -3167,9 +3161,6 @@ msgstr ""
 "要刷的映像檔已上傳.下面是這個校驗碼和檔案大小詳列, 用原始檔比對它門以確保資料"
 "完整性.<br />按下面的\"繼續\"便可以開啟更新流程."
 
-msgid "The following changes have been committed"
-msgstr "接下來的修改已經被承諾"
-
 msgid "The following changes have been reverted"
 msgstr "接下來的修改已經被回復"
 
@@ -3230,11 +3221,6 @@ msgstr ""
 "系統現正刷機中.<br /> 請勿關閉設備!<br />  等待數分鐘直到您重新在連線. 可能需"
 "要更新您電腦的位址以便再連設備, 端看您的設定. "
 
-msgid ""
-"The tunnel end-point is behind NAT, defaults to disabled and only applies to "
-"AYIYA"
-msgstr ""
-
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
 "you choose the generic image format for your platform."
@@ -3244,8 +3230,8 @@ msgstr ""
 msgid "There are no active leases."
 msgstr "租賃尚未啟動."
 
-msgid "There are no pending changes to apply!"
-msgstr "尚無聽候的修改被採用"
+msgid "There are no changes to apply."
+msgstr ""
 
 msgid "There are no pending changes to revert!"
 msgstr "尚無聽候的修改被復元!"
@@ -3385,15 +3371,6 @@ msgstr "通道介面"
 msgid "Tunnel Link"
 msgstr ""
 
-msgid "Tunnel broker protocol"
-msgstr ""
-
-msgid "Tunnel setup server"
-msgstr ""
-
-msgid "Tunnel type"
-msgstr ""
-
 msgid "Tx-Power"
 msgstr "傳送-功率"
 
@@ -3571,12 +3548,6 @@ msgstr ""
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "當請求DHCP封包時要傳送的製造商類別碼"
 
-msgid "Verbose"
-msgstr ""
-
-msgid "Verbose logging by aiccu daemon"
-msgstr ""
-
 msgid "Verify"
 msgstr "確認"
 
@@ -3608,16 +3579,15 @@ msgstr ""
 "WPA-加密需要 wpa_supplican(終端模式)或者hostapd熱點(對AP或者是 ad-hoc模式)已"
 "被安裝."
 
-msgid ""
-"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
-msgstr ""
-
 msgid "Waiting for changes to be applied..."
 msgstr "等待修改被啟用..."
 
 msgid "Waiting for command to complete..."
 msgstr "等待完整性指令..."
 
+msgid "Waiting for configuration to get applied… %ds"
+msgstr ""
+
 msgid "Waiting for device..."
 msgstr ""
 
@@ -3632,12 +3602,6 @@ msgid ""
 "communications"
 msgstr ""
 
-msgid "Whether to create an IPv6 default route over the tunnel"
-msgstr ""
-
-msgid "Whether to route only packets from delegated prefixes"
-msgstr ""
-
 msgid "Width"
 msgstr ""
 
@@ -3713,6 +3677,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "已橋接"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "建立:"
 
@@ -3777,9 +3744,6 @@ msgstr "kbit/s"
 msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
 msgstr "本地<abbr title=\"Domain Name System\">DNS</abbr> 檔案"
 
-msgid "minimum 1280, maximum 1480"
-msgstr ""
-
 msgid "minutes"
 msgstr ""
 
@@ -3804,6 +3768,9 @@ msgstr "開啟"
 msgid "open"
 msgstr "打開"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3855,6 +3822,30 @@ msgstr "是的"
 msgid "« Back"
 msgstr "« 倒退"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4寬頻連線狀態"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6寬頻連線狀態"
+
+#~ msgid "Apply"
+#~ msgstr "套用"
+
+#~ msgid "Applying changes"
+#~ msgstr "正在套用變更"
+
+#~ msgid "Configuration applied."
+#~ msgstr "啟用設定"
+
+#~ msgid "Save &#38; Apply"
+#~ msgstr "保存 &#38; 啟用"
+
+#~ msgid "The following changes have been committed"
+#~ msgstr "接下來的修改已經被承諾"
+
+#~ msgid "There are no pending changes to apply!"
+#~ msgstr "尚無聽候的修改被採用"
+
 #~ msgid "Action"
 #~ msgstr "動作"
 
index a26d3d14e1d9ae5ede3379f59bab70f9d0100c1b..e04a964dd76a4e78cba815949775225ce27c282f 100644 (file)
@@ -43,6 +43,9 @@ function index()
                        end)
 
                if has_wifi then
+                       page = entry({"admin", "network", "wireless_assoclist"}, call("wifi_assoclist"), nil)
+                       page.leaf = true
+               
                        page = entry({"admin", "network", "wireless_join"}, post("wifi_join"), nil)
                        page.leaf = true
 
@@ -372,6 +375,13 @@ function wifi_shutdown(wnet)
        wifi_reconnect_shutdown(true, wnet)
 end
 
+function wifi_assoclist()
+       local s = require "luci.tools.status"
+       
+       luci.http.prepare_content("application/json")
+       luci.http.write_json(s.wifi_assoclist())
+end
+
 function lease_status()
        local s = require "luci.tools.status"
 
index 6fcd66f44107e4ecdbcd167c630b4db6a6d31326..0c19893cf8cddc46d992bfbbbaebb48f00e301d2 100644 (file)
@@ -74,7 +74,7 @@ function action_packages()
        local out, err
 
        -- Display
-       local display = luci.http.formvalue("display") or "installed"
+       local display = luci.http.formvalue("display") or "available"
 
        -- Letter
        local letter = string.byte(luci.http.formvalue("letter") or "A", 1)
index 38e5de7b39be75fad648db060b61c50c93917ac9..5c630bb5ce1499ed953fc7139679a0efaf6cd102 100644 (file)
@@ -351,7 +351,6 @@ if has_firewall then
 
        fwzone.template = "cbi/firewall_zonelist"
        fwzone.network = arg[1]
-       fwzone.rmempty = false
 
        function fwzone.cfgvalue(self, section)
                self.iface = section
@@ -360,22 +359,16 @@ if has_firewall then
        end
 
        function fwzone.write(self, section, value)
-               local zone = fw:get_zone(value)
-
-               if not zone and value == '-' then
-                       value = m:formvalue(self:cbid(section) .. ".newzone")
-                       if value and #value > 0 then
-                               zone = fw:add_zone(value)
-                       else
-                               fw:del_network(section)
-                       end
-               end
-
+               local zone = fw:get_zone(value) or fw:add_zone(value)
                if zone then
                        fw:del_network(section)
                        zone:add_network(section)
                end
        end
+
+       function fwzone.remove(self, section)
+               fw:del_network(section)
+       end
 end
 
 
index b52dff13ac9efe277f31b2f5dc63353c7620f3b2..3e46628d3f93094360fdbbef0e57e8739164f5c8 100644 (file)
@@ -260,7 +260,7 @@ m.uci:foreach("network", "switch",
                end
 
 
-               local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID", "<div id='portstatus-%s'></div>" % switch_name)
+               local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID")
                local mx_vid = has_vlan4k and 4094 or (num_vlans - 1)
 
                vid.rmempty = false
@@ -333,7 +333,7 @@ m.uci:foreach("network", "switch",
 
                local _, pt
                for _, pt in ipairs(topo.ports) do
-                       local po = s:option(ListValue, tostring(pt.num), pt.label, '<div id="portstatus-%s-%d"></div>' %{ switch_name, pt.num })
+                       local po = s:option(ListValue, tostring(pt.num), pt.label)
 
                        po:value("",  translate("off"))
 
index cacaa2595833c1ca93ad61baa0c704bb6f2b7f35..d51a72aba1d998ad65949c3b9bf9a5810ea7e6bd 100644 (file)
@@ -390,22 +390,16 @@ network.novirtual = true
 function network.write(self, section, value)
        local i = nw:get_interface(section)
        if i then
-               if value == '-' then
-                       value = m:formvalue(self:cbid(section) .. ".newnet")
-                       if value and #value > 0 then
-                               local n = nw:add_network(value, {proto="none"})
-                               if n then n:add_interface(i) end
-                       else
-                               local n = i:get_network()
-                               if n then n:del_interface(i) end
-                       end
-               else
-                       local v
-                       for _, v in ipairs(i:get_networks()) do
-                               v:del_interface(i)
-                       end
-                       for v in ut.imatch(value) do
-                               local n = nw:get_network(v)
+               local _, net, old, new = nil, nil, {}, {}
+
+               for _, net in ipairs(i:get_networks()) do
+                       old[net:name()] = true
+               end
+
+               for net in ut.imatch(value) do
+                       new[net] = true
+                       if not old[net] then
+                               local n = nw:get_network(net) or nw:add_network(net, { proto = "none" })
                                if n then
                                        if not n:is_empty() then
                                                n:set("type", "bridge")
@@ -414,6 +408,15 @@ function network.write(self, section, value)
                                end
                        end
                end
+
+               for net, _ in pairs(old) do
+                       if not new[net] then
+                               local n = nw:get_network(net)
+                               if n then
+                                       n:del_interface(i)
+                               end
+                       end
+               end
        end
 end
 
index 8277deb2f6f23b128f81b4ff40ffde717878536b..e8a305882656226d54129aebe7d1b5ef57952d40 100644 (file)
@@ -94,14 +94,9 @@ function newnet.parse(self, section)
        local net, zone
 
        if has_firewall then
-               local zval  = fwzone:formvalue(section)
-               zone = fw:get_zone(zval)
-
-               if not zone and zval == '-' then
-                       zval = m:formvalue(fwzone:cbid(section) .. ".newzone")
-                       if zval and #zval > 0 then
-                               zone = fw:add_zone(zval)
-                       end
+               local value = fwzone:formvalue(section)
+               if value and #value > 0 then
+                       zone = fw:get_zone(value) or fw:add_zone(value)
                end
        end
 
index 493a735bdeb6e6f94c1341633e205dc4334bf773..6c1c1235c5a59fcde59780f3195d111bd55d400e 100644 (file)
@@ -104,16 +104,17 @@ end
 keys = s2:option(TextValue, "_data", "")
 keys.wrap    = "off"
 keys.rows    = 3
-keys.rmempty = false
 
 function keys.cfgvalue()
        return fs.readfile("/etc/dropbear/authorized_keys") or ""
 end
 
 function keys.write(self, section, value)
-       if value then
-               fs.writefile("/etc/dropbear/authorized_keys", value:gsub("\r\n", "\n"))
-       end
+       return fs.writefile("/etc/dropbear/authorized_keys", value:gsub("\r\n", "\n"))
+end
+
+function keys.remove(self, section, value)
+       return fs.writefile("/etc/dropbear/authorized_keys", "")
 end
 
 end
index f4adb26069468935ed345b04398ee23dd432a7f0..5607e59dfb6f8ffb377313989332a0cbc4fdddf9 100644 (file)
@@ -61,55 +61,54 @@ local route_host = luci.config.diag and luci.config.diag.route or "dev.openwrt.o
        <div class="cbi-map">
                <h2 name="content"><%:Diagnostics%></h2>
 
-               <fieldset class="cbi-section">
+               <div class="cbi-section">
                        <legend><%:Network Utilities%></legend>
 
-                       <br />
-
-                       <div style="width:30%; float:left">
-                               <input style="margin: 5px 0" type="text" value="<%=ping_host%>" name="ping" /><br />
-                               <% if has_ping6 then %>
-                               <select name="ping_proto" style="width:auto">
-                                       <option value="" selected="selected"><%:IPv4%></option>
-                                       <option value="6"><%:IPv6%></option>
-                               </select>
-                               <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" />
-                               <% else %>
-                               <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" />
-                               <% end %>
+                       <div class="table">
+                               <div class="tr">
+                                       <div class="td left">
+                                               <input style="margin: 5px 0" type="text" value="<%=ping_host%>" name="ping" /><br />
+                                               <% if has_ping6 then %>
+                                               <select name="ping_proto" style="width:auto">
+                                                       <option value="" selected="selected"><%:IPv4%></option>
+                                                       <option value="6"><%:IPv6%></option>
+                                               </select>
+                                               <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" />
+                                               <% else %>
+                                               <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" />
+                                               <% end %>
+                                       </div>
+
+                                       <div class="td left">
+                                               <input style="margin: 5px 0" type="text" value="<%=route_host%>" name="traceroute" /><br />
+                                               <% if has_traceroute6 then %>
+                                               <select name="traceroute_proto" style="width:auto">
+                                                       <option value="" selected="selected"><%:IPv4%></option>
+                                                       <option value="6"><%:IPv6%></option>
+                                               </select>
+                                               <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" />
+                                               <% else %>
+                                               <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" />
+                                               <% end %>
+                                               <% if not has_traceroute6 then %>
+                                                       <p>&#160;</p>
+                                                       <p><%:Install iputils-traceroute6 for IPv6 traceroute%></p>
+                                               <% end %>
+                                       </div>
+
+                                       <div class="td left">
+                                               <input style="margin: 5px 0" type="text" value="<%=dns_host%>" name="nslookup" /><br />
+                                               <input type="button" value="<%:Nslookup%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" />
+                                       </div>
+                               </div>
                        </div>
-
-                       <div style="width:33%; float:left">
-                               <input style="margin: 5px 0" type="text" value="<%=route_host%>" name="traceroute" /><br />
-                               <% if has_traceroute6 then %>
-                               <select name="traceroute_proto" style="width:auto">
-                                       <option value="" selected="selected"><%:IPv4%></option>
-                                       <option value="6"><%:IPv6%></option>
-                               </select>
-                               <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" />
-                               <% else %>
-                               <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" />
-                               <% end %>
-                               <% if not has_traceroute6 then %>
-                                       <p>&#160;</p>
-                                       <p><%:Install iputils-traceroute6 for IPv6 traceroute%></p>
-                               <% end %>
-                       </div>
-
-                       <div style="width:33%; float:left;">
-                               <input style="margin: 5px 0" type="text" value="<%=dns_host%>" name="nslookup" /><br />
-                               <input type="button" value="<%:Nslookup%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" />
-                       </div>
-
-                       <br style="clear:both" /><br />
-
-               </fieldset>
+               </div>
        </div>
 
-       <fieldset class="cbi-section" style="display:none">
-               <legend id="diag-rc-legend"><%:Collecting data...%></legend>
+       <div class="cbi-section" style="display:none">
+               <strong id="diag-rc-legend"></strong>
                <span id="diag-rc-output"></span>
-       </fieldset>
+       </div>
 </form>
 
 <%+footer%>
index 2512a35b3cdfd5ebf9f0c11b1764f651f0e6b0ac..473e2275ce4202df5e2758b860e6ea3fb95b181f 100644 (file)
@@ -33,7 +33,7 @@
 <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 <script type="text/javascript">//<![CDATA[
        function iface_shutdown(id, reconnect) {
-               if (!reconnect && !confirm(String.format('<%_Really shutdown interface "%s" ?\nYou might lose access to this device if you are connected via this interface.%>', id)))
+               if (!reconnect && !confirm(<%=luci.http.write_json(translate('Really shutdown interface "%s"? You might lose access to this device if you are connected via this interface.'))%>.format(id)))
                        return;
 
                var d = document.getElementById(id + '-ifc-description');
@@ -67,7 +67,7 @@
        }
 
        function iface_delete(id) {
-               if (!confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>'))
+               if (!confirm(<%=luci.http.write_json(translate('Really delete this interface? The deletion cannot be undone! You might lose access to this device if you are connected via this interface'))%>))
                        return;
 
                (new XHR()).post('<%=url('admin/network/iface_delete')%>/' + id, { token: '<%=token%>' },
                                                }
 
                                                html += String.format(
-                                                       '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
-                                                       '<strong><%:TX%></strong>: %.2mB (%d <%:Pkts.%>)<br />',
+                                                       '<strong><%:RX%>:</strong> %.2mB (%d <%:Pkts.%>)<br />' +
+                                                       '<strong><%:TX%>:</strong> %.2mB (%d <%:Pkts.%>)<br />',
                                                                ifc.rx_bytes, ifc.rx_packets,
                                                                ifc.tx_bytes, ifc.tx_packets
                                                );
                                                                        ifc.ip6addrs[i]
                                                                );
                                                }
-                                               
+
                                                if (ifc.ip6prefix)
                                                {
                                                        html += String.format('<strong><%:IPv6-PD%>:</strong> %s<br />', ifc.ip6prefix);
 </fieldset>
 
 <div class="cbi-map">
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <legend><%:Interface Overview%></legend>
 
-               <table class="cbi-section-table" style="margin:10px; empty-cells:hide">
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell"><%:Network%></th>
-                               <th class="cbi-section-table-cell" style="text-align:left"><%:Status%></th>
-                               <th class="cbi-section-table-cell"><%:Actions%></th>
-                       </tr>
-                       <%
-                               for i, net in ipairs(netlist) do
-                                       local z = net[3]
-                                       local c = z and z:get_color() or "#EEEEEE"
-                                       local t = z and translate("Part of zone %q" % z:name()) or translate("No zone assigned")
-                       %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=i % 2 + 1%>">
-                                       <td class="cbi-value-field" style="padding:3px">
-                                               <div class="ifacebox">
-                                                       <div class="ifacebox-head" style="background-color:<%=c%>" title="<%=pcdata(t)%>">
-                                                               <strong><%=net[1]:upper()%></strong>
-                                                       </div>
-                                                       <div class="ifacebox-body" id="<%=net[1]%>-ifc-devices">
-                                                               <img src="<%=resource%>/icons/ethernet_disabled.png" style="width:16px; height:16px" /><br />
-                                                               <small>?</small>
+               <div class="cbi-section-node">
+                       <div class="table">
+                               <%
+                                       for i, net in ipairs(netlist) do
+                                               local z = net[3]
+                                               local c = z and z:get_color() or "#EEEEEE"
+                                               local t = z and translate("Part of zone %q" % z:name()) or translate("No zone assigned")
+                               %>
+                                       <div class="tr cbi-rowstyle-<%=i % 2 + 1%>">
+                                               <div class="td col-3 center middle">
+                                                       <div class="ifacebox">
+                                                               <div class="ifacebox-head" style="background-color:<%=c%>" title="<%=pcdata(t)%>">
+                                                                       <strong><%=net[1]:upper()%></strong>
+                                                               </div>
+                                                               <div class="ifacebox-body" id="<%=net[1]%>-ifc-devices">
+                                                                       <img src="<%=resource%>/icons/ethernet_disabled.png" style="width:16px; height:16px" /><br />
+                                                                       <small>?</small>
+                                                               </div>
                                                        </div>
                                                </div>
-                                       </td>
-                                       <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=net[1]%>-ifc-description">
-                                               <em><%:Collecting data...%></em>
-                                       </td>
-                                       <td style="width:420px">
-                                               <input type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" />
-                                               <input type="button" class="cbi-button cbi-button-reset" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" />
-                                               <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
-                                               <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
-                                       </td>
-                               </tr>
-                       <% end %>
-               </table>
+                                               <div class="td col-5 left" id="<%=net[1]%>-ifc-description">
+                                                       <em><%:Collecting data...%></em>
+                                               </div>
+                                               <div class="td cbi-section-actions">
+                                                       <input type="button" class="cbi-button cbi-button-neutral" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" />
+                                                       <input type="button" class="cbi-button cbi-button-neutral" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" />
+                                                       <input type="button" class="cbi-button cbi-button-action important" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
+                                                       <input type="button" class="cbi-button cbi-button-negative" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
+                                               </div>
+                                       </div>
+                               <% end %>
+                       </div>
+               </div>
 
                <input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=url("admin/network/iface_add")%>'" />
-       </fieldset>
+       </div>
 </div>
index b15dd13f39512c8ab45698564272ff3c42d2f506..9c5173dae2b8fe01797e93b96a4196ba7ab41bcd 100644 (file)
@@ -6,29 +6,18 @@
                {
                        if (ifc && (ifc = ifc[0]))
                        {
-                               var html = '';
+                               var s = document.getElementById('<%=self.option%>-ifc-status'),
+                                   img = s.querySelector('img'),
+                                   info = s.querySelector('span'),
+                                   html = '<strong><%:Device%>:</strong> %h<br />'.format(ifc.ifname);
 
-                               var s = document.getElementById('<%=self.option%>-ifc-signal');
-                               if (s)
-                                       s.innerHTML = String.format(
-                                               '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px" />' +
-                                               '<br /><small>%s</small>',
-                                                       ifc.type, ifc.is_up ? '' : '_disabled',
-                                                       ifc.name
-                                       );
-
-                               var d = document.getElementById('<%=self.option%>-ifc-description');
-                               if (d && ifc.ifname)
+                               if (ifc.ifname)
                                {
                                        if (ifc.is_up)
-                                       {
                                                html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
-                                       }
 
                                        if (ifc.macaddr)
-                                       {
                                                html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr);
-                                       }
 
                                        html += String.format(
                                                '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
                                        );
 
                                        if (ifc.ipaddrs && ifc.ipaddrs.length)
-                                       {
                                                for (var i = 0; i < ifc.ipaddrs.length; i++)
                                                        html += String.format(
                                                                '<strong><%:IPv4%>:</strong> %s<br />',
                                                                ifc.ipaddrs[i]
                                                        );
-                                       }
 
                                        if (ifc.ip6addrs && ifc.ip6addrs.length)
-                                       {
                                                for (var i = 0; i < ifc.ip6addrs.length; i++)
                                                        html += String.format(
                                                                '<strong><%:IPv6%>:</strong> %s<br />',
                                                                ifc.ip6addrs[i]
                                                        );
-                                       }
-                                       
+
                                        if (ifc.ip6prefix)
-                                       {
                                                html += String.format('<strong><%:IPv6-PD%>:</strong> %s<br />', ifc.ip6prefix);
-                                       }
 
-                                       d.innerHTML = html;
+                                       info.innerHTML = html;
                                }
-                               else if (d)
+                               else
                                {
-                                       d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
+                                       info.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
                                }
+
+                               img.src = '<%=resource%>/icons/%s%s.png'.format(ifc.type, ifc.is_up ? '' : '_disabled');
                        }
                }
        );
 //]]></script>
 
-<table>
-       <tr class="cbi-section-table">
-               <td></td>
-               <td class="cbi-value-field" style="min-width:16px; padding:3px; text-align:center" id="<%=self.option%>-ifc-signal">
-                       <img src="<%=resource%>/icons/ethernet_disabled.png" style="width:16px; height:16px" /><br />
-                       <small>?</small>
-               </td>
-               <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-ifc-description">
-                       <em><%:Collecting data...%></em>
-               </td>
-       </tr>
-</table>
+<span class="ifacebadge large" id="<%=self.option%>-ifc-status">
+       <img src="<%=resource%>/icons/ethernet_disabled.png" />
+       <span>
+               <em><%:Collecting data...%></em>
+       </span>
+</span>
 
 <%+cbi/valuefooter%>
index 28a37dcd98a61a18e34d0e27731578ab9f1be425..8fbbdc94777cac6b4006534fea1c00938278339a 100644 (file)
@@ -1,29 +1,13 @@
 <script type="text/javascript">//<![CDATA[
-       function duid2mac(duid) {
-               // DUID-LLT / Ethernet
-               if (duid.length === 28 && duid.substr(0, 8) === '00010001')
-                       return duid.substr(16).replace(/(..)(?=..)/g, '$1:').toUpperCase();
-
-               // DUID-LL / Ethernet
-               if (duid.length === 20 && duid.substr(0, 8) === '00030001')
-                       return duid.substr(8).replace(/(..)(?=..)/g, '$1:').toUpperCase();
-
-               return null;
-       }
-
-       var hosts = <%=luci.http.write_json(luci.sys.net.host_hints())%>;
-
        XHR.poll(5, '<%=url('admin/network/dhcplease_status')%>', null,
                function(x, st)
                {
                        var tb = document.getElementById('lease_status_table');
                        if (st && st[0] && tb)
                        {
-                               /* clear all rows */
-                               while( tb.rows.length > 1 )
-                                       tb.deleteRow(1);
+                               var rows = [];
 
-                               for( var i = 0; i < st[0].length; i++ )
+                               for (var i = 0; i < st[0].length; i++)
                                {
                                        var timestr;
 
                                        else
                                                timestr = String.format('%t', st[0][i].expires);
 
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                       tr.insertCell(-1).innerHTML = st[0][i].hostname ? st[0][i].hostname : '?';
-                                       tr.insertCell(-1).innerHTML = st[0][i].ipaddr;
-                                       tr.insertCell(-1).innerHTML = st[0][i].macaddr;
-                                       tr.insertCell(-1).innerHTML = timestr;
+                                       rows.push([
+                                               st[0][i].hostname || '?',
+                                               st[0][i].ipaddr,
+                                               st[0][i].macaddr,
+                                               timestr
+                                       ]);
                                }
 
-                               if( tb.rows.length == 1 )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 4;
-                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
-                               }
+                               cbi_update_table(tb, rows, '<em><%:There are no active leases.%></em>');
                        }
 
                        var tb6 = document.getElementById('lease6_status_table');
                        {
                                tb6.parentNode.style.display = 'block';
 
-                               /* clear all rows */
-                               while( tb6.rows.length > 1 )
-                                       tb6.deleteRow(1);
+                               var rows = [];
 
-                               for( var i = 0; i < st[1].length; i++ )
+                               for (var i = 0; i < st[1].length; i++)
                                {
                                        var timestr;
 
                                        else
                                                timestr = String.format('%t', st[1][i].expires);
 
-                                       var tr = tb6.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                       var host = hosts[duid2mac(st[1][i].duid)];
-                                       if (!st[1][i].hostname)
-                                               tr.insertCell(-1).innerHTML =
-                                                       (host && (host.name || host.ipv4 || host.ipv6))
-                                                               ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">? (%h)</div>'.format(host.name || host.ipv4 || host.ipv6)
-                                                               : '?';
-                                       else
-                                               tr.insertCell(-1).innerHTML =
-                                                       (host && host.name && st[1][i].hostname != host.name)
-                                                               ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">%h (%h)</div>'.format(st[1][i].hostname, host.name)
-                                                               : st[1][i].hostname;
+                                       var name = st[1][i].hostname,
+                                           hint = st[1][i].host_hint;
 
-                                       tr.insertCell(-1).innerHTML = st[1][i].ip6addr;
-                                       tr.insertCell(-1).innerHTML = st[1][i].duid;
-                                       tr.insertCell(-1).innerHTML = timestr;
+                                       rows.push([
+                                               hint ? '%h (%h)'.format(name || '?', hint) : (name || '?'),
+                                               st[1][i].ip6addr,
+                                               st[1][i].duid,
+                                               timestr
+                                       ]);
                                }
 
-                               if( tb6.rows.length == 1 )
-                               {
-                                       var tr = tb6.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 4;
-                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
-                               }
+                               cbi_update_table(tb6, rows, '<em><%:There are no active leases.%></em>');
                        }
                }
        );
 //]]></script>
 
-<fieldset class="cbi-section">
-       <legend><%:Active DHCP Leases%></legend>
-       <table class="cbi-section-table" id="lease_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Hostname%></th>
-                       <th class="cbi-section-table-cell"><%:IPv4-Address%></th>
-                       <th class="cbi-section-table-cell"><%:MAC-Address%></th>
-                       <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="4"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section" style="display:none">
-       <legend><%:Active DHCPv6 Leases%></legend>
-       <table class="cbi-section-table" id="lease6_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Host%></th>
-                       <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
-                       <th class="cbi-section-table-cell"><%:DUID%></th>
-                       <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="4"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
+<div class="cbi-section">
+       <h3><%:Active DHCP Leases%></h3>
+       <div class="table" id="lease_status_table">
+               <div class="tr table-titles">
+                       <div class="th"><%:Hostname%></div>
+                       <div class="th"><%:IPv4-Address%></div>
+                       <div class="th"><%:MAC-Address%></div>
+                       <div class="th"><%:Leasetime remaining%></div>
+               </div>
+               <div class="tr placeholder">
+                       <div class="td"><em><%:Collecting data...%></em></div>
+               </div>
+       </div>
+</div>
+
+<div class="cbi-section" style="display:none">
+       <h3><%:Active DHCPv6 Leases%></h3>
+       <div class="table" id="lease6_status_table">
+               <div class="tr table-titles">
+                       <div class="th"><%:Host%></div>
+                       <div class="th"><%:IPv6-Address%></div>
+                       <div class="th"><%:DUID%></div>
+                       <div class="th"><%:Leasetime remaining%></div>
+               </div>
+               <div class="tr placeholder">
+                       <div class="td"><em><%:Collecting data...%></em></div>
+               </div>
+       </div>
+</div>
index 96fbffdb02866f3aac317d13a212015f4cd85c3d..68f0bbc9d4d9c3077cd9d4012ab33880cdaa4100 100644 (file)
@@ -1,21 +1,39 @@
 <script type="text/javascript">//<![CDATA[
-       var switches = [ '<%=table.concat(self.switches, "', '")%>' ];
+       var switches = [ '<%=table.concat(self.switches, "', '")%>' ],
+           tables = document.querySelectorAll('.cbi-section-table');
+
+       function add_status_row(table) {
+               var first_row = table.querySelector('.cbi-section-table-row');
+               if (first_row.classList.contains('port-status'))
+                       return first_row;
+
+               var status_row = first_row.parentNode.insertBefore(
+                       E('div', { 'class': first_row.className }), first_row);
+
+               first_row.querySelectorAll('.td').forEach(function(td) {
+                       status_row.appendChild(td.cloneNode(false));
+                       status_row.lastElementChild.removeAttribute('data-title');
+               });
+
+               status_row.firstElementChild.innerHTML = '<%:Port status:%>';
+               status_row.classList.add('port-status') ;
+
+               return status_row;
+       }
+
        XHR.poll(5, '<%=url('admin/network/switch_status')%>/' + switches.join(','), null,
                function(x, st)
                {
                        for (var i = 0; i < switches.length; i++)
                        {
                                var ports = st[switches[i]];
-                               var th0 = document.getElementById('portstatus-' + switches[i]);
+                               var tr = add_status_row(tables[i]);
 
-                               if (th0 && ports && ports.length)
+                               if (tr && ports && ports.length)
                                {
-                                       if (!th0.innerHTML)
-                                               th0.innerHTML = '<%:Port status:%>';
-
                                        for (var j = 0; j < ports.length; j++)
                                        {
-                                               var th = document.getElementById('portstatus-' + switches[i] + '-' + j);
+                                               var th = tr.querySelector('[data-name="%d"]'.format(j));
 
                                                if (!th)
                                                        continue;
diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_assoclist.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_assoclist.htm
new file mode 100644 (file)
index 0000000..b6f84c0
--- /dev/null
@@ -0,0 +1,82 @@
+<script type="text/javascript">//<![CDATA[
+       function wifirate(bss, rx) {
+               var p = rx ? 'rx_' : 'tx_',
+                   s = '%.1f <%:Mbit/s%>, %d<%:MHz%>'
+                                       .format(bss[p+'rate'] / 1000, bss[p+'mhz']),
+                   ht = bss[p+'ht'], vht = bss[p+'vht'],
+                       mhz = bss[p+'mhz'], nss = bss[p+'nss'],
+                       mcs = bss[p+'mcs'], sgi = bss[p+'short_gi'];
+
+               if (ht || vht) {
+                       if (vht) s += ', VHT-MCS %d'.format(mcs);
+                       if (nss) s += ', VHT-NSS %d'.format(nss);
+                       if (ht)  s += ', MCS %s'.format(mcs);
+                       if (sgi) s += ', <%:Short GI%>';
+               }
+
+               return s;
+       }
+
+       XHR.poll(5, '<%=url('admin/network/wireless_assoclist')%>', null,
+               function(x, st)
+               {
+                       var tb = document.getElementById('wifi_assoclist_table');
+                       if (st && tb)
+                       {
+                               var rows = [];
+
+                               st.forEach(function(bss) {
+                                       var icon;
+                                       var q = (-1 * (bss.noise - bss.signal)) / 5;
+                                       if (q < 1)
+                                               icon = "<%=resource%>/icons/signal-0.png";
+                                       else if (q < 2)
+                                               icon = "<%=resource%>/icons/signal-0-25.png";
+                                       else if (q < 3)
+                                               icon = "<%=resource%>/icons/signal-25-50.png";
+                                       else if (q < 4)
+                                               icon = "<%=resource%>/icons/signal-50-75.png";
+                                       else
+                                               icon = "<%=resource%>/icons/signal-75-100.png";
+
+                                       rows.push([
+                                               '<span class="ifacebadge" title="%q"><img src="<%=resource%>/icons/wifi.png" /> <a href="%s">%h</a><small>&#160;(%h)</small></span>'.format(
+                                                       bss.radio,
+                                                       bss.link,
+                                                       bss.name,
+                                                       bss.ifname),
+                                               bss.bssid,
+                                               bss.host_hint ? '%h (%h)'.format(bss.host_name || '?', bss.host_hint) : (bss.host_name || '?'),
+                                               '<span class="ifacebadge" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%> / <%:SNR%>: %d"><img src="%s" /> %d / %d <%:dBm%></span>'.format(
+                                                       bss.signal,
+                                                       bss.noise,
+                                                       bss.signal - bss.noise,
+                                                       icon,
+                                                       bss.signal,
+                                                       bss.noise),
+                                               E('span', {}, [
+                                                       E('span', wifirate(bss, true)),
+                                                       E('br'),
+                                                       E('span', wifirate(bss, false))
+                                               ])
+                                       ]);
+                               });
+
+                               cbi_update_table(tb, rows, '<em><%:No information available%></em>');
+                       }
+               }
+       );
+//]]></script>
+
+<div class="table" id="wifi_assoclist_table">
+       <div class="tr table-titles">
+               <div class="th nowrap"><%:Network%></div>
+               <div class="th hide-xs"><%:MAC-Address%></div>
+               <div class="th nowrap"><%:Host%></div>
+               <div class="th nowrap"><%:Signal%> / <%:Noise%></div>
+               <div class="th nowrap"><%:RX Rate%> / <%:TX Rate%></div>
+       </div>
+       <div class="tr placeholder">
+               <div class="td"><em><%:Collecting data...%></em></div>
+       </div>
+</div>
index 3533c6fa4dd4979093589e4bbf1df44aa88e9240..9b93942c887db83ef589fcca7e82c6d881a86239 100644 (file)
 <h2 name="content"><%:Join Network: Wireless Scan%></h2>
 
 <div class="cbi-map">
-       <fieldset class="cbi-section">
-               <table class="cbi-section-table" style="empty-cells:hide">
+       <div class="cbi-section">
+               <div class="table">
+                       <div class="tr table-titles">
+                               <div class="th col-1 center"><%:Signal%></div>
+                               <div class="th col-5 left"><%:SSID%></div>
+                               <div class="th col-2 center"><%:Channel%></div>
+                               <div class="th col-2 left"><%:Mode%></div>
+                               <div class="th col-3 left"><%:BSSID%></div>
+                               <div class="th col-2 left"><%:Encryption%></div>
+                               <div class="th cbi-section-actions">&#160;</div>
+                       </div>
+
                        <!-- scan list -->
                        <% for i, net in ipairs(scanlist(3)) do net.encryption = net.encryption or { } %>
-                       <tr class="cbi-section-table-row cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
-                               <td class="cbi-value-field" style="width:16px; padding:3px">
+                       <div class="tr cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
+                               <div class="td col-1 center">
                                        <abbr title="<%:Signal%>: <%=net.signal%> <%:dB%> / <%:Quality%>: <%=net.quality%>/<%=net.quality_max%>">
                                                <img src="<%=guess_wifi_signal(net)%>" /><br />
                                                <small><%=percent_wifi_signal(net)%>%</small>
                                        </abbr>
-                               </td>
-                               <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px">
-                                       <big><strong><%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%></strong></big><br />
-                                       <strong>Channel:</strong> <%=net.channel%> |
-                                       <strong>Mode:</strong> <%=net.mode%> |
-                                       <strong>BSSID:</strong> <%=net.bssid%> |
-                                       <strong>Encryption:</strong> <%=format_wifi_encryption(net.encryption)%>
-                               </td>
-                               <td class="cbi-value-field" style="width:40px">
+                               </div>
+                               <div class="td col-5 left" data-title="<%:SSID%>">
+                                       <strong><%=net.ssid and utl.pcdata(net.ssid) or "<em>%s</em>" % translate("hidden")%></strong>
+                               </div>
+                               <div class="td col-2 center" data-title="<%:Channel%>">
+                                       <%=net.channel%>
+                               </div>
+                               <div class="td col-2 left" data-title="<%:Mode%>">
+                                       <%=net.mode%>
+                               </div>
+                               <div class="td col-3 left" data-title="<%:BSSID%>">
+                                       <%=net.bssid%>
+                               </div>
+                               <div class="td col-2 left" data-title="<%:Encryption%>">
+                                       <%=format_wifi_encryption(net.encryption)%>
+                               </div>
+                               <div class="td cbi-section-actions">
                                        <form action="<%=url('admin/network/wireless_join')%>" method="post">
                                                <input type="hidden" name="token" value="<%=token%>" />
                                                <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
 
                                                <input type="hidden" name="clbridge" value="<%=iw.type == "wl" and 1 or 0%>" />
 
-                                               <input class="cbi-button cbi-button-apply" type="submit" value="<%:Join Network%>" />
+                                               <input class="cbi-button cbi-button-action important" type="submit" value="<%:Join Network%>" />
                                        </form>
-                               </td>
-                       </tr>
+                               </div>
+                       </div>
                        <% end %>
                        <!-- /scan list -->
-               </table>
-       </fieldset>
+               </div>
+       </div>
 </div>
 <div class="cbi-page-actions right">
        <form class="inline" action="<%=url("admin/network/wireless")%>" method="get">
-               <input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>" />
+               <input class="cbi-button cbi-button-neutral" type="submit" value="<%:Back to overview%>" />
        </form>
        <form class="inline" action="<%=url('admin/network/wireless_join')%>" method="post">
                <input type="hidden" name="token" value="<%=token%>" />
                <input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
-               <input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>" />
+               <input class="cbi-button cbi-button-action" type="submit" value="<%:Repeat scan%>" />
        </form>
 </div>
 
index 4465095ff2a2a246240832511a55ae1249db07ab..b9602785f4ae45a30f7883efaa13acdcfde86aac 100644 (file)
 <%+header%>
 
 <% if not has_iwinfo then %>
-       <div class="errorbox">
-               <strong><%:Package libiwinfo required!%></strong><br />
-               <%_The <em>libiwinfo-lua</em> package is not installed. You must install this component for working wireless configuration!%>
+       <div class="alert-message warning">
+               <h4><%:Package libiwinfo required!%></h4>
+               <p><%_The <em>libiwinfo-lua</em> package is not installed. You must install this component for working wireless configuration!%></p>
        </div>
 <% end %>
 
 
        var is_reconnecting = false;
 
-       function nowrap(s) {
-               return s.replace(/ /g, '&#160;');
-       }
-
-       function wifirate(bss, rx) {
-               var p = rx ? 'rx_' : 'tx_',
-                   s = '%.1f <%:Mbit/s%>, %d<%:MHz%>'
-                                       .format(bss[p+'rate'] / 1000, bss[p+'mhz']),
-                   ht = bss[p+'ht'], vht = bss[p+'vht'],
-                       mhz = bss[p+'mhz'], nss = bss[p+'nss'],
-                       mcs = bss[p+'mcs'], sgi = bss[p+'short_gi'];
-
-               if (ht || vht) {
-                       if (vht) s += ', VHT-MCS %d'.format(mcs);
-                       if (nss) s += ', VHT-NSS %d'.format(nss);
-                       if (ht)  s += ', MCS %s'.format(mcs);
-                       if (sgi) s += ', <%:Short GI%>';
-               }
-
-               return s;
-       }
-
        function wifi_shutdown(id, toggle) {
                var reconnect = (toggle.getAttribute('active') == 'false');
 
-               if (!reconnect && !confirm(String.format('<%:Really shut down network?\nYou might lose access to this device if you are connected via this interface.%>')))
+               if (!reconnect && !confirm(<%=luci.http.write_json(translate('Really shut down network? You might lose access to this device if you are connected via this interface'))%>))
                        return;
 
                is_reconnecting = true;
        }
 
        function wifi_delete(id) {
-               if (!confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>'))
+               if (!confirm(<%=luci.http.write_json(translate('Really delete this wireless network? The deletion cannot be undone! You might lose access to this device if you are connected via this network.'))%>))
                        return;
 
                (new XHR()).post('<%=url('admin/network/wireless_delete')%>/' + id, { token: '<%=token%>' },
                {
                        if (st)
                        {
-                               var assoctable = document.getElementById('iw-assoclist');
-                               if (assoctable)
-                                       while (assoctable.rows.length > 1)
-                                               assoctable.rows[1].parentNode.removeChild(assoctable.rows[1]);
-
-                               var devup = { };
                                var rowstyle = 1;
+                               var radiostate = { };
+
+                               st.forEach(function(s) {
+                                       var r = radiostate[wifidevs[s.id]] || (radiostate[wifidevs[s.id]] = {});
+
+                                       s.is_assoc = (s.bssid && s.bssid != '00:00:00:00:00:00' && s.channel && s.mode != 'Unknown' && !s.disabled);
+
+                                       r.up        = r.up        || s.is_assoc;
+                                       r.channel   = r.channel   || s.channel;
+                                       r.bitrate   = r.bitrate   || s.bitrate;
+                                       r.frequency = r.frequency || s.frequency;
+                               });
 
                                for( var i = 0; i < st.length; i++ )
                                {
                                        var iw = st[i];
-                                       var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && iw.mode != 'Unknown' && !iw.disabled);
                                        var p = iw.quality;
-                                       var q = is_assoc ? p : -1;
+                                       var q = iw.is_assoc ? p : -1;
 
                                        var icon;
                                        if (q < 0)
                                        else
                                                icon = "<%=resource%>/icons/signal-75-100.png";
 
-                                       if (!devup[wifidevs[iw.id]])
-                                               devup[wifidevs[iw.id]] = is_assoc;
-
                                        var sig = document.getElementById(iw.id + '-iw-signal');
                                        if (sig)
                                                sig.innerHTML = String.format(
                                        {
                                                if (!iw.disabled)
                                                {
-                                                       toggle.className = 'cbi-button cbi-button-reset';
+                                                       toggle.className = 'cbi-button cbi-button-neutral';
                                                        toggle.value = '<%:Disable%>';
                                                        toggle.title = '<%:Shutdown this network%>';
                                                }
                                                else
                                                {
-                                                       toggle.className = 'cbi-button cbi-button-reload';
+                                                       toggle.className = 'cbi-button cbi-button-neutral';
                                                        toggle.value = '<%:Enable%>';
                                                        toggle.title = '<%:Activate this network%>';
                                                }
                                        var info = document.getElementById(iw.id + '-iw-status');
                                        if (info)
                                        {
-                                               if (is_assoc)
+                                               if (iw.is_assoc)
                                                        info.innerHTML = String.format(
                                                                '<strong><%:SSID%>:</strong> %h | ' +
                                                                '<strong><%:Mode%>:</strong> %s<br />' +
                                                                                : '<em><%:Wireless is disabled or not associated%></em>'
                                                        );
                                        }
-
-                                       var dev = document.getElementById(wifidevs[iw.id] + '-iw-devinfo');
-                                       if (dev)
-                                       {
-                                               if (is_assoc)
-                                                       dev.innerHTML = String.format(
-                                                               '<strong><%:Channel%>:</strong> %s (%s <%:GHz%>) | ' +
-                                                               '<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%>',
-                                                                       iw.channel ? iw.channel : '?',
-                                                                       iw.frequency ? iw.frequency : '?',
-                                                                       iw.bitrate ? iw.bitrate : '?'
-                                                       );
-                                               else
-                                                       dev.innerHTML = '';
-                                       }
-
-                                       if (assoctable)
-                                       {
-                                               var assoclist = [ ];
-                                               for( var bssid in iw.assoclist )
-                                               {
-                                                       assoclist.push(iw.assoclist[bssid]);
-                                                       assoclist[assoclist.length-1].bssid = bssid;
-                                               }
-
-                                               assoclist.sort(function(a, b) { a.bssid < b.bssid });
-
-                                               for( var j = 0; j < assoclist.length; j++ )
-                                               {
-                                                       var tr = assoctable.insertRow(-1);
-                                                           tr.className = 'cbi-section-table-row cbi-rowstyle-' + rowstyle;
-
-                                                       var icon;
-                                                       var q = (-1 * (assoclist[j].noise - assoclist[j].signal)) / 5;
-                                                       if (q < 1)
-                                                               icon = "<%=resource%>/icons/signal-0.png";
-                                                       else if (q < 2)
-                                                               icon = "<%=resource%>/icons/signal-0-25.png";
-                                                       else if (q < 3)
-                                                               icon = "<%=resource%>/icons/signal-25-50.png";
-                                                       else if (q < 4)
-                                                               icon = "<%=resource%>/icons/signal-50-75.png";
-                                                       else
-                                                               icon = "<%=resource%>/icons/signal-75-100.png";
-
-                                                       tr.insertCell(-1).innerHTML = String.format(
-                                                               '<span class="ifacebadge" title="%q"><img src="<%=resource%>/icons/wifi.png" /> %h</span>',
-                                                               iw.device.name, iw.ifname
-                                                       );
-
-                                                       tr.insertCell(-1).innerHTML = nowrap(String.format('%h', iw.ssid ? iw.ssid : '?'));
-                                                       tr.insertCell(-1).innerHTML = assoclist[j].bssid;
-
-                                                       var host = hosts[assoclist[j].bssid];
-                                                       if (host)
-                                                               tr.insertCell(-1).innerHTML = String.format(
-                                                                       '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis">%s</div>',
-                                                                       ((host.name && (host.ipv4 || host.ipv6))
-                                                                               ? '%h (%s)'.format(host.name, host.ipv4 || host.ipv6)
-                                                                               : '%h'.format(host.name || host.ipv4 || host.ipv6)).nobr()
-                                                               );
-                                                       else
-                                                               tr.insertCell(-1).innerHTML = '?';
-
-                                                       tr.insertCell(-1).innerHTML = String.format(
-                                                               '<span class="ifacebadge" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%> / <%:SNR%>: %d"><img src="%s" /> %d / %d <%:dBm%></span>',
-                                                               assoclist[j].signal, assoclist[j].noise, assoclist[j].signal - assoclist[j].noise,
-                                                               icon,
-                                                               assoclist[j].signal, assoclist[j].noise
-                                                       );
-
-                                                       tr.insertCell(-1).innerHTML = nowrap(wifirate(assoclist[j], true)) + '<br />' + nowrap(wifirate(assoclist[j], false));
-
-                                                       rowstyle = (rowstyle == 1) ? 2 : 1;
-                                               }
-                                       }
                                }
 
-                               if (assoctable && assoctable.rows.length == 1)
-                               {
-                                       var tr = assoctable.insertRow(-1);
-                                           tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                           td.colSpan = 8;
-                                           td.innerHTML = '<br /><em><%:No information available%></em>';
-                               }
-
-                               for (var dev in devup)
+                               for (var dev in radiostate)
                                {
                                        var img = document.getElementById(dev + '-iw-upstate');
                                        if (img)
-                                               img.src = '<%=resource%>/icons/wifi_big' + (devup[dev] ? '' : '_disabled') + '.png';
+                                               img.src = '<%=resource%>/icons/wifi' + (radiostate[dev].up ? '' : '_disabled') + '.png';
+
+                                       var stat = document.getElementById(dev + '-iw-devinfo');
+                                       if (stat)
+                                               stat.innerHTML = String.format(
+                                                       '<strong><%:Channel%>:</strong> %s (%s <%:GHz%>) | ' +
+                                                       '<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%>',
+                                                               radiostate[dev].channel ? radiostate[dev].channel : '?',
+                                                               radiostate[dev].frequency ? radiostate[dev].frequency : '?',
+                                                               radiostate[dev].bitrate ? radiostate[dev].bitrate : '?'
+                                               );
                                }
                        }
                }
 
 <h2 name="content"><%:Wireless Overview%></h2>
 
-<fieldset class="cbi-section" style="display:none">
+<div class="cbi-section" style="display:none">
        <legend><%:Reconnecting interface%></legend>
        <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
        <span id="iw-rc-status"><%:Waiting for changes to be applied...%></span>
-</fieldset>
+</div>
 
-<div class="cbi-map">
+<div id="cbi-wireless-overview" class="cbi-map">
 
        <% for _, dev in ipairs(devices) do local nets = dev:get_wifinets() %>
        <!-- device <%=dev:name()%> -->
-       <fieldset class="cbi-section">
-               <table class="cbi-section-table" style="margin:10px; empty-cells:hide">
+       <div class="cbi-section-node">
+               <div class="table">
                        <!-- physical device -->
-                       <tr>
-                               <td style="width:34px"><img src="<%=resource%>/icons/wifi_big_disabled.png" style="float:left; margin-right:10px" id="<%=dev:name()%>-iw-upstate" /></td>
-                               <td colspan="2" style="text-align:left">
-                                       <big><strong><%=guess_wifi_hw(dev)%> (<%=dev:name()%>)</strong></big><br />
+                       <div class="tr">
+                               <div class="td col-2 center">
+                                       <span class="ifacebadge"><img src="<%=resource%>/icons/wifi_disabled.png" id="<%=dev:name()%>-iw-upstate" /> <%=dev:name()%></span>
+                               </div>
+                               <div class="td col-7 left">
+                                       <big><strong><%=guess_wifi_hw(dev)%></strong></big><br />
                                        <span id="<%=dev:name()%>-iw-devinfo"></span>
-                               </td>
-                               <td style="width:310px;text-align:right">
+                               </div>
+                               <div class="td cbi-section-actions">
                                        <form action="<%=url('admin/network/wireless_join')%>" method="post" class="inline">
                                                <input type="hidden" name="device" value="<%=dev:name()%>" />
                                                <input type="hidden" name="token" value="<%=token%>" />
-                                               <input type="submit" class="cbi-button cbi-button-find" style="width:100px" title="<%:Find and join network%>" value="<%:Scan%>" />
+                                               <input type="submit" class="cbi-button cbi-button-action" title="<%:Find and join network%>" value="<%:Scan%>" />
                                        </form>
                                        <form action="<%=url('admin/network/wireless_add')%>" method="post" class="inline">
                                                <input type="hidden" name="device" value="<%=dev:name()%>" />
                                                <input type="hidden" name="token" value="<%=token%>" />
-                                               <input type="submit" class="cbi-button cbi-button-add" style="width:100px" title="<%:Provide new network%>" value="<%:Add%>" />
+                                               <input type="submit" class="cbi-button cbi-button-add" title="<%:Provide new network%>" value="<%:Add%>" />
                                        </form>
-                               </td>
-                       </tr>
+                               </div>
+                       </div>
                        <!-- /physical device -->
 
                        <!-- network list -->
                        <% if #nets > 0 then %>
                                <% for i, net in ipairs(nets) do %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
-                                       <td></td>
-                                       <td class="cbi-value-field" style="vertical-align:middle; padding:3px" id="<%=net:id()%>-iw-signal">
+                               <div class="tr cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
+                                       <div class="td col-2 center" id="<%=net:id()%>-iw-signal">
                                                <span class="ifacebadge" title="<%:Not associated%>"><img src="<%=resource%>/icons/signal-none.png" /> 0%</span>
-                                       </td>
-                                       <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=net:id()%>-iw-status">
+                                       </div>
+                                       <div class="td col-7 left" id="<%=net:id()%>-iw-status">
                                                <em><%:Collecting data...%></em>
-                                       </td>
-                                       <td class="cbi-value-field" style="width:310px;text-align:right">
-                                               <input id="<%=net:id()%>-iw-toggle" type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="wifi_shutdown('<%=net:id()%>', this)" title="<%:Delete this network%>" value="<%:Enable%>" />
-                                               <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=net:adminlink()%>'" title="<%:Edit this network%>" value="<%:Edit%>" />
-                                               <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="wifi_delete('<%=net:id()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
-                                       </td>
-                               </tr>
+                                       </div>
+                                       <div class="td cbi-section-actions">
+                                               <input id="<%=net:id()%>-iw-toggle" type="button" class="cbi-button cbi-button-neutral" onclick="wifi_shutdown('<%=net:id()%>', this)" title="<%:Enable this network%>" value="<%:Enable%>" />
+                                               <input type="button" class="cbi-button cbi-button-action important" onclick="location.href='<%=net:adminlink()%>'" title="<%:Edit this network%>" value="<%:Edit%>" />
+                                               <input type="button" class="cbi-button cbi-button-negative" onclick="wifi_delete('<%=net:id()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
+                                       </div>
+                               </div>
                                <% end %>
                        <% else %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-2">
-                                       <td></td>
-                                       <td colspan="3" class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px">
+                               <div class="tr cbi-rowstyle-2">
+                                       <div class="td left">
                                                <em><%:No network configured on this device%></em>
-                                       </td>
-                               </tr>
+                                       </div>
+                               </div>
                        <% end %>
                        <!-- /network list -->
-               </table>
-       </fieldset>
+               </div>
+       </div>
        <!-- /device <%=dev:name()%> -->
        <% end %>
 
 
        <h2><%:Associated Stations%></h2>
 
-       <fieldset class="cbi-section">
-               <table class="cbi-section-table valign-middle" style="margin:10px" id="iw-assoclist">
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell"></th>
-                               <th class="cbi-section-table-cell"><%:SSID%></th>
-                               <th class="cbi-section-table-cell"><%:MAC-Address%></th>
-                               <th class="cbi-section-table-cell"><%:Host%></th>
-                               <th class="cbi-section-table-cell"><%:Signal%> / <%:Noise%></th>
-                               <th class="cbi-section-table-cell"><%:RX Rate%> / <%:TX Rate%></th>
-                       </tr>
-                       <tr class="cbi-section-table-row cbi-rowstyle-2">
-                               <td class="cbi-value-field" colspan="6">
-                                       <em><%:Collecting data...%></em>
-                               </td>
-                       </tr>
-               </table>
-       </fieldset>
+       <%+admin_network/wifi_assoclist%>
 </div>
 
 <%+footer%>
index 04687f38e74e34dc5f2b128f9fd7af8d16fa2581..85468252e9af39b32f1e695ba8a8b0fa83288406 100644 (file)
        );
 //]]></script>
 
-<table>
-       <tr class="cbi-section-table">
-               <td></td>
-               <td class="cbi-value-field" style="width:16px; padding:3px" id="<%=self.option%>-iw-signal">
+<div class="table">
+       <div class="tr cbi-section-table">
+               <div class="td"></div>
+               <div class="td cbi-value-field" style="width:16px; padding:3px" id="<%=self.option%>-iw-signal">
                        <img src="<%=resource%>/icons/signal-none.png" title="<%:Not associated%>" /><br />
                        <small>0%</small>
-               </td>
-               <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-iw-description">
+               </div>
+               <div class="td cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-iw-description">
                        <em><%:Collecting data...%></em>
-               </td>
-       </tr>
-</table>
+               </div>
+       </div>
+</div>
 
 <%+cbi/valuefooter%>
index 33bbee78432ffd8ef5b38e457a0da835ad564691..b7594bfd45c8aa6f20074d7c7c25ac71ebc58926 100644 (file)
                                                        data_rx_peak = Math.max(data_rx_peak, data_rx[i]);
                                                        data_tx_peak = Math.max(data_tx_peak, data_tx[i]);
 
-                                                       if (i > 0)
-                                                       {
-                                                               data_rx_avg = (data_rx_avg + data_rx[i]) / 2;
-                                                               data_tx_avg = (data_tx_avg + data_tx[i]) / 2;
-                                                       }
-                                                       else
-                                                       {
-                                                               data_rx_avg = data_rx[i];
-                                                               data_tx_avg = data_tx[i];
-                                                       }
+                                                       data_rx_avg += data_rx[i];
+                                                       data_tx_avg += data_tx[i];
                                                }
 
+                                               data_rx_avg = (data_rx_avg / Math.max(data_rx.length, 1));
+                                               data_tx_avg = (data_tx_avg / Math.max(data_tx.length, 1));
+
                                                /* remember current timestamp, calculate horizontal scale */
                                                data_stamp = data[data.length-1][TIME];
                                                data_scale = height / (data_max * 1.1);
                                                label_tx_peak.innerHTML = bandwidth_label(data_tx_peak, true);
                                        }
                                );
+
+                               XHR.run();
                        }
                }, 1000
        );
 <div style="text-align:right"><small id="scale">-</small></div>
 <br />
 
-<table style="width:100%; table-layout:fixed" cellspacing="5">
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Inbound:%></strong></td>
-               <td id="rx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Inbound:%></strong></div>
+               <div class="td" id="rx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="rx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="rx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="rx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
-       </tr>
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Outbound:%></strong></td>
-               <td id="tx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="rx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
+       </div>
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Outbound:%></strong></div>
+               <div class="td" id="tx_bw_cur">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="tx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="tx_bw_avg">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="tx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</td>
-       </tr>
-</table>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="tx_bw_peak">0 <%:kbit/s%><br />(0 <%:kB/s%>)</div>
+       </div>
+</div>
 
 <%+footer%>
index b7ebc41451f5e21da0aee34bae89a278ad657bdb..ae8a6bb7cede7454a80865de1680f888eb147c66 100644 (file)
                                        {
                                                var conn = json.connections;
 
-                                               while (conn_table.rows.length > 1)
-                                                       conn_table.rows[0].parentNode.deleteRow(-1);
+                                               while (conn_table.firstElementChild !== conn_table.lastElementChild)
+                                                       conn_table.removeChild(conn_table.lastElementChild);
 
 
                                                var lookup_queue = [ ];
                                                {
                                                        var c  = conn[i];
 
-                                                       if ((c.src == '127.0.0.1' && c.dst == '127.0.0.1')
-                                                       || (c.src == '::1' && c.dst == '::1'))
+                                                       if ((c.src == '127.0.0.1' && c.dst == '127.0.0.1') ||
+                                                           (c.src == '::1'       && c.dst == '::1'))
                                                                continue;
 
-                                                       var tr = conn_table.rows[0].parentNode.insertRow(-1);
-                                                           tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2));
-
                                                        if (!dns_cache[c.src])
                                                                lookup_queue.push(c.src);
 
                                                        var src = dns_cache[c.src] || (c.layer3 == 'ipv6' ? '[' + c.src + ']' : c.src);
                                                        var dst = dns_cache[c.dst] || (c.layer3 == 'ipv6' ? '[' + c.dst + ']' : c.dst);
 
-                                                       tr.insertCell(-1).innerHTML = c.layer3.toUpperCase();
-                                                       tr.insertCell(-1).innerHTML = c.layer4.toUpperCase();
-                                                       tr.insertCell(-1).innerHTML = String.format('%s:%d', src, c.sport);
-                                                       tr.insertCell(-1).innerHTML = String.format('%s:%d', dst, c.dport);
-
-                                                       var traf = tr.insertCell(-1);
-                                                           traf.style.whiteSpace = 'nowrap';
-                                                           traf.innerHTML = String.format('%1024.2mB (%d <%:Pkts.%>)', c.bytes, c.packets);
+                                                       conn_table.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(1 + (i % 2)), [
+                                                               E('<div class="td">', c.layer3.toUpperCase()),
+                                                               E('<div class="td">', c.layer4.toUpperCase()),
+                                                               E('<div class="td">', [ src, ':', c.sport ]),
+                                                               E('<div class="td">', [ dst, ':', c.dport ]),
+                                                               E('<div class="td" style="white-space:nowrap">', '%1024.2mB (%d <%:Pkts.%>)'.format(c.bytes, c.packets)),
+                                                       ]));
                                                }
 
                                                if (lookup_queue.length > 0)
                                                label_otr_peak.innerHTML = Math.floor(data_otr_peak);
                                        }
                                );
+
+                               XHR.run();
                        }
                }, 1000
        );
        <div style="text-align:right"><small id="scale">-</small></div>
        <br />
 
-       <table style="width:100%; table-layout:fixed" cellspacing="5">
-               <tr>
-                       <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:UDP:%></strong></td>
-                       <td id="lb_udp_cur">0</td>
-
-                       <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-                       <td id="lb_udp_avg">0</td>
-
-                       <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-                       <td id="lb_udp_peak">0</td>
-               </tr>
-               <tr>
-                       <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:TCP:%></strong></td>
-                       <td id="lb_tcp_cur">0</td>
-
-                       <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-                       <td id="lb_tcp_avg">0</td>
-
-                       <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-                       <td id="lb_tcp_peak">0</td>
-               </tr>
-               <tr>
-                       <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Other:%></strong></td>
-                       <td id="lb_otr_cur">0</td>
-
-                       <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-                       <td id="lb_otr_avg">0</td>
-
-                       <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-                       <td id="lb_otr_peak">0</td>
-               </tr>
-       </table>
+       <div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+               <div class="tr">
+                       <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:UDP:%></strong></div>
+                       <div class="td" id="lb_udp_cur">0</div>
+
+                       <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+                       <div class="td" id="lb_udp_avg">0</div>
+
+                       <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+                       <div class="td" id="lb_udp_peak">0</div>
+               </div>
+               <div class="tr">
+                       <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:TCP:%></strong></div>
+                       <div class="td" id="lb_tcp_cur">0</div>
+
+                       <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+                       <div class="td" id="lb_tcp_avg">0</div>
+
+                       <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+                       <div class="td" id="lb_tcp_peak">0</div>
+               </div>
+               <div class="tr">
+                       <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Other:%></strong></div>
+                       <div class="td" id="lb_otr_cur">0</div>
+
+                       <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+                       <div class="td" id="lb_otr_avg">0</div>
+
+                       <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+                       <div class="td" id="lb_otr_peak">0</div>
+               </div>
+       </div>
        <br />
 
        <div class="cbi-section-node">
-               <table class="cbi-section-table" id="connections">
-                       <tr class="cbi-section-table-titles">
-                               <th class="cbi-section-table-cell"><%:Network%></th>
-                               <th class="cbi-section-table-cell"><%:Protocol%></th>
-                               <th class="cbi-section-table-cell"><%:Source%></th>
-                               <th class="cbi-section-table-cell"><%:Destination%></th>
-                               <th class="cbi-section-table-cell"><%:Transfer%></th>
-                       </tr>
-
-                       <tr><td colspan="5"><em><%:Collecting data...%></em></td></tr>
-               </table>
+               <div class="table cbi-section-table" id="connections">
+                       <div class="tr cbi-section-table-titles">
+                               <div class="th cbi-section-table-cell"><%:Network%></div>
+                               <div class="th cbi-section-table-cell"><%:Protocol%></div>
+                               <div class="th cbi-section-table-cell"><%:Source%></div>
+                               <div class="th cbi-section-table-cell"><%:Destination%></div>
+                               <div class="th cbi-section-table-cell"><%:Transfer%></div>
+                       </div>
+
+                       <div class="tr"><div class="td" colspan="5"><em><%:Collecting data...%></em></div></div>
+               </div>
        </div>
 </fieldset>
 
index 5e6e494ad6e3cd03752ab76793bc7c189cdf385c..9aee30b5f9968ed536cf059dac5776fa45a7426f 100644 (file)
@@ -6,6 +6,7 @@
 
 <%
        local fs = require "nixio.fs"
+       local ipc = require "luci.ip"
        local util = require "luci.util"
        local stat = require "luci.tools.status"
        local ver = require "luci.version"
                        swap       = swapinfo,
                        connmax    = conn_max,
                        conncount  = conn_count,
-                       leases     = stat.dhcp_leases(),
-                       leases6    = stat.dhcp6_leases(),
                        wifinets   = stat.wifi_networks()
                }
 
                if wan then
+                       local dev = wan:get_interface()
+                       local link = dev and ipc.link(dev:name())
                        rv.wan = {
                                ipaddr  = wan:ipaddr(),
                                gwaddr  = wan:gwaddr(),
                                expires = wan:expires(),
                                uptime  = wan:uptime(),
                                proto   = wan:proto(),
+                               i18n    = wan:get_i18n(),
                                ifname  = wan:ifname(),
-                               link    = wan:adminlink()
+                               link    = wan:adminlink(),
+                               mac     = dev and dev:mac(),
+                               type    = dev and dev:type(),
+                               name    = dev and dev:get_i18n(),
+                               ether   = link and link.type == 1
                        }
                end
 
                if wan6 then
+                       local dev = wan6:get_interface()
+                       local link = dev and ipc.link(dev:name())
                        rv.wan6 = {
                                ip6addr   = wan6:ip6addr(),
                                gw6addr   = wan6:gw6addr(),
                                ip6prefix = wan6:ip6prefix(),
                                uptime    = wan6:uptime(),
                                proto     = wan6:proto(),
+                               i18n      = wan6:get_i18n(),
                                ifname    = wan6:ifname(),
-                               link      = wan6:adminlink()
+                               link      = wan6:adminlink(),
+                               mac       = dev and dev:mac(),
+                               type      = dev and dev:type(),
+                               name      = dev and dev:get_i18n(),
+                               ether     = link and link.type == 1
                        }
                end
 
                luci.http.prepare_content("application/json")
                luci.http.write_json(rv)
 
-               return
-       elseif luci.http.formvalue("hosts") == "1" then
-               luci.http.prepare_content("application/json")
-               luci.http.write_json(luci.sys.net.host_hints())
-
                return
        end
 -%>
                var pc = Math.floor((100 / mn) * vn);
 
                return String.format(
-                       '<div style="width:200px; position:relative; border:1px solid #999999">' +
+                       '<div style="width:100%%; max-width:200px; position:relative; border:1px solid #999999">' +
                                '<div style="background-color:#CCCCCC; width:%d%%; height:15px">' +
                                        '<div style="position:absolute; left:0; top:0; text-align:center; width:100%%; color:#000000">' +
                                                '<small>%s / %s (%d%%)</small>' +
                );
        }
 
-       function wifirate(bss, rx) {
-               var p = rx ? 'rx_' : 'tx_',
-                   s = '%.1f <%:Mbit/s%>, %d<%:MHz%>'
-                                       .format(bss[p+'rate'] / 1000, bss[p+'mhz']),
-                   ht = bss[p+'ht'], vht = bss[p+'vht'],
-                       mhz = bss[p+'mhz'], nss = bss[p+'nss'],
-                       mcs = bss[p+'mcs'], sgi = bss[p+'short_gi'];
-
-               if (ht || vht) {
-                       if (vht) s += ', VHT-MCS %d'.format(mcs);
-                       if (nss) s += ', VHT-NSS %d'.format(nss);
-                       if (ht)  s += ', MCS %s'.format(mcs);
-                       if (sgi) s += ', <%:Short GI%>';
-               }
+       function labelList(items, offset) {
+               var rv = [ ];
 
-               return s;
-       }
+               for (var i = offset || 0; i < items.length; i += 2) {
+                       var label = items[i],
+                           value = items[i+1];
+
+                       if (value === undefined || value === null)
+                               continue;
 
-       function duid2mac(duid) {
-               // DUID-LLT / Ethernet
-               if (duid.length === 28 && duid.substr(0, 8) === '00010001')
-                       return duid.substr(16).replace(/(..)(?=..)/g, '$1:').toUpperCase();
+                       if (label)
+                               rv.push(E('strong', [label, ': ']));
 
-               // DUID-LL / Ethernet
-               if (duid.length === 20 && duid.substr(0, 8) === '00030001')
-                       return duid.substr(8).replace(/(..)(?=..)/g, '$1:').toUpperCase();
+                       rv.push(value, E('br'));
+               }
 
-               return null;
+               return rv;
        }
 
-       var npoll = 1;
-       var hosts = <%=luci.http.write_json(luci.sys.net.host_hints())%>;
+       function renderBox(title, active, childs) {
+               childs = childs || [];
+               childs.unshift(E('span', labelList(arguments, 3)));
 
-       function updateHosts() {
-               XHR.get('<%=REQUEST_URI%>', { hosts: 1 }, function(x, data) {
-                       hosts = data;
-               });
+               return E('div', { class: 'ifacebox' }, [
+                       E('div', { class: 'ifacebox-head center ' + (active ? 'active' : '') },
+                               E('strong', title)),
+                       E('div', { class: 'ifacebox-body left' }, childs)
+               ]);
+       }
+
+       function renderBadge(icon, title) {
+               return E('span', { class: 'ifacebadge' }, [
+                       E('img', { src: icon, title: title || '' }),
+                       E('span', labelList(arguments, 2))
+               ]);
        }
 
        XHR.poll(5, '<%=REQUEST_URI%>', { status: 1 },
                function(x, info)
                {
-                       if (!(npoll++ % 5))
-                               updateHosts();
-
-                       var si = document.getElementById('wan4_i');
-                       var ss = document.getElementById('wan4_s');
-                       var ifc = info.wan;
-
-                       if (ifc && ifc.ifname && ifc.proto != 'none')
-                       {
-                               var s = String.format(
-                                       '<strong><%:Type%>: </strong>%s<br />' +
-                                       '<strong><%:Address%>: </strong>%s<br />' +
-                                       '<strong><%:Netmask%>: </strong>%s<br />' +
-                                       '<strong><%:Gateway%>: </strong>%s<br />',
-                                               ifc.proto,
-                                               (ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0',
-                                               (ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255',
-                                               (ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0'
-                               );
-
-                               for (var i = 0; i < ifc.dns.length; i++)
-                               {
-                                       s += String.format(
-                                               '<strong><%:DNS%> %d: </strong>%s<br />',
-                                               i + 1, ifc.dns[i]
-                                       );
-                               }
-
-                               if (ifc.expires > -1)
-                               {
-                                       s += String.format(
-                                               '<strong><%:Expires%>: </strong>%t<br />',
-                                               ifc.expires
-                                       );
-                               }
-
-                               if (ifc.uptime > 0)
-                               {
-                                       s += String.format(
-                                               '<strong><%:Connected%>: </strong>%t<br />',
-                                               ifc.uptime
-                                       );
-                               }
-
-                               ss.innerHTML = String.format('<small>%s</small>', s);
-                               si.innerHTML = String.format(
-                                       '<img src="<%=resource%>/icons/ethernet.png" />' +
-                                       '<br /><small><a href="%s">%s</a></small>',
-                                               ifc.link, ifc.ifname
-                               );
-                       }
-                       else
-                       {
-                               si.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
-                               ss.innerHTML = '<em><%:Not connected%></em>';
-                       }
+                       var us = document.getElementById('upstream_status_table');
+
+                       while (us.lastElementChild)
+                               us.removeChild(us.lastElementChild);
+
+                       var ifc = info.wan || {};
+
+                       us.appendChild(renderBox(
+                               '<%:IPv4 Upstream%>',
+                               (ifc.ifname && ifc.proto != 'none'),
+                               [ E('div', {}, renderBadge(
+                                       '<%=resource%>/icons/%s.png'.format((ifc && ifc.type) ? ifc.type : 'ethernet_disabled'), null,
+                                       '<%:Device%>', ifc ? (ifc.name || ifc.ifname || '-') : '-',
+                                       '<%:MAC-Address%>', (ifc && ifc.ether) ? ifc.mac : null)) ],
+                               '<%:Protocol%>', ifc.i18n || E('em', '<%:Not connected%>'),
+                               '<%:Address%>', (ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0',
+                               '<%:Netmask%>', (ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255',
+                               '<%:Gateway%>', (ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0',
+                               '<%:DNS%> 1', (ifc.dns) ? ifc.dns[0] : null,
+                               '<%:DNS%> 2', (ifc.dns) ? ifc.dns[1] : null,
+                               '<%:DNS%> 3', (ifc.dns) ? ifc.dns[2] : null,
+                               '<%:DNS%> 4', (ifc.dns) ? ifc.dns[3] : null,
+                               '<%:DNS%> 5', (ifc.dns) ? ifc.dns[4] : null,
+                               '<%:Expires%>', (ifc.expires > -1) ? '%t'.format(ifc.expires) : null,
+                               '<%:Connected%>', (ifc.uptime > 0) ? '%t'.format(ifc.uptime) : null));
 
                        <% if has_ipv6 then %>
-                       var si6 = document.getElementById('wan6_i');
-                       var ss6 = document.getElementById('wan6_s');
-                       var ifc6 = info.wan6;
-
-                       if (ifc6 && ifc6.ifname && ifc6.proto != 'none')
-                       {
-                               var s = String.format(
-                                       '<strong><%:Type%>: </strong>%s%s<br />',
-                                               ifc6.proto, (ifc6.ip6prefix) ? '-pd' : ''
-                               );
-                               
-                               if (!ifc6.ip6prefix)
-                               {
-                                       s += String.format(
-                                               '<strong><%:Address%>: </strong>%s<br />',
-                                               (ifc6.ip6addr) ? ifc6.ip6addr : '::'
-                                       );
-                               }
-                               else
-                               {
-                                       s += String.format(
-                                               '<strong><%:Prefix Delegated%>: </strong>%s<br />',
-                                               ifc6.ip6prefix
-                                       );
-                                       if (ifc6.ip6addr)
-                                       {
-                                               s += String.format(
-                                                       '<strong><%:Address%>: </strong>%s<br />',
-                                                       ifc6.ip6addr
-                                               );
-                                       }
-                               }
-
-                               s += String.format(
-                                       '<strong><%:Gateway%>: </strong>%s<br />',
-                                               (ifc6.gw6addr) ? ifc6.gw6addr : '::'
-                               );
-
-                               for (var i = 0; i < ifc6.dns.length; i++)
-                               {
-                                       s += String.format(
-                                               '<strong><%:DNS%> %d: </strong>%s<br />',
-                                               i + 1, ifc6.dns[i]
-                                       );
-                               }
-
-                               if (ifc6.uptime > 0)
-                               {
-                                       s += String.format(
-                                               '<strong><%:Connected%>: </strong>%t<br />',
-                                               ifc6.uptime
-                                       );
-                               }
-
-                               ss6.innerHTML = String.format('<small>%s</small>', s);
-                               si6.innerHTML = String.format(
-                                       '<img src="<%=resource%>/icons/ethernet.png" />' +
-                                       '<br /><small><a href="%s">%s</a></small>',
-                                               ifc6.link, ifc6.ifname
-                               );
-                       }
-                       else
-                       {
-                               si6.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
-                               ss6.innerHTML = '<em><%:Not connected%></em>';
-                       }
+                       var ifc6 = info.wan6 || {};
+
+                       us.appendChild(renderBox(
+                               '<%:IPv6 Upstream%>',
+                               (ifc6.ifname && ifc6.proto != 'none'),
+                               [ E('div', {}, renderBadge(
+                                       '<%=resource%>/icons/%s.png'.format(ifc6.type || 'ethernet_disabled'), null,
+                                       '<%:Device%>', ifc6 ? (ifc6.name || ifc6.ifname || '-') : '-',
+                                       '<%:MAC-Address%>', (ifc6 && ifc6.ether) ? ifc6.mac : null)) ],
+                               '<%:Protocol%>', ifc6.i18n ? (ifc6.i18n + (ifc6.proto === 'dhcp' && ifc6.ip6prefix ? '-PD' : '')) : E('em', '<%:Not connected%>'),
+                               '<%:Prefix Delegated%>', ifc6.ip6prefix,
+                               '<%:Address%>', (ifc6.ip6prefix) ? (ifc6.ip6addr || null) : (ifc6.ipaddr || '::'),
+                               '<%:Gateway%>', (ifc6.gw6addr) ? ifc6.gw6addr : '::',
+                               '<%:DNS%> 1', (ifc6.dns) ? ifc6.dns[0] : null,
+                               '<%:DNS%> 2', (ifc6.dns) ? ifc6.dns[1] : null,
+                               '<%:DNS%> 3', (ifc6.dns) ? ifc6.dns[2] : null,
+                               '<%:DNS%> 4', (ifc6.dns) ? ifc6.dns[3] : null,
+                               '<%:DNS%> 5', (ifc6.dns) ? ifc6.dns[4] : null,
+                               '<%:Connected%>', (ifc6.uptime > 0) ? '%t'.format(ifc6.uptime) : null));
                        <% end %>
 
                        <% if has_dsl then %>
                                );
                        <% end %>
 
-                       <% if has_dhcp then %>
-                       var ls = document.getElementById('lease_status_table');
-                       if (ls)
-                       {
-                               /* clear all rows */
-                               while( ls.rows.length > 1 )
-                                       ls.rows[0].parentNode.deleteRow(1);
-
-                               for( var i = 0; i < info.leases.length; i++ )
-                               {
-                                       var timestr;
-
-                                       if (info.leases[i].expires === false)
-                                               timestr = '<em><%:unlimited%></em>';
-                                       else if (info.leases[i].expires <= 0)
-                                               timestr = '<em><%:expired%></em>';
-                                       else
-                                               timestr = String.format('%t', info.leases[i].expires);
-
-                                       var tr = ls.rows[0].parentNode.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                       tr.insertCell(-1).innerHTML = info.leases[i].hostname ? info.leases[i].hostname : '?';
-                                       tr.insertCell(-1).innerHTML = info.leases[i].ipaddr;
-                                       tr.insertCell(-1).innerHTML = info.leases[i].macaddr;
-                                       tr.insertCell(-1).innerHTML = timestr;
-                               }
-
-                               if( ls.rows.length == 1 )
-                               {
-                                       var tr = ls.rows[0].parentNode.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 4;
-                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
-                               }
-                       }
-
-                       var ls6 = document.getElementById('lease6_status_table');
-                       if (ls6 && info.leases6)
-                       {
-                               ls6.parentNode.style.display = 'block';
-
-                               /* clear all rows */
-                               while( ls6.rows.length > 1 )
-                                       ls6.rows[0].parentNode.deleteRow(1);
-
-                               for( var i = 0; i < info.leases6.length; i++ )
-                               {
-                                       var timestr;
-
-                                       if (info.leases6[i].expires === false)
-                                               timestr = '<em><%:unlimited%></em>';
-                                       else if (info.leases6[i].expires <= 0)
-                                               timestr = '<em><%:expired%></em>';
-                                       else
-                                               timestr = String.format('%t', info.leases6[i].expires);
-
-                                       var tr = ls6.rows[0].parentNode.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                       var host = hosts[duid2mac(info.leases6[i].duid)];
-                                       if (!info.leases6[i].hostname)
-                                               tr.insertCell(-1).innerHTML =
-                                                       (host && (host.name || host.ipv4 || host.ipv6))
-                                                               ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">? (%h)</div>'.format(host.name || host.ipv4 || host.ipv6)
-                                                               : '?';
-                                       else
-                                               tr.insertCell(-1).innerHTML =
-                                                       (host && host.name && info.leases6[i].hostname != host.name)
-                                                               ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">%h (%h)</div>'.format(info.leases6[i].hostname, host.name)
-                                                               : info.leases6[i].hostname;
-
-                                       tr.insertCell(-1).innerHTML = info.leases6[i].ip6addr;
-                                       tr.insertCell(-1).innerHTML = info.leases6[i].duid;
-                                       tr.insertCell(-1).innerHTML = timestr;
-                               }
-
-                               if( ls6.rows.length == 1 )
-                               {
-                                       var tr = ls6.rows[0].parentNode.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 4;
-                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
-                               }
-                       }
-                       <% end %>
-
                        <% if has_wifi then %>
-                       var assoclist = [ ];
-
                        var ws = document.getElementById('wifi_status_table');
                        if (ws)
                        {
-                               var wsbody = ws.rows[0].parentNode;
-                               while (ws.rows.length > 0)
-                                       wsbody.deleteRow(0);
+                               while (ws.lastElementChild)
+                                       ws.removeChild(ws.lastElementChild);
 
                                for (var didx = 0; didx < info.wifinets.length; didx++)
                                {
                                        var dev = info.wifinets[didx];
-
-                                       var tr = wsbody.insertRow(-1);
-                                       var td;
-
-                                       td = tr.insertCell(-1);
-                                       td.width     = "33%";
-                                       td.innerHTML = dev.name;
-                                       td.style.verticalAlign = "top";
-
-                                       td = tr.insertCell(-1);
-
-                                       var s = '';
+                                       var net0 = (dev.networks && dev.networks[0]) ? dev.networks[0] : {};
+                                       var vifs = [];
 
                                        for (var nidx = 0; nidx < dev.networks.length; nidx++)
                                        {
                                                else
                                                        icon = "<%=resource%>/icons/signal-75-100.png";
 
-                                               s += String.format(
-                                                       '<table><tr><td style="text-align:center; width:32px; padding:3px">' +
-                                                               '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />' +
-                                                               '<br /><small>%d%%</small>' +
-                                                       '</td><td style="text-align:left; padding:3px"><small>' +
-                                                               '<strong><%:SSID%>:</strong> <a href="%s">%h</a><br />' +
-                                                               '<strong><%:Mode%>:</strong> %s<br />' +
-                                                               '<strong><%:Channel%>:</strong> %d (%.3f <%:GHz%>)<br />' +
-                                                               '<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%><br />',
-                                                               icon, net.signal, net.noise,
-                                                               net.quality,
-                                                               net.link, net.ssid || '?',
-                                                               net.mode,
-                                                               net.channel, net.frequency,
-                                                               net.bitrate || '?'
-                                               );
-
-                                               if (is_assoc)
-                                               {
-                                                       s += String.format(
-                                                               '<strong><%:BSSID%>:</strong> %s<br />' +
-                                                               '<strong><%:Encryption%>:</strong> %s',
-                                                                       net.bssid || '?',
-                                                                       net.encryption
-                                                       );
-                                               }
-                                               else
-                                               {
-                                                       s += '<em><%:Wireless is disabled or not associated%></em>';
-                                               }
-
-                                               s += '</small></td></tr></table>';
-
-                                               for (var bssid in net.assoclist)
-                                               {
-                                                       var bss = net.assoclist[bssid];
-
-                                                       bss.bssid  = bssid;
-                                                       bss.link   = net.link;
-                                                       bss.name   = net.name;
-                                                       bss.ifname = net.ifname;
-                                                       bss.radio  = dev.name;
-
-                                                       assoclist.push(bss);
-                                               }
+                                               vifs.push(renderBadge(
+                                                       icon,
+                                                       '<%:Signal%>: %d dBm / <%:Quality%>: %d%%'.format(net.signal, net.quality),
+                                                       '<%:SSID%>', E('a', { href: net.link }, [ net.ssid || '?' ]),
+                                                       '<%:Mode%>', net.mode,
+                                                       '<%:BSSID%>', is_assoc ? (net.bssid || '-') : null,
+                                                       '<%:Encryption%>', is_assoc ? net.encryption : null,
+                                                       '<%:Associations%>', is_assoc ? (net.num_assoc || '-') : null,
+                                                       null, is_assoc ? null : E('em', '<%:Wireless is disabled or not associated%>')));
                                        }
 
-                                       if (!s)
-                                               s = '<em><%:No information available%></em>';
-
-                                       td.innerHTML = s;
-                               }
-                       }
-
-                       var ac = document.getElementById('wifi_assoc_table');
-                       if (ac)
-                       {
-                               /* clear all rows */
-                               while( ac.rows.length > 1 )
-                                       ac.rows[0].parentNode.deleteRow(1);
-
-                               assoclist.sort(function(a, b) {
-                                       return (a.name == b.name)
-                                               ? (a.bssid < b.bssid)
-                                               : (a.name  > b.name )
-                                       ;
-                               });
-
-                               for( var i = 0; i < assoclist.length; i++ )
-                               {
-                                       var tr = ac.rows[0].parentNode.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2));
-
-                                       var icon;
-                                       var q = (-1 * (assoclist[i].noise - assoclist[i].signal)) / 5;
-                                       if (q < 1)
-                                               icon = "<%=resource%>/icons/signal-0.png";
-                                       else if (q < 2)
-                                               icon = "<%=resource%>/icons/signal-0-25.png";
-                                       else if (q < 3)
-                                               icon = "<%=resource%>/icons/signal-25-50.png";
-                                       else if (q < 4)
-                                               icon = "<%=resource%>/icons/signal-50-75.png";
-                                       else
-                                               icon = "<%=resource%>/icons/signal-75-100.png";
-
-                                       tr.insertCell(-1).innerHTML = String.format(
-                                               '<span class="ifacebadge" title="%q"><img src="<%=resource%>/icons/wifi.png" /> %h</span>',
-                                               assoclist[i].radio, assoclist[i].ifname
-                                       );
-
-                                       tr.insertCell(-1).innerHTML = String.format(
-                                               '<a href="%s">%s</a>',
-                                                       assoclist[i].link,
-                                                       '%h'.format(assoclist[i].name).nobr()
-                                       );
-
-                                       tr.insertCell(-1).innerHTML = assoclist[i].bssid;
-
-                                       var host = hosts[assoclist[i].bssid];
-                                       if (host)
-                                               tr.insertCell(-1).innerHTML = String.format(
-                                                       '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis">%s</div>',
-                                                       ((host.name && (host.ipv4 || host.ipv6))
-                                                               ? '%h (%s)'.format(host.name, host.ipv4 || host.ipv6)
-                                                               : '%h'.format(host.name || host.ipv4 || host.ipv6)).nobr()
-                                               );
-                                       else
-                                               tr.insertCell(-1).innerHTML = '?';
-
-                                       tr.insertCell(-1).innerHTML = String.format(
-                                               '<span class="ifacebadge" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%> / <%:SNR%>: %d"><img src="%s" /> %d / %d <%:dBm%></span>',
-                                               assoclist[i].signal, assoclist[i].noise, assoclist[i].signal - assoclist[i].noise,
-                                               icon,
-                                               assoclist[i].signal, assoclist[i].noise
-                                       );
-
-                                       tr.insertCell(-1).innerHTML = wifirate(assoclist[i], true).nobr() + '<br />' + wifirate(assoclist[i], false).nobr();
+                                       ws.appendChild(renderBox(
+                                               dev.device, dev.up || net0.up,
+                                               [ E('div', vifs) ],
+                                               '<%:Type%>', dev.name.replace(/^Generic | Wireless Controller .+$/g, ''),
+                                               '<%:Channel%>', net0.channel ? '%d (%.3f <%:GHz%>)'.format(net0.channel, net0.frequency) : '-',
+                                               '<%:Bitrate%>', net0.bitrate ? '%d <%:Mbit/s%>'.format(net0.bitrate) : '-'));
                                }
 
-                               if (ac.rows.length == 1)
-                               {
-                                       var tr = ac.rows[0].parentNode.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 7;
-                                               td.innerHTML = '<br /><em><%:No information available%></em>';
-                               }
+                               if (!ws.lastElementChild)
+                                       ws.appendChild(E('<em><%:No information available%></em>'));
                        }
                        <% end %>
 
 
 <h2 name="content"><%:Status%></h2>
 
-<fieldset class="cbi-section">
-       <legend><%:System%></legend>
+<div class="cbi-section">
+       <h3><%:System%></h3>
 
-       <table width="100%" cellspacing="10">
-               <tr><td width="33%"><%:Hostname%></td><td><%=luci.sys.hostname() or "?"%></td></tr>
-               <tr><td width="33%"><%:Model%></td><td><%=pcdata(boardinfo.model or boardinfo.system or "?")%></td></tr>
-               <tr><td width="33%"><%:Firmware Version%></td><td>
+       <div class="table" width="100%">
+               <div class="tr"><div class="td left" width="33%"><%:Hostname%></div><div class="td left"><%=luci.sys.hostname() or "?"%></div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Model%></div><div class="td left"><%=pcdata(boardinfo.model or "?")%></div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Architecture%></div><div class="td left"><%=pcdata(boardinfo.system or "?")%></div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Firmware Version%></div><div class="td left">
                        <%=pcdata(ver.distname)%> <%=pcdata(ver.distversion)%> /
                        <%=pcdata(ver.luciname)%> (<%=pcdata(ver.luciversion)%>)
-               </td></tr>
-               <tr><td width="33%"><%:Kernel Version%></td><td><%=unameinfo.release or "?"%></td></tr>
-               <tr><td width="33%"><%:Local Time%></td><td id="localtime">-</td></tr>
-               <tr><td width="33%"><%:Uptime%></td><td id="uptime">-</td></tr>
-               <tr><td width="33%"><%:Load Average%></td><td id="loadavg">-</td></tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section">
-       <legend><%:Memory%></legend>
-
-       <table width="100%" cellspacing="10">
-               <tr><td width="33%"><%:Total Available%></td><td id="memtotal">-</td></tr>
-               <tr><td width="33%"><%:Free%></td><td id="memfree">-</td></tr>
-               <tr><td width="33%"><%:Buffered%></td><td id="membuff">-</td></tr>
-       </table>
-</fieldset>
+               </div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Kernel Version%></div><div class="td left"><%=unameinfo.release or "?"%></div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Local Time%></div><div class="td left" id="localtime">-</div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Uptime%></div><div class="td left" id="uptime">-</div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Load Average%></div><div class="td left" id="loadavg">-</div></div>
+       </div>
+</div>
+
+<div class="cbi-section">
+       <h3><%:Memory%></h3>
+
+       <div class="table" width="100%">
+               <div class="tr"><div class="td left" width="33%"><%:Total Available%></div><div class="td left" id="memtotal">-</div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Free%></div><div class="td left" id="memfree">-</div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Buffered%></div><div class="td left" id="membuff">-</div></div>
+       </div>
+</div>
 
 <% if swapinfo.total > 0 then %>
-<fieldset class="cbi-section">
-       <legend><%:Swap%></legend>
-
-       <table width="100%" cellspacing="10">
-               <tr><td width="33%"><%:Total Available%></td><td id="swaptotal">-</td></tr>
-               <tr><td width="33%"><%:Free%></td><td id="swapfree">-</td></tr>
-       </table>
-</fieldset>
+<div class="cbi-section">
+       <h3><%:Swap%></h3>
+
+       <div class="table" width="100%">
+               <div class="tr"><div class="td left" width="33%"><%:Total Available%></div><div class="td left" id="swaptotal">-</div></div>
+               <div class="tr"><div class="td left" width="33%"><%:Free%></div><div class="td left" id="swapfree">-</div></div>
+       </div>
+</div>
 <% end %>
 
-<fieldset class="cbi-section">
-       <legend><%:Network%></legend>
-
-       <table width="100%" cellspacing="10">
-               <tr><td width="33%" style="vertical-align:top"><%:IPv4 WAN Status%></td><td>
-                       <table><tr>
-                               <td id="wan4_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td>
-                               <td id="wan4_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td>
-                       </tr></table>
-               </td></tr>
-               <% if has_ipv6 then %>
-               <tr><td width="33%" style="vertical-align:top"><%:IPv6 WAN Status%></td><td>
-                       <table><tr>
-                               <td id="wan6_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td>
-                               <td id="wan6_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td>
-                       </tr></table>
-               </td></tr>
-               <% end %>
-               <tr><td width="33%"><%:Active Connections%></td><td id="conns">-</td></tr>
-       </table>
-</fieldset>
-
-<% if has_dhcp then %>
-<fieldset class="cbi-section">
-       <legend><%:DHCP Leases%></legend>
-
-       <table class="cbi-section-table" id="lease_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Hostname%></th>
-                       <th class="cbi-section-table-cell"><%:IPv4-Address%></th>
-                       <th class="cbi-section-table-cell"><%:MAC-Address%></th>
-                       <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="4"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section" style="display:none">
-       <legend><%:DHCPv6 Leases%></legend>
-
-       <table class="cbi-section-table" id="lease6_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Host%></th>
-                       <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
-                       <th class="cbi-section-table-cell"><%:DUID%></th>
-                       <th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="4"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-<% end %>
+<div class="cbi-section">
+       <h3><%:Network%></h3>
+
+       <div id="upstream_status_table" class="network-status-table">
+               <em><%:Collecting data...%></em>
+       </div>
+
+       <div class="table" width="100%">
+               <div class="tr"><div class="td left" width="33%"><%:Active Connections%></div><div class="td left" id="conns">-</div></div>
+       </div>
+</div>
+
+<%
+       if has_dhcp then
+               include("admin_network/lease_status")
+       end
+%>
 
 <% if has_dsl then %>
-<fieldset class="cbi-section">
-       <legend><%:DSL%></legend>
-       <table width="100%" cellspacing="10">
-               <tr><td width="33%" style="vertical-align:top"><%:DSL Status%></td><td>
-                       <table><tr>
-                               <td id="dsl_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td>
-                               <td id="dsl_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td>
-                       </tr></table>
-               </td></tr>
-       </table>
-</fieldset>
+<div class="cbi-section">
+       <h3><%:DSL%></h3>
+
+       <div class="table" width="100%">
+               <div class="tr">
+                       <div class="td left" width="33%" style="vertical-align:top"><%:DSL Status%></div>
+                       <div class="td">
+                               <div class="table">
+                                       <div class="tr">
+                                               <div class="td" id="dsl_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></div>
+                                               <div class="td left" id="dsl_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></div>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </div>
+</div>
 <% end %>
 
 <% if has_wifi then %>
-<fieldset class="cbi-section">
-       <legend><%:Wireless%></legend>
-
-       <table id="wifi_status_table" width="100%" cellspacing="10">
-               <tr><td><em><%:Collecting data...%></em></td></tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section">
-       <legend><%:Associated Stations%></legend>
-
-       <table class="cbi-section-table valign-middle" id="wifi_assoc_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell">&#160;</th>
-                       <th class="cbi-section-table-cell"><%:Network%></th>
-                       <th class="cbi-section-table-cell"><%:MAC-Address%></th>
-                       <th class="cbi-section-table-cell"><%:Host%></th>
-                       <th class="cbi-section-table-cell"><%:Signal%> / <%:Noise%></th>
-                       <th class="cbi-section-table-cell"><%:RX Rate%> / <%:TX Rate%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="6"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
+<div class="cbi-section">
+       <h3><%:Wireless%></h3>
+
+       <div id="wifi_status_table" class="network-status-table">
+               <em><%:Collecting data...%></em>
+       </div>
+</div>
+
+<div class="cbi-section">
+       <h3><%:Associated Stations%></h3>
+
+       <%+admin_network/wifi_assoclist%>
+</div>
 <% end %>
 
 <%-
index 3f4b83b80b8f4c717d2752fee9060d41cedd8d7f..5d544ca60b1cee25c24768deb98f107aeb55e40d 100644 (file)
@@ -62,6 +62,7 @@
 
 <%+header%>
 
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 <style type="text/css">
        span:target {
                color: blue;
@@ -70,7 +71,6 @@
 </style>
 
 <h2 name="content"><%:Firewall Status%></h2>
-<br />
 
 <% if has_ip6tables then %>
 <ul class="cbi-tabmenu">
                <input type="submit" class="cbi-button" name="restart" value="<%:Restart Firewall%>" />
        </form>
 
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
 
                <% for _, tbl in ipairs(tables) do chaincnt = 0 %>
                        <h3><%:Table%>: <%=tbl%></h3>
-                       <table class="cbi-section-table" style="font-size:90%">
-                               <% for _, chain in ipairs(ipt:chains(tbl)) do
-                                       rowcnt    = 0
-                                       chaincnt  = chaincnt + 1
-                                       chaininfo = ipt:chain(tbl, chain)
-                               %>
-                                       <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                               <th class="cbi-section-table-cell" style="text-align:left" colspan="11">
-                                                       <br /><span id="rule_<%=tbl:lower()%>_<%=chain%>">
-                                                       <%:Chain%> <em><%=chain%></em>
-                                                       (<%- if chaininfo.policy then -%>
-                                                               <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
-                                                       <%- else -%>
-                                                               <%:References%>: <%=chaininfo.references-%>
-                                                       <%- end -%>)</span>
-                                               </th>
-                                       </tr>
-                                       <tr class="cbi-section-table-descr">
-                                               <th class="cbi-section-table-cell"><%:Pkts.%></th>
-                                               <th class="cbi-section-table-cell"><%:Traffic%></th>
-                                               <th class="cbi-section-table-cell"><%:Target%></th>
-                                               <th class="cbi-section-table-cell"><%:Prot.%></th>
-                                               <th class="cbi-section-table-cell"><%:In%></th>
-                                               <th class="cbi-section-table-cell"><%:Out%></th>
-                                               <th class="cbi-section-table-cell"><%:Source%></th>
-                                               <th class="cbi-section-table-cell"><%:Destination%></th>
-                                               <th class="cbi-section-table-cell" style="width:30%"><%:Options%></th>
-                                       </tr>
-
-                                       <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
-                                               <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
-                                                       <td><%=rule.packets%></td>
-                                                       <td style="white-space: nowrap"><%=wba.byte_format(rule.bytes)%></td>
-                                                       <td><%=rule.target and link_target(tbl, rule.target) or "-"%></td>
-                                                       <td><%=rule.protocol%></td>
-                                                       <td><%=link_iface(rule.inputif)%></td>
-                                                       <td><%=link_iface(rule.outputif)%></td>
-                                                       <td><%=rule.source%></td>
-                                                       <td><%=rule.destination%></td>
-                                                       <td style="width:30%"><small><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></small></td>
-                                               </tr>
-                                       <% end %>
-
-                                       <% if rowcnt == 1 then %>
-                                               <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                                       <td colspan="9"><em><%:No rules in this chain%></em></td>
-                                               </tr>
-                                       <% end %>
-                               <% end %>
-
-                               <% if chaincnt == 0 then %>
-                                       <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                               <td colspan="9"><em><%:No chains in this table%></em></td>
-                                       </tr>
-                               <% end %>
-                       </table>
+
+                       <% for _, chain in ipairs(ipt:chains(tbl)) do
+                               rowcnt    = 0
+                               chaincnt  = chaincnt + 1
+                               chaininfo = ipt:chain(tbl, chain)
+                       %>
+                               <h4  id="rule_<%=tbl:lower()%>_<%=chain%>">
+                                       <%:Chain%> <em><%=chain%></em>
+                                       (<%- if chaininfo.policy then -%>
+                                               <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
+                                       <%- else -%>
+                                               <%:References%>: <%=chaininfo.references-%>
+                                       <%- end -%>)
+                               </h4>
+
+                               <div class="cbi-section-node">
+                                       <div class="table" style="font-size:90%">
+                                               <div class="tr table-titles cbi-rowstyle-<%=rowstyle()%>">
+                                                       <div class="th hide-xs"><%:Pkts.%></div>
+                                                       <div class="th nowrap"><%:Traffic%></div>
+                                                       <div class="th col-5"><%:Target%></div>
+                                                       <div class="th"><%:Prot.%></div>
+                                                       <div class="th"><%:In%></div>
+                                                       <div class="th"><%:Out%></div>
+                                                       <div class="th"><%:Source%></div>
+                                                       <div class="th"><%:Destination%></div>
+                                                       <div class="th col-9 hide-xs"><%:Options%></div>
+                                               </div>
+
+                                               <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
+                                                       <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+                                                               <div class="td"><%=rule.packets%></div>
+                                                               <div class="td nowrap"><%=wba.byte_format(rule.bytes)%></div>
+                                                               <div class="td col-5"><%=rule.target and link_target(tbl, rule.target) or "-"%></div>
+                                                               <div class="td"><%=rule.protocol%></div>
+                                                               <div class="td"><%=link_iface(rule.inputif)%></div>
+                                                               <div class="td"><%=link_iface(rule.outputif)%></div>
+                                                               <div class="td"><%=rule.source%></div>
+                                                               <div class="td"><%=rule.destination%></div>
+                                                               <div class="td col-9 hide-xs"><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></div>
+                                                       </div>
+                                               <% end %>
+
+                                               <% if rowcnt == 1 then %>
+                                                       <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+                                                               <div class="td" colspan="9"><em><%:No rules in this chain%></em></div>
+                                                       </div>
+                                               <% end %>
+                                       </div>
+                               </div>
+                       <% end %>
+
+                       <% if chaincnt == 0 then %>
+                               <em><%:No chains in this table%></em>
+                       <% end %>
+
                        <br /><br />
                <% end %>
-       </fieldset>
+       </div>
 </div>
 
 <%+footer%>
index 97a2f5ed596e636f451cb67785291fea05081f73..dc7d927de80431f2971f6aa2d85d3371fae9c734 100644 (file)
                                                label_15_peak.innerHTML = (data_15_peak / 100).toFixed(2);
                                        }
                                );
+
+                               XHR.run();
                        }
                }, 1000
        );
 <div style="text-align:right"><small id="scale">-</small></div>
 <br />
 
-<table style="width:100%; table-layout:fixed" cellspacing="5">
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff0000; white-space:nowrap"><%:1 Minute Load:%></strong></td>
-               <td id="lb_load01_cur">0</td>
-
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="lb_load01_avg">0</td>
-
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="lb_load01_peak">0</td>
-       </tr>
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff6600; white-space:nowrap"><%:5 Minute Load:%></strong></td>
-               <td id="lb_load05_cur">0</td>
-
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="lb_load05_avg">0</td>
-
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="lb_load05_peak">0</td>
-       </tr>
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ffaa00; white-space:nowrap"><%:15 Minute Load:%></strong></td>
-               <td id="lb_load15_cur">0</td>
-
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="lb_load15_avg">0</td>
-
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="lb_load15_peak">0</td>
-       </tr>
-</table>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff0000; white-space:nowrap"><%:1 Minute Load:%></strong></div>
+               <div class="td" id="lb_load01_cur">0</div>
+
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="lb_load01_avg">0</div>
+
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="lb_load01_peak">0</div>
+       </div>
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ff6600; white-space:nowrap"><%:5 Minute Load:%></strong></div>
+               <div class="td" id="lb_load05_cur">0</div>
+
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="lb_load05_avg">0</div>
+
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="lb_load05_peak">0</div>
+       </div>
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid #ffaa00; white-space:nowrap"><%:15 Minute Load:%></strong></div>
+               <div class="td" id="lb_load15_cur">0</div>
+
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="lb_load15_avg">0</div>
+
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="lb_load15_peak">0</div>
+       </div>
+</div>
 
 <%+footer%>
index f474c71568a112278865c075c4b529988be9ea91..9ed37939fe5be9fcd5096d2faec772c7e381ad11 100644 (file)
 
 <%+header%>
 
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
 <div class="cbi-map" id="cbi-network">
        <h2 name="content"><%:Routes%></h2>
        <div class="cbi-map-descr"><%:The following rules are currently active on this system.%></div>
 
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <legend>ARP</legend>
                <div class="cbi-section-node">
-                       <table class="cbi-section-table">
-                               <tr class="cbi-section-table-titles">
-                                       <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Address%></th>
-                                       <th class="cbi-section-table-cell"><%_<abbr title="Media Access Control">MAC</abbr>-Address%></th>
-                                       <th class="cbi-section-table-cell"><%:Interface%></th>
-                               </tr>
+                       <div class="table">
+                               <div class="tr table-titles">
+                                       <div class="th"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Address%></div>
+                                       <div class="th"><%_<abbr title="Media Access Control">MAC</abbr>-Address%></div>
+                                       <div class="th"><%:Interface%></div>
+                               </div>
 
                                <%
                                        for _, v in ipairs(ip.neighbors({ family = 4 })) do
                                                if v.mac then
                                %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=v.dest%></td>
-                                       <td class="cbi-value-field"><%=v.mac%></td>
-                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
-                               </tr>
+                               <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+                                       <div class="td"><%=v.dest%></div>
+                                       <div class="td"><%=v.mac%></div>
+                                       <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></div>
+                               </div>
                                <%
                                                        style = not style
                                                end
                                        end
                                %>
-                       </table>
+                       </div>
                </div>
-       </fieldset>
-       <br />
+       </div>
 
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <legend><%_Active <abbr title="Internet Protocol Version 4">IPv4</abbr>-Routes%></legend>
-
                <div class="cbi-section-node">
-                       <table class="cbi-section-table">
-                               <tr class="cbi-section-table-titles">
-                                       <th class="cbi-section-table-cell"><%:Network%></th>
-                                       <th class="cbi-section-table-cell"><%:Target%></th>
-                                       <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Gateway%></th>
-                                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                                       <th class="cbi-section-table-cell"><%:Table%></th>
-                               </tr>
+                       <div class="table">
+                               <div class="tr table-titles">
+                                       <div class="th"><%:Network%></div>
+                                       <div class="th"><%:Target%></div>
+                                       <div class="th"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Gateway%></div>
+                                       <div class="th"><%:Metric%></div>
+                                       <div class="th"><%:Table%></div>
+                               </div>
                                <% for _, v in ipairs(ip.routes({ family = 4, type = 1 })) do %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or v.dev%></td>
-                                       <td class="cbi-value-field"><%=v.dest%></td>
-                                       <td class="cbi-value-field"><%=v.gw%></td>
-                                       <td class="cbi-value-field"><%=v.metric or 0%></td>
-                                       <td class="cbi-value-field"><%=rtn[v.table] or v.table%></td>
-                               </tr>
+                               <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+                                       <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or v.dev%></div>
+                                       <div class="td"><%=v.dest%></div>
+                                       <div class="td"><%=v.gw or "-"%></div>
+                                       <div class="td"><%=v.metric or 0%></div>
+                                       <div class="td"><%=rtn[v.table] or v.table%></div>
+                               </div>
                                <% style = not style end %>
-                       </table>
+                       </div>
                </div>
-       </fieldset>
-       <br />
+       </div>
 
        <%
                if nixio.fs.access("/proc/net/ipv6_route") then
                        style = true
        %>
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <legend><%_Active <abbr title="Internet Protocol Version 6">IPv6</abbr>-Routes%></legend>
-
                <div class="cbi-section-node">
-                       <table class="cbi-section-table">
-                               <tr class="cbi-section-table-titles">
-                                       <th class="cbi-section-table-cell"><%:Network%></th>
-                                       <th class="cbi-section-table-cell"><%:Target%></th>
-                                       <th class="cbi-section-table-cell"><%:Source%></th>
-                                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                                       <th class="cbi-section-table-cell"><%:Table%></th>
-                               </tr>
+                       <div class="table">
+                               <div class="tr table-titles">
+                                       <div class="th"><%:Network%></div>
+                                       <div class="th"><%:Target%></div>
+                                       <div class="th"><%:Source%></div>
+                                       <div class="th"><%:Metric%></div>
+                                       <div class="th"><%:Table%></div>
+                               </div>
                                <%
                                        for _, v in ipairs(ip.routes({ family = 6, type = 1 })) do
                                                if v.dest and not v.dest:is6linklocal() then
                                %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
-                                       <td class="cbi-value-field"><%=v.dest%></td>
-                                       <td class="cbi-value-field"><%=v.from%></td>
-                                       <td class="cbi-value-field"><%=v.metric or 0%></td>
-                                       <td class="cbi-value-field"><%=rtn[v.table] or v.table%></td>
-                               </tr>
+                               <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+                                       <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></div>
+                                       <div class="td"><%=v.dest%></div>
+                                       <div class="td"><%=v.from%></div>
+                                       <div class="td"><%=v.metric or 0%></div>
+                                       <div class="td"><%=rtn[v.table] or v.table%></div>
+                               </div>
                                <%
                                                        style = not style
                                                end
                                        end
                                %>
-                       </table>
+                       </div>
                </div>
-       </fieldset>
-       <br />
+       </div>
 
-       <fieldset class="cbi-section">
+       <div class="cbi-section">
                <legend><%:IPv6 Neighbours%></legend>
-
                <div class="cbi-section-node">
-                       <table class="cbi-section-table">
-                               <tr class="cbi-section-table-titles">
-                                       <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
-                                       <th class="cbi-section-table-cell"><%:MAC-Address%></th>
-                                       <th class="cbi-section-table-cell"><%:Interface%></th>
-                               </tr>
+                       <div class="table">
+                               <div class="tr table-titles">
+                                       <div class="th"><%:IPv6-Address%></div>
+                                       <div class="th"><%:MAC-Address%></div>
+                                       <div class="th"><%:Interface%></div>
+                               </div>
                                <%
                                        for _, v in ipairs(ip.neighbors({ family = 6 })) do
                                                if v.dest and not v.dest:is6linklocal() and v.mac then
                                %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=v.dest%></td>
-                                       <td class="cbi-value-field"><%=v.mac%></td>
-                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
-                               </tr>
+                               <div class="tr cbi-rowstyle-<%=(style and 1 or 2)%>">
+                                       <div class="td"><%=v.dest%></div>
+                                       <div class="td"><%=v.mac%></div>
+                                       <div class="td"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></div>
+                               </div>
                                <%
                                                        style = not style
                                                end
                                        end
                                %>
-                       </table>
+                       </div>
                </div>
-       </fieldset>
-       <br />
+       </div>
        <% end %>
 </div>
 
index aa658ff0cbda599eb64c1512078cd6c162b42d07..1806f4a6c8ad6d7cf42c446fb69162d8036a581c 100644 (file)
                                                function wireless_label(dbm, noise)
                                                {
                                                        if (noise)
-                                                               return String.format("%d <%:dBm%> (SNR %d <%:dBm%>)", noise_floor + dbm - 255, dbm - noise);
+                                                               return String.format("%d <%:dBm%> (SNR %d <%:dB%>)", noise_floor + dbm - 255, dbm - noise);
                                                        else
                                                                return String.format("%d <%:dBm%>", noise_floor + dbm - 255);
                                                }
                                                label_rate_peak.innerHTML = rate_label(data_rate_peak);
                                        }
                                );
+
+                               XHR.run();
                        }
                }, 1000
        );
 <div style="text-align:right"><small id="scale">-</small></div>
 <br />
 
-<table style="width:100%; table-layout:fixed" cellspacing="5">
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Signal:%></strong></td>
-               <td id="rssi_bw_cur">0 <%:dBm%></td>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid blue"><%:Signal:%></strong></div>
+               <div class="td" id="rssi_bw_cur">0 <%:dBm%></div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="rssi_bw_avg">0 <%:dBm%></td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="rssi_bw_avg">0 <%:dBm%></div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="rssi_bw_peak">0 <%:dBm%></td>
-       </tr>
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Noise:%></strong></td>
-               <td id="noise_bw_cur">0 <%:dBm%></td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="rssi_bw_peak">0 <%:dBm%></div>
+       </div>
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid red"><%:Noise:%></strong></div>
+               <div class="td" id="noise_bw_cur">0 <%:dBm%></div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="noise_bw_avg">0 <%:dBm%></td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="noise_bw_avg">0 <%:dBm%></div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="noise_bw_peak">0 <%:dBm%></td>
-       </tr>
-</table>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="noise_bw_peak">0 <%:dBm%></div>
+       </div>
+</div>
 
 <br />
 
 <div style="text-align:right"><small id="scale2">-</small></div>
 <br />
 
-<table style="width:100%; table-layout:fixed" cellspacing="5">
-       <tr>
-               <td style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Phy Rate:%></strong></td>
-               <td id="rate_bw_cur">0 MBit/s</td>
+<div class="table" style="width:100%; table-layout:fixed" cellspacing="5">
+       <div class="tr">
+               <div class="td" style="text-align:right; vertical-align:top"><strong style="border-bottom:2px solid green"><%:Phy Rate:%></strong></div>
+               <div class="td" id="rate_bw_cur">0 MBit/s</div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
-               <td id="rate_bw_avg">0 MBit/s</td>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></div>
+               <div class="td" id="rate_bw_avg">0 MBit/s</div>
 
-               <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
-               <td id="rate_bw_peak">0 MBit/s</td>
-       </tr>
-</table>
+               <div class="td" style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></div>
+               <div class="td" id="rate_bw_peak">0 MBit/s</div>
+       </div>
+</div>
 
 <%+footer%>
index b32ef782637400f56db34e4c6fdf5f49dedfd27c..9eec0125474e9569ac89b629da9466bf5091bb29 100644 (file)
        <li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/backupfiles"><%:Configuration%></a></li>
 </ul>
 
-<fieldset class="cbi-section">
-
-       <fieldset class="cbi-section">
-               <legend><%:Backup / Restore%></legend>
-               <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
-               <div class="cbi-section-node">
-                       <form class="inline" method="post" action="<%=url('admin/system/flashops/backup')%>">
-                               <input type="hidden" name="token" value="<%=token%>" />
-                               <div class="cbi-value<% if not reset_avail then %> cbi-value-last<% end %>">
-                                       <label class="cbi-value-title" for="image"><%:Download backup%>:</label>
-                                       <div class="cbi-value-field">
-                                               <input class="cbi-button cbi-button-apply" type="submit" name="backup" value="<%:Generate archive%>" />
-                                       </div>
-                               </div>
-                       </form>
-                       <% if reset_avail then %>
-                       <form class="inline" method="post" action="<%=url('admin/system/flashops/reset')%>">
-                               <input type="hidden" name="token" value="<%=token%>" />
-                               <div class="cbi-value cbi-value-last">
-                                       <label class="cbi-value-title"><%:Reset to defaults%>:</label>
-                                       <div class="cbi-value-field">
-                                               <input onclick="return confirm('<%:Really reset all changes?%>')" class="cbi-button cbi-button-reset" type="submit" name="reset" value="<%:Perform reset%>" />
-                                       </div>
-                               </div>
-                       </form>
-                       <% end %>
-               </div>
-               <br />
-               <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
-               <div class="cbi-section-node">
-                       <form class="inline" method="post" action="<%=url('admin/system/flashops/restore')%>" enctype="multipart/form-data">
-                               <div class="cbi-value cbi-value-last">
-                                       <label class="cbi-value-title" for="archive"><%:Restore backup%>:</label>
-                                       <div class="cbi-value-field">
-                                               <input type="hidden" name="token" value="<%=token%>" />
-                                               <input type="file" name="archive" id="archive" />
-                                               <input type="submit" class="cbi-button cbi-input-apply" name="restore" value="<%:Upload archive...%>" />
-                                       </div>
+<div class="cbi-section">
+       <legend><%:Backup / Restore%></legend>
+       <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
+       <div class="cbi-section-node">
+               <form class="inline" method="post" action="<%=url('admin/system/flashops/backup')%>">
+                       <input type="hidden" name="token" value="<%=token%>" />
+                       <div class="cbi-value<% if not reset_avail then %> cbi-value-last<% end %>">
+                               <label class="cbi-value-title" for="image"><%:Download backup%>:</label>
+                               <div class="cbi-value-field">
+                                       <input class="cbi-button cbi-button-action important" type="submit" name="backup" value="<%:Generate archive%>" />
                                </div>
-                       </form>
-               </div>
+                       </div>
+               </form>
                <% if reset_avail then %>
-               <div class="alert-message warning"><%:Custom files (certificates, scripts) may remain on the system. To prevent this, perform a factory-reset first.%></div>
+               <form class="inline" method="post" action="<%=url('admin/system/flashops/reset')%>">
+                       <input type="hidden" name="token" value="<%=token%>" />
+                       <div class="cbi-value cbi-value-last">
+                               <label class="cbi-value-title"><%:Reset to defaults%>:</label>
+                               <div class="cbi-value-field">
+                                       <input onclick="return confirm('<%:Really reset all changes?%>')" class="cbi-button cbi-button-reset" type="submit" name="reset" value="<%:Perform reset%>" />
+                               </div>
+                       </div>
+               </form>
                <% end %>
-       </fieldset>
-
+       </div>
        <br />
+       <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
+       <div class="cbi-section-node">
+               <form class="inline" method="post" action="<%=url('admin/system/flashops/restore')%>" enctype="multipart/form-data">
+                       <div class="cbi-value cbi-value-last">
+                               <label class="cbi-value-title" for="archive"><%:Restore backup%>:</label>
+                               <div class="cbi-value-field">
+                                       <input type="hidden" name="token" value="<%=token%>" />
+                                       <input type="file" name="archive" id="archive" />
+                                       <input type="submit" class="cbi-button cbi-button-action important" name="restore" value="<%:Upload archive...%>" />
+                               </div>
+                       </div>
+               </form>
+       </div>
+       <% if reset_avail then %>
+       <div class="alert-message warning"><%:Custom files (certificates, scripts) may remain on the system. To prevent this, perform a factory-reset first.%></div>
+       <% end %>
+</div>
 
-       <fieldset class="cbi-section">
-               <legend><%:Flash new firmware image%></legend>
-               <% if upgrade_avail then %>
-                       <form method="post" action="<%=url('admin/system/flashops/sysupgrade')%>" enctype="multipart/form-data">
-                               <input type="hidden" name="token" value="<%=token%>" />
-                               <div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires a compatible firmware image).%></div>
-                               <div class="cbi-section-node">
-                                       <div class="cbi-value">
-                                               <label class="cbi-value-title" for="keep"><%:Keep settings%>:</label>
-                                               <div class="cbi-value-field">
-                                                       <input type="checkbox" name="keep" id="keep" checked="checked" />
-                                               </div>
+<div class="cbi-section">
+       <legend><%:Flash new firmware image%></legend>
+       <% if upgrade_avail then %>
+               <form method="post" action="<%=url('admin/system/flashops/sysupgrade')%>" enctype="multipart/form-data">
+                       <input type="hidden" name="token" value="<%=token%>" />
+                       <div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires a compatible firmware image).%></div>
+                       <div class="cbi-section-node">
+                               <div class="cbi-value">
+                                       <label class="cbi-value-title" for="keep"><%:Keep settings%>:</label>
+                                       <div class="cbi-value-field">
+                                               <input type="checkbox" name="keep" id="keep" checked="checked" />
                                        </div>
-                                       <div class="cbi-value cbi-value-last<% if image_invalid then %> cbi-value-error<% end %>">
-                                               <label class="cbi-value-title" for="image"><%:Image%>:</label>
-                                               <div class="cbi-value-field">
-                                                       <input type="file" name="image" id="image" />
-                                                       <input type="submit" class="cbi-button cbi-input-apply" value="<%:Flash image...%>" />
-                                               </div>
+                               </div>
+                               <div class="cbi-value cbi-value-last<% if image_invalid then %> cbi-value-error<% end %>">
+                                       <label class="cbi-value-title" for="image"><%:Image%>:</label>
+                                       <div class="cbi-value-field">
+                                               <input type="file" name="image" id="image" />
+                                               <input type="submit" class="cbi-button cbi-button-action important" value="<%:Flash image...%>" />
                                        </div>
                                </div>
-                               <% if image_invalid then %>
-                                       <div class="cbi-section-error"><%:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform. %></div>
-                               <% end %>
-                       </form>
-               <% else %>
-                       <div class="cbi-section-descr"><%:Sorry, there is no sysupgrade support present; a new firmware image must be flashed manually. Please refer to the wiki for device specific install instructions.%></div>
-               <% end %>
-       </fieldset>
-
-</fieldset>
+                       </div>
+                       <% if image_invalid then %>
+                               <div class="cbi-section-error"><%:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform. %></div>
+                       <% end %>
+               </form>
+       <% else %>
+               <div class="cbi-section-descr"><%:Sorry, there is no sysupgrade support present; a new firmware image must be flashed manually. Please refer to the wiki for device specific install instructions.%></div>
+       <% end %>
+</div>
 
 <%+footer%>
index 88e0fffd9c82c2cee3d5b41c4172c187b6015ab9..ef13a91672e25b4cfa0c845c000167c870f09fec 100644 (file)
@@ -44,6 +44,8 @@ end
 
 <%+header%>
 
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+
 <h2 name="content"><%:Software%></h2>
 
 <div class="cbi-map">
@@ -57,8 +59,8 @@ end
                <input type="hidden" name="exec" value="1" />
                <input type="hidden" name="token" value="<%=token%>" />
 
-               <fieldset class="cbi-section">
-                       <fieldset class="cbi-section-node">
+               <div class="cbi-section">
+                       <div class="cbi-section-node">
                                <% if (install and next(install)) or (remove and next(remove)) or update or upgrade then %>
                                <div class="cbi-value">
                                        <% if #stdout > 0 then %><pre><%=pcdata(stdout)%></pre><% end %>
@@ -91,18 +93,18 @@ end
                                                <div style="background-color:#F08080; border-right:1px solid #000000; height:100%; width:<%=used_perc%>%">&#160;</div>
                                        </div>
                                </div>
-                       </fieldset>
+                       </div>
 
                        <br />
 
-                       <fieldset class="cbi-section-node">
+                       <div class="cbi-section-node">
                                <input type="hidden" name="display" value="<%=pcdata(display)%>" />
 
                                <div class="cbi-value">
                                        <label class="cbi-value-title"><%:Download and install package%>:</label>
                                        <div class="cbi-value-field">
                                                <input type="text" name="url" size="30" value="" />
-                                               <input class="cbi-button cbi-input-save" type="submit" name="go" value="<%:OK%>" />
+                                               <input class="cbi-button cbi-button-save" type="submit" name="go" value="<%:OK%>" />
                                        </div>
                                </div>
 
@@ -110,11 +112,11 @@ end
                                        <label class="cbi-value-title"><%:Filter%>:</label>
                                        <div class="cbi-value-field">
                                                <input type="text" name="query" size="20" value="<%=pcdata(query)%>" />
-                                               <input type="submit" class="cbi-button cbi-input-find" name="search" value="<%:Find package%>" />
+                                               <input type="submit" class="cbi-button cbi-button-action" name="search" value="<%:Find package%>" />
                                        </div>
                                </div>
-                       </fieldset>
-               </fieldset>
+                       </div>
+               </div>
        </form>
 
 
@@ -122,90 +124,90 @@ end
 
 
        <ul class="cbi-tabmenu">
-               <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&amp;query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
                <li class="cbi-tab<% if display ~= "available" then %>-disabled<% end %>"><a href="?display=available&amp;query=<%=pcdata(query)%>"><%:Available packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
+               <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&amp;query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
        </ul>
 
        <% if display ~= "available" then %>
-               <fieldset class="cbi-section">
-                       <table class="cbi-section-table" style="width:100%">
-                               <tr class="cbi-section-table-titles">
-                                       <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
-                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
-                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
-                               </tr>
-                               <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
-                                       <td style="text-align:left; width:10%">
-                                               <form method="post" class="inline" action="<%=REQUEST_URI%>">
-                                                       <input type="hidden" name="exec" value="1" />
-                                                       <input type="hidden" name="token" value="<%=token%>" />
-                                                       <input type="hidden" name="remove" value="<%=pcdata(n)%>" />
-                                                       <a onclick="window.confirm('<%:Remove%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" href="#"><%:Remove%></a>
-                                               </form>
-                                       </td>
-                                       <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
-                                       <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
-                               </tr>
-                               <% end) %>
-                               <% if empty then %>
-                               <tr class="cbi-section-table-row">
-                                       <td style="text-align:left">&#160;</td>
-                                       <td style="text-align:left"><em><%:none%></em></td>
-                                       <td style="text-align:left"><em><%:none%></em></td>
-                               </tr>
-                               <% end %>
-                       </table>
-               </fieldset>
+               <div class="cbi-section">
+                       <div class="cbi-section-node">
+                               <div class="table">
+                                       <div class="tr cbi-section-table-titles">
+                                               <div class="th left"><%:Package name%></div>
+                                               <div class="th left"><%:Version%></div>
+                                               <div class="th cbi-section-actions">&#160;</div>
+                                       </div>
+                                       <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %>
+                                       <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+                                               <div class="td left"><%=luci.util.pcdata(n)%></div>
+                                               <div class="td left"><%=luci.util.pcdata(v)%></div>
+                                               <div class="td cbi-section-actions">
+                                                       <form method="post" class="inline" action="<%=REQUEST_URI%>">
+                                                               <input type="hidden" name="exec" value="1" />
+                                                               <input type="hidden" name="token" value="<%=token%>" />
+                                                               <input type="hidden" name="remove" value="<%=pcdata(n)%>" />
+                                                               <input class="cbi-button cbi-button-remove" type="submit" onclick="window.confirm('<%:Remove%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" value="<%:Remove%>" />
+                                                       </form>
+                                               </div>
+                                       </div>
+                                       <% end) %>
+                                       <% if empty then %>
+                                       <div class="tr cbi-section-table-row">
+                                               <div class="td left">&#160;</div>
+                                               <div class="td left"><em><%:none%></em></div>
+                                               <div class="td left"><em><%:none%></em></div>
+                                       </div>
+                                       <% end %>
+                               </div>
+                       </div>
+               </div>
        <% else %>
-               <fieldset class="cbi-section">
+               <div class="cbi-section">
                <% if not querypat then %>
-                       <ul class="cbi-tabmenu">
+                       <ul class="cbi-tabmenu" style="flex-wrap:wrap">
                                <% local i; for i = 65, 90 do %>
                                <li class="cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href="?display=available&amp;letter=<%=string.char(i)%>"><%=string.char(i)%></a></li>
                                <% end %>
                                <li class="cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href="?display=available&amp;letter=%23">#</a></li>
                        </ul>
-                       <div class="cbi-section-node">
                <% end %>
-                       <table class="cbi-section-table" style="width:100%">
-                               <tr class="cbi-section-table-titles">
-                                       <th class="cbi-section-table-cell" style="text-align:left">&#160;</th>
-                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
-                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
-                                       <th class="cbi-section-table-cell" style="text-align:right"><%:Size (.ipk)%></th>
-                                       <th class="cbi-section-table-cell" style="text-align:left"><%:Description%></th>
-                               </tr>
-                               <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %>
-                               <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
-                                       <td style="text-align:left; width:10%">
-                                               <form method="post" class="inline" action="<%=REQUEST_URI%>">
-                                                       <input type="hidden" name="exec" value="1" />
-                                                       <input type="hidden" name="token" value="<%=token%>" />
-                                                       <input type="hidden" name="install" value="<%=pcdata(n)%>" />
-                                                       <a onclick="window.confirm('<%:Install%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" href="#"><%:Install%></a>
-                                               </form>
-                                       </td>
-                                       <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
-                                       <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
-                                       <td style="text-align:right"><%=luci.util.pcdata(s)%></td>
-                                       <td style="text-align:left"><%=luci.util.pcdata(d)%></td>
-                               </tr>
-                               <% end) %>
-                               <% if empty then %>
-                               <tr class="cbi-section-table-row">
-                                       <td style="text-align:left">&#160;</td>
-                                       <td style="text-align:left"><em><%:none%></em></td>
-                                       <td style="text-align:left"><em><%:none%></em></td>
-                                       <td style="text-align:right"><em><%:none%></em></td>
-                                       <td style="text-align:left"><em><%:none%></em></td>
-                               </tr>
-                               <% end %>
-                       </table>
-               <% if not querypat then %>
+                       <div class="cbi-section-node cbi-section-node-tabbed">
+                               <div class="table">
+                                       <div class="tr cbi-section-table-titles">
+                                               <div class="th col-2 left"><%:Package name%></div>
+                                               <div class="th col-2 left"><%:Version%></div>
+                                               <div class="th col-1 center"><%:Size (.ipk)%></div>
+                                               <div class="th col-10 left"><%:Description%></div>
+                                               <div class="th cbi-section-actions">&#160;</div>
+                                       </div>
+                                       <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %>
+                                       <div class="tr cbi-rowstyle-<%=rowstyle()%>">
+                                               <div class="td col-2 left"><%=luci.util.pcdata(n)%></div>
+                                               <div class="td col-2 left"><%=luci.util.pcdata(v)%></div>
+                                               <div class="td col-1 center"><%=luci.util.pcdata(s)%></div>
+                                               <div class="td col-10 left"><%=luci.util.pcdata(d)%></div>
+                                               <div class="td cbi-section-actions">
+                                                       <form method="post" class="inline" action="<%=REQUEST_URI%>">
+                                                               <input type="hidden" name="exec" value="1" />
+                                                               <input type="hidden" name="token" value="<%=token%>" />
+                                                               <input type="hidden" name="install" value="<%=pcdata(n)%>" />
+                                                               <input class="cbi-button cbi-button-apply" type="submit" onclick="window.confirm('<%:Install%> &quot;<%=luci.util.pcdata(n)%>&quot; ?') &#38;&#38; this.parentNode.submit(); return false" value="<%:Install%>" />
+                                                       </form>
+                                               </div>
+                                       </div>
+                                       <% end) %>
+                                       <% if empty then %>
+                                       <div class="tr">
+                                               <div class="td left">&#160;</div>
+                                               <div class="td left"><em><%:none%></em></div>
+                                               <div class="td left"><em><%:none%></em></div>
+                                               <div class="td right"><em><%:none%></em></div>
+                                               <div class="td left"><em><%:none%></em></div>
+                                       </div>
+                                       <% end %>
+                               </div>
                        </div>
-               <% end %>
-               </fieldset>
+               </div>
        <% end %>
 </div>
 
index c9551804d2aa352248920e85f28658f3cac40920..6ec2b310d295ae4e3f8bf90de6d5cfa9e6045958 100644 (file)
@@ -7,7 +7,6 @@
 <%+header%>
 
 <h2 name="content"><%:Reboot%></h2>
-<br />
 
 <p><%:Reboots the operating system of your device%></p>
 
@@ -49,7 +48,7 @@
        }
 //]]></script>
 
-<input class="cbi-button cbi-button-apply" type="button" value="<%:Perform reboot%>" onclick="reboot(this)" />
+<input class="cbi-button cbi-button-action important" type="button" value="<%:Perform reboot%>" onclick="reboot(this)" />
 
 <p class="alert-message" style="display:none">
        <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
index 4ed4f0a10f7595e7d788c172fdf0e2a6f9d44571..e05ccdece332385ccf677b1efa8ea167ae3e8ef7 100644 (file)
@@ -4,7 +4,7 @@
 -%>
 
 <% export("uci_changelog", function(changes) -%>
-<fieldset class="cbi-section">
+<div class="cbi-section">
        <strong><%:Legend:%></strong>
        <div class="uci-change-legend">
                <div class="uci-change-legend-label"><ins>&#160;</ins> <%:Section added%></div>
                                                                        ret[#ret+1] = "<br />%s.%s.%s+=<strong>%s</strong>"
                                                                                %{ r, s, o, util.pcdata(v[i]) }
                                                                end
-                                                       else
+                                                       elseif v ~= "" then
                                                                ret[#ret+1] = "<br />%s.%s.%s=<strong>%s</strong>"
                                                                        %{ r, s, o, util.pcdata(v) }
+                                                       else
+                                                               ret[#ret+1] = "<br /><del>%s.%s.<strong>%s</strong></del>" %{ r, s, o }
                                                        end
                                                end
                                        end
@@ -57,7 +59,7 @@
                                                                                ret[#ret+1] = "%s.%s.%s+=<strong>%s</strong><br />"
                                                                                        %{ r, s, o, util.pcdata(v[i]) }
                                                                        end
-                                                                       
+
                                                                else
                                                                        ret[#ret+1] = "%s.%s.%s=<strong>%s</strong><br />"
                                                                                %{ r, s, o, util.pcdata(v) }
@@ -75,5 +77,5 @@
 
                write(table.concat(ret))
        %></div>
-</fieldset>
+</div>
 <%- end) %>
index 9e9ce2be2ae03070efd96c79f3b32d3df06c3b38..6282244757599a1c34842fc42c6b951b89101c39 100644 (file)
 
 <div class="cbi-page-actions">
        <% if redir_url then %>
-       <div style="float:left">
-               <form class="inline" method="get" action="<%=luci.util.pcdata(redir_url)%>">
-                       <input class="cbi-button cbi-button-link" style="float:left; margin:0" type="submit" value="<%:Back%>" />
-               </form>
-       </div>
+       <form method="get" action="<%=luci.util.pcdata(redir_url)%>">
+               <input class="cbi-button cbi-button-link" type="submit" value="<%:Back%>" />
+       </form>
        <% end %>
 
-       <div style="text-align:right">
-               <input class="cbi-button cbi-button-save" type="button" id="apply_button" value="<%:Save & Apply%>" onclick="uci_apply(true); this.blur()" />
-               <form class="inline" method="post" action="<%=controller%>/admin/uci/revert">
-                       <input type="hidden" name="token" value="<%=token%>" />
-                       <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
-                       <input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" />
-               </form>
-       </div>
+       <input class="cbi-button cbi-button-save" type="button" id="apply_button" value="<%:Save & Apply%>" onclick="uci_apply(true); this.blur()" />
+       <form method="post" action="<%=url("admin/uci/revert")%>">
+               <input type="hidden" name="token" value="<%=token%>" />
+               <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
+               <input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" />
+       </form>
 </div>
 
 <%+footer%>
index 1add595c6c6a777ba40988cdb5d476eafe373d3b..dca35376cb23eba141952075e3ec8232ee9f86f5 100644 (file)
@@ -31,33 +31,33 @@ end
 
 <fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
 <legend><%:Operator%></legend>
-       <table cellspacing="10" width="100%" style="text-align:left">
-               <tr><th width="33%"><%:Nickname%>:</th><td><%=nickname%></td></tr>
-               <tr><th width="33%"><%:Realname%>:</th><td><%=name%></td></tr>
-               <tr><th width="33%"><%:Homepage%>:</th><td>
+       <div class="table" cellspacing="10" width="100%" style="text-align:left">
+               <div class="tr"><div class="th" width="33%"><%:Nickname%>:</div><div class="td"><%=nickname%></div></div>
+               <div class="tr"><div class="th" width="33%"><%:Realname%>:</div><div class="td"><%=name%></div></div>
+               <div class="tr"><div class="th" width="33%"><%:Homepage%>:</div><div class="td">
                        <% for k, v in ipairs(homepage) do %>
                        <a href="<%=v%>"><%=v%></a><br />
                        <% end %>
-               </td></tr>
-               <tr><th width="33%"><%:E-Mail%>:</th><td><a href="mailto:<%=mail%>"><%=mail%></a></td></tr>
-               <tr><th width="33%"><%:Phone%>:</th><td><%=phone%></td></tr>
-       </table>
+               </div></div>
+               <div class="tr"><div class="th" width="33%"><%:E-Mail%>:</div><div class="td"><a href="mailto:<%=mail%>"><%=mail%></a></div></div>
+               <div class="tr"><div class="th" width="33%"><%:Phone%>:</div><div class="td"><%=phone%></div></div>
+       </div>
 </fieldset>
 
 <fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
 <legend><%:Location%></legend>
-       <table cellspacing="10" width="100%" style="text-align:left">
-               <tr><th width="33%"><%:Location%>:</th><td><%=location%></td></tr>
-               <tr><th width="33%"><%:Coordinates%>:</th><td><%=lat%> <%=lon%> (<a href="<%=pcdata(luci.dispatcher.build_url("freifunk/map"))%>"><%:Show on map%>)</a></td></tr>
-       </table>
+       <div class="table" cellspacing="10" width="100%" style="text-align:left">
+               <div class="tr"><div class="th" width="33%"><%:Location%>:</div><div class="td"><%=location%></div></div>
+               <div class="tr"><div class="th" width="33%"><%:Coordinates%>:</div><div class="td"><%=lat%> <%=lon%> (<a href="<%=pcdata(luci.dispatcher.build_url("freifunk/map"))%>"><%:Show on map%>)</a></div></div>
+       </div>
 </fieldset>
 
 <% if note then %>
 <fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
 <legend><%:Notice%></legend>
-       <table cellspacing="10" width="100%" style="text-align:left">
-               <tr><td><%=note%></td></tr>
-       </table>
+       <div class="table" cellspacing="10" width="100%" style="text-align:left">
+               <div class="tr"><div class="td"><%=note%></div></div>
+       </div>
 </fieldset>
 <%end%>
 
index 1dc1d8b0d18f2d8cdedbcc1fb0b97b67e55ef5d8..a56e4826a95d3672f1a29e2dbbf157cd6f73b82f 100644 (file)
@@ -238,25 +238,25 @@ end
        <h2><%:Wireless Overview%></h2>
 
                <% if not has_iwinfo then %>
-                       <div class="errorbox">
-                               <strong><%:Package libiwinfo required!%></strong><br />
-                               <%_The <em>libiwinfo</em> package is not installed. You must install this component for working wireless configuration!%>
+                       <div class="alert-message warning">
+                               <h4><%:Package libiwinfo required!%></h4>
+                               <p><%_The <em>libiwinfo</em> package is not installed. You must install this component for working wireless configuration!%></p>
                        </div>
                <% end %>
 
                <div class="cbi-section">
                        <div class="cbi-section-node">
-                               <table class="cbi-section-table">
-                                       <tr class="cbi-section-table-titles">
-                                               <th class="cbi-section-table-cell"><%:Signal%></th>
-                                               <th class="cbi-section-table-cell"><%:Bitrate%></th>
-                                               <th class="cbi-section-table-cell"><%:SSID%></th>
-                                               <th class="cbi-section-table-cell"><%:BSSID%></th>
-                                               <th class="cbi-section-table-cell"><%:Channel%></th>
-                                               <th class="cbi-section-table-cell"><%:Mode%></th>
-                                               <th class="cbi-section-table-cell"><%:TX%>-<%:Power%></th>
-                                               <th class="cbi-section-table-cell"><%:Interface%></th>
-                                       </tr>
+                               <div class="table cbi-section-table">
+                                       <div class="tr cbi-section-table-titles">
+                                               <div class="th cbi-section-table-cell"><%:Signal%></div>
+                                               <div class="th cbi-section-table-cell"><%:Bitrate%></div>
+                                               <div class="th cbi-section-table-cell"><%:SSID%></div>
+                                               <div class="th cbi-section-table-cell"><%:BSSID%></div>
+                                               <div class="th cbi-section-table-cell"><%:Channel%></div>
+                                               <div class="th cbi-section-table-cell"><%:Mode%></div>
+                                               <div class="th cbi-section-table-cell"><%:TX%>-<%:Power%></div>
+                                               <div class="th cbi-section-table-cell"><%:Interface%></div>
+                                       </div>
        <%
        for _, dev in ipairs(devices) do
        local net
@@ -301,20 +301,20 @@ end
                                end
                                local interface = net.iwinfo.ifname or "N/A"
        %>
-                                               <tr class="cbi-section-table-row cbi-rowstyle-1">
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-signal"><%=signal_string%></td>
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-bitrate"><%=bitrate%></td>
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-ssid"><%=ssid%></td>
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-bssid"><%=bssid%></td>
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-channel"><%=chan%></td>
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-mode"><%=mode%></td>
-                                               <td class="cbi-value-field" id="<%=net:ifname()%>-txpower"><%=txpwr%></td>
-                                               <td class="cbi-value-field"><%=interface%></td>
-                                       </tr>
+                                               <div class="tr cbi-section-table-row cbi-rowstyle-1">
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-signal"><%=signal_string%></div>
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-bitrate"><%=bitrate%></div>
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-ssid"><%=ssid%></div>
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-bssid"><%=bssid%></div>
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-channel"><%=chan%></div>
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-mode"><%=mode%></div>
+                                               <div class="td cbi-value-field" id="<%=net:ifname()%>-txpower"><%=txpwr%></div>
+                                               <div class="td cbi-value-field"><%=interface%></div>
+                                       </div>
                        <% end
                end
        end %>
-                       </table>
+                       </div>
                </div>
        </div>
 </div>
@@ -328,35 +328,35 @@ end
 <% if not def4 and not def6 then %>
        <%:No default routes known.%>
 <%else%>
-                               <table class="cbi-section-table">
-                                               <tr class="cbi-section-table-titles">
-                                                       <th class="cbi-section-table-cell"><%:Network%></th>
-                                                       <th class="cbi-section-table-cell"><%:Interface%></th>
-                                                       <th class="cbi-section-table-cell"><%:Gateway%></th>
-                                                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                                               </tr>
+                               <div class="table cbi-section-table">
+                                               <div class="tr cbi-section-table-titles">
+                                                       <div class="th cbi-section-table-cell"><%:Network%></div>
+                                                       <div class="th cbi-section-table-cell"><%:Interface%></div>
+                                                       <div class="th cbi-section-table-cell"><%:Gateway%></div>
+                                                       <div class="th cbi-section-table-cell"><%:Metric%></div>
+                                               </div>
 
        <% if def4 then %>
-                                               <tr class="cbi-section-table-row cbi-rowstyle-1">
-                                                       <td class="cbi-value-field" id="v4dst"><%=def4.dest%></td>
-                                                       <td class="cbi-value-field" id="v4dev"><%=def4.dev%></td>
-                                                       <td class="cbi-value-field" id="v4gw"><%=def4.gateway%></td>
-                                                       <td class="cbi-value-field" id="v4metr"><%=def4.metr%></td>
-                                               </tr>
+                                               <div class="tr cbi-section-table-row cbi-rowstyle-1">
+                                                       <div class="td cbi-value-field" id="v4dst"><%=def4.dest%></div>
+                                                       <div class="td cbi-value-field" id="v4dev"><%=def4.dev%></div>
+                                                       <div class="td cbi-value-field" id="v4gw"><%=def4.gateway%></div>
+                                                       <div class="td cbi-value-field" id="v4metr"><%=def4.metr%></div>
+                                               </div>
 
        <% end
        if def6 then %>
 
-                                               <tr class="cbi-section-table-row cbi-rowstyle-2">
-                                                       <td class="cbi-value-field" id="v6dst"><%=def6.dest%></td>
-                                                       <td class="cbi-value-field" id="v6dev"><%=def6.dev%></td>
-                                                       <td class="cbi-value-field" id="v6gw"><%=def6.gateway%></td>
-                                                       <td class="cbi-value-field" id="v6metr"><%=def6.metr%></td>
-                                               </tr>
+                                               <div class="tr cbi-section-table-row cbi-rowstyle-2">
+                                                       <div class="td cbi-value-field" id="v6dst"><%=def6.dest%></div>
+                                                       <div class="td cbi-value-field" id="v6dev"><%=def6.dev%></div>
+                                                       <div class="td cbi-value-field" id="v6gw"><%=def6.gateway%></div>
+                                                       <div class="td cbi-value-field" id="v6metr"><%=def6.metr%></div>
+                                               </div>
 
        <% end %>
 
-                               </table>
+                               </div>
 <% end %>
                </div>
        </div>
diff --git a/protocols/luci-proto-3g/luasrc/model/network/proto_3g.lua b/protocols/luci-proto-3g/luasrc/model/network/proto_3g.lua
new file mode 100644 (file)
index 0000000..b245483
--- /dev/null
@@ -0,0 +1,49 @@
+-- Copyright 2018 Florian Eckert <fe@dev.tdt.de>
+-- Licensed to the public under the Apache License 2.0.
+
+local netmod = luci.model.network
+local interface = luci.model.network.interface
+
+local proto = netmod:register_protocol("3g")
+
+function proto.get_i18n(self)
+       return luci.i18n.translate("UMTS/GPRS/EV-DO")
+end
+
+function proto.ifname(self)
+       return "3g-" .. self.sid
+end
+
+function proto.get_interface(self)
+       return interface(self:ifname(), self)
+end
+
+function proto.is_installed(self)
+       return nixio.fs.access("/lib/netifd/proto/3g.sh")
+end
+
+function proto.opkg_package(self)
+       return "comgt"
+end
+
+function proto.is_floating(self)
+       return true
+end
+
+function proto.is_virtual(self)
+       return true
+end
+
+function proto.get_interfaces(self)
+       return nil
+end
+
+function proto.contains_interface(self, ifname)
+       if self:is_floating() then
+               return (netmod:ifnameof(ifc) == self:ifname())
+       else
+               return netmod.protocol.contains_interface(self, ifc)
+       end
+end
+
+netmod:register_pattern_virtual("^3g%-%w")
index 761ee2f9f5ba8e23a87b43824840b3f21f571cb5..b28c8d58955d7c2497d94eeeaeef6afd6cf0777a 100644 (file)
@@ -6,7 +6,7 @@
 
 include $(TOPDIR)/rules.mk
 
-LUCI_TITLE:=Support for DHCPv6/6in4/6to4/6rd/DS-Lite/aiccu
+LUCI_TITLE:=Support for DHCPv6/6in4/6to4/6rd/DS-Lite
 LUCI_DEPENDS:=
 
 PKG_LICENSE:=Apache-2.0
diff --git a/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua b/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
deleted file mode 100644 (file)
index 7b5e604..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
--- Copyright 2015 Paul Oranje <por@xs4all.nl>
--- Licensed to the public under the Apache License 2.0.
-
-local map, section, net = ...
-
--- config read by /lib/netifd/proto/aiccu.sh
-local username, password, protocol, server, tunnelid, ip6prefix, requiretls, nat, heartbeat,
-       verbose, ntpsynctimeout, ip6addr, sourcerouting, defaultroute
-
--- generic parameters
-local metric, ttl, mtu
-
-
-username = section:taboption("general", Value, "username",
-       translate("Server username"),
-       translate("SIXXS-handle[/Tunnel-ID]"))
-username.datatype = "string"
-
-password = section:taboption("general", Value, "password",
-       translate("Server password"),
-       translate("Server password, enter the specific password of the tunnel when the username contains the tunnel ID"))
-password.datatype = "string"
-password.password = true
-
-
---[[ SIXXS supports only TIC as tunnel broker protocol, no use setting it.
-protocol = section:taboption("general", ListValue, "protocol",
-       translate("Tunnel broker protocol"),
-       translate("SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) use 6in4 instead"))
-
-protocol:value("tic", "TIC")
-protocol:value("tsp", "TSP")
-protocol:value("l2tp", "L2TP")
-protocol.default = "tic"
-protocol.optional = true
---]]
-
-
-server = section:taboption("general", Value, "server",
-       translate("Tunnel setup server"),
-       translate("Optional, specify to override default server (tic.sixxs.net)"))
-server.datatype = "host(0)"
-server.optional = true
-
-
-tunnelid = section:taboption("general", Value, "tunnelid",
-       translate("Tunnel ID"),
-       translate("Optional, use when the SIXXS account has more than one tunnel"))
-tunnelid.datatype = "string"
-tunnelid.optional = true
-
-
-local ip6prefix = section:taboption("general", Value, "ip6prefix",
-       translate("IPv6 prefix"),
-       translate("Routed IPv6 prefix for downstream interfaces"))
-ip6prefix.datatype = "ip6addr"
-ip6prefix.optional = true
-
-
-heartbeat = s:taboption("general", ListValue, "heartbeat",
-        translate("Tunnel type"),
-       translate("Also see <a href=\"https://www.sixxs.net/faq/connectivity/?faq=comparison\">Tunneling Comparison</a> on SIXXS"))
-heartbeat:value("0", translate("AYIYA"))
-heartbeat:value("1", translate("Heartbeat"))
-heartbeat.default = "0"
-
-
-nat = section:taboption("general", Flag, "nat",
-       translate("Behind NAT"),
-       translate("The tunnel end-point is behind NAT, defaults to disabled and only applies to AYIYA"))
-nat.optional = true
-nat.default = nat.disabled
-
-
-requiretls = section:taboption("general", Flag, "requiretls",
-       translate("Require TLS"),
-       translate("Connection to server fails when TLS cannot be used"))
-requiretls.optional = true
-requiretls.default = requiretls.disabled
-
-
-verbose = section:taboption("advanced", Flag, "verbose",
-       translate("Verbose"),
-       translate("Verbose logging by aiccu daemon"))
-verbose.optional = true
-verbose.default = verbose.disabled
-
-
-ntpsynctimeout = section:taboption("advanced", Value, "ntpsynctimeout",
-       translate("NTP sync time-out"),
-       translate("Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"))
-ntpsynctimeout.datatype = "uinteger"
-ntpsynctimeout.placeholder = "90"
-ntpsynctimeout.optional = true
-
-
-ip6addr = section:taboption("advanced", Value, "ip6addr",
-       translate("Local IPv6 address"),
-       translate("IPv6 address delegated to the local tunnel endpoint (optional)"))
-ip6addr.datatype = "ip6addr"
-ip6addr.optional = true
-
-
-defaultroute = section:taboption("advanced", Flag, "defaultroute",
-       translate("Default route"),
-       translate("Whether to create an IPv6 default route over the tunnel"))
-defaultroute.default = defaultroute.enabled
-defaultroute.optional = true
-
-
-sourcerouting = section:taboption("advanced", Flag, "sourcerouting",
-       translate("Source routing"),
-       translate("Whether to route only packets from delegated prefixes"))
-sourcerouting.default = sourcerouting.enabled
-sourcerouting.optional = true
-
-
-metric = section:taboption("advanced", Value, "metric",
-       translate("Use gateway metric"))
-metric.datatype = "uinteger"
-metric.placeholder = "0"
-metric:depends("defaultroute", defaultroute.enabled)
-
-
-ttl = section:taboption("advanced", Value, "ttl",
-       translate("Use TTL on tunnel interface"))
-ttl.datatype = "range(1,255)"
-ttl.placeholder = "64"
-
-
-mtu = section:taboption("advanced", Value, "mtu",
-       translate("Use MTU on tunnel interface"),
-        translate("minimum 1280, maximum 1480"))
-mtu.datatype = "range(1280,1480)"
-mtu.placeholder = "1280"
-
diff --git a/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua b/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua
deleted file mode 100644 (file)
index e0d7fd3..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
--- Copyright 2015 Paul Oranje <por@xs4all.nl>
--- Licensed to the public under GPLv2
-
-local netmod = luci.model.network
-local interface = luci.model.network.interface
-
-local proto = netmod:register_protocol("aiccu")
-
-function proto.get_i18n(self)
-       return luci.i18n.translate("AICCU (SIXXS)")
-end
-
-function proto.ifname(self)
-       return "aiccu-" .. self.sid
-end
-
-function proto.get_interface(self)
-       return interface(self:ifname(), self)
-end
-
-function proto.is_installed(self)
-       return nixio.fs.access("/lib/netifd/proto/aiccu.sh")
-end
-
-function proto.opkg_package(self)
-       return "aiccu"
-end
-
-function proto.is_floating(self)
-       return true
-end
-
-function proto.is_virtual(self)
-       return true
-end
-
-function proto.get_interfaces(self)
-       return nil
-end
-
-function proto.contains_interface(self, ifname)
-       if self:is_floating() then
-               return (netmod:ifnameof(ifc) == self:ifname())
-       else
-               return netmod.protocol.contains_interface(self, ifc)
-       end
-end
-
-netmod:register_pattern_virtual("^aiccu%-%w")
index 1bcbd4808a0d82bdfc98e38e6dc5105b8e98dcf6..3afb7de4f58fda0581fde075ba134c8237aab15a 100644 (file)
@@ -4,7 +4,7 @@
 local netmod = luci.model.network
 
 local _, p
-for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) do
+for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "l2tp", "pppossh"}) do
 
        local proto = netmod:register_protocol(p)
 
@@ -13,8 +13,6 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) d
                        return luci.i18n.translate("PPP")
                elseif p == "pptp" then
                        return luci.i18n.translate("PPtP")
-               elseif p == "3g" then
-                       return luci.i18n.translate("UMTS/GPRS/EV-DO")
                elseif p == "pppoe" then
                        return luci.i18n.translate("PPPoE")
                elseif p == "pppoa" then
@@ -33,8 +31,6 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) d
        function proto.opkg_package(self)
                if p == "ppp" then
                        return p
-               elseif p == "3g" then
-                       return "comgt"
                elseif p == "pptp" then
                        return "ppp-mod-pptp"
                elseif p == "pppoe" then
@@ -55,8 +51,6 @@ for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp", "pppossh"}) d
                        return (nixio.fs.glob("/usr/lib/pppd/*/rp-pppoe.so")() ~= nil)
                elseif p == "pptp" then
                        return (nixio.fs.glob("/usr/lib/pppd/*/pptp.so")() ~= nil)
-               elseif p == "3g" then
-                       return nixio.fs.access("/lib/netifd/proto/3g.sh")
                elseif p == "l2tp" then
                        return nixio.fs.access("/lib/netifd/proto/l2tp.sh")
                elseif p == "pppossh" then
index 46a8f49d976b7b187b9192a88486f17e99e9aabb..056f6a6e76d3ead9edf603be3902b403500dcb4b 100644 (file)
@@ -89,7 +89,7 @@ peers = map:section(
   "wireguard_" .. ifname,
   translate("Peers"),
   translate("Further information about WireGuard interfaces and peers " ..
-            "at <a href=\"http://wireguard.io\">wireguard.io</a>.")
+            "at <a href=\"http://wireguard.com\">wireguard.com</a>.")
 )
 peers.template = "cbi/tsection"
 peers.anonymous = true
index 8d0c434a98bf2566cfff59a6f9afd6c597615333..b1f1f6b5edb4eef2cabcc9efd713e82826a057db 100644 (file)
@@ -25,7 +25,8 @@ body {
 
 h1, h2, h3, h4, h5, h6, p, pre, a, abbr, acronym, code, del, em, img, q, s,
 small, strike, strong, sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset,
-form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td {
+form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td,
+.table, .tbody, .tfoot, .thead, .tr, .th, .td {
        margin: 0;
        padding: 0;
        border: 0;
@@ -112,8 +113,6 @@ option,
 textarea {
        font-size: 100%;
        margin: 0;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
        box-sizing: border-box;
        vertical-align: baseline;
        *vertical-align: middle;
@@ -146,8 +145,6 @@ input[type="submit"][disabled] {
 
 input[type="search"] {
        -webkit-appearance: textfield;
-       -webkit-box-sizing: content-box;
-       -moz-box-sizing: content-box;
        box-sizing: content-box;
 }
 
@@ -218,7 +215,8 @@ a:hover {
  * ---------------------------------------------------------------------------------------- */
 p,
 .cbi-map-descr,
-.cbi-section-descr {
+.cbi-section-descr,
+.table .tr.cbi-section-table-descr .th {
        font-size: 13px;
        font-weight: normal;
        line-height: 18px;
@@ -232,7 +230,7 @@ p small {
 
 h1,
 h2,
-h3,
+h3, legend,
 h4,
 h5,
 h6 {
@@ -268,14 +266,14 @@ h2 small {
        font-size: 14px;
 }
 
-h3,
+h3, legend,
 h4,
 h5,
 h6 {
        line-height: 36px;
 }
 
-h3 {
+h3, legend {
        font-size: 18px;
 }
 
@@ -375,8 +373,6 @@ code, pre {
        padding: 0 3px 2px;
        font-family: Monaco, Andale Mono, Courier New, monospace;
        font-size: 12px;
-       -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
        border-radius: 3px;
 }
 
@@ -395,8 +391,6 @@ pre {
        font-size: 12px;
        border: 1px solid #ccc;
        border: 1px solid rgba(0, 0, 0, 0.15);
-       -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
        border-radius: 3px;
        white-space: pre;
        white-space: pre-wrap;
@@ -437,7 +431,6 @@ form .clearfix,
 form .cbi-value {
        margin-bottom: 18px;
        zoom: 1;
-       overflow: hidden;
 }
 
 form .clearfix:before, form .clearfix:after,
@@ -484,6 +477,7 @@ input[type=checkbox], input[type=radio] {
 input,
 textarea,
 select,
+.cbi-dropdown,
 .uneditable-input {
        display: inline-block;
        width: 210px;
@@ -493,9 +487,14 @@ select,
        line-height: 18px;
        color: #808080;
        border: 1px solid #ccc;
-       -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
        border-radius: 3px;
+       box-sizing: border-box;
+}
+
+.cbi-dropdown {
+       min-width: 210px;
+       max-width: 400px;
+       width: auto;
 }
 
 select {
@@ -521,8 +520,6 @@ input[type=file] {
        padding: initial;
        border: initial;
        line-height: initial;
-       -webkit-box-shadow: none;
-       -moz-box-shadow: none;
        box-shadow: none;
        width: auto !important;
 }
@@ -547,12 +544,17 @@ textarea {
        height: auto;
 }
 
+.td > input[type=text],
+.td > input[type=password],
+.td > select,
+.td > .cbi-dropdown {
+       width: 100%;
+}
+
 .uneditable-input {
        background-color: #ffffff;
        display: block;
        border-color: #eee;
-       -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-       -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
        box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
        cursor: not-allowed;
 }
@@ -566,27 +568,17 @@ textarea {
 }
 
 input, textarea {
-       -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
        transition: border linear 0.2s, box-shadow linear 0.2s;
-       -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-       -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
        box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
 }
 
 input:focus, textarea:focus {
        outline: 0;
        border-color: rgba(82, 168, 236, 0.8);
-       -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
-       -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
        box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
 }
 
 input[type=file]:focus, input[type=checkbox]:focus, select:focus {
-       -webkit-box-shadow: none;
-       -moz-box-shadow: none;
        box-shadow: none;
        outline: 1px dotted #666;
 }
@@ -602,8 +594,6 @@ form .clearfix.error input, form .clearfix.error textarea {
 
 form .clearfix.error input:focus, form .clearfix.error textarea:focus {
        border-color: #e9322d;
-       -webkit-box-shadow: 0 0 6px #f8b9b7;
-       -moz-box-shadow: 0 0 6px #f8b9b7;
        box-shadow: 0 0 6px #f8b9b7;
 }
 
@@ -624,8 +614,6 @@ form .clearfix.warning input, form .clearfix.warning textarea {
 
 form .clearfix.warning input:focus, form .clearfix.warning textarea:focus {
        border-color: #be9a3f;
-       -webkit-box-shadow: 0 0 6px #e5d6b1;
-       -moz-box-shadow: 0 0 6px #e5d6b1;
        box-shadow: 0 0 6px #e5d6b1;
 }
 
@@ -646,8 +634,6 @@ form .clearfix.success input, form .clearfix.success textarea {
 
 form .clearfix.success input:focus, form .clearfix.success textarea:focus {
        border-color: #458845;
-       -webkit-box-shadow: 0 0 6px #9acc9a;
-       -moz-box-shadow: 0 0 6px #9acc9a;
        box-shadow: 0 0 6px #9acc9a;
 }
 
@@ -667,14 +653,32 @@ textarea[readonly] {
        border-color: #ddd;
 }
 
+.cbi-optionals,
+.cbi-section-create {
+       padding: 0 0 10px 10px;
+}
+
+.cbi-section-create {
+       margin: -3px;
+       display: inline-flex;
+       align-items: center;
+}
+
+.cbi-section-create > * {
+       margin: 3px;
+       flex: 1 1 auto;
+}
+
+.cbi-section-create > * > input {
+       width: 100%;
+}
+
 .actions,
 .cbi-page-actions {
        background: #f5f5f5;
        margin-bottom: 18px;
-       padding: 17px 20px 18px 150px;
+       padding: 17px 20px 18px 17px;
        border-top: 1px solid #ddd;
-       -webkit-border-radius: 0 0 3px 3px;
-       -moz-border-radius: 0 0 3px 3px;
        border-radius: 0 0 3px 3px;
        text-align: right;
 }
@@ -719,36 +723,57 @@ textarea[readonly] {
  * Tables.less
  * Tables for, you guessed it, tabular data
  * ---------------------------------------- */
-table {
+.tr { display: table-row; }
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
+.table {
+       display: table;
        width: 100%;
        margin-bottom: 18px;
        padding: 0;
        font-size: 13px;
        border-collapse: collapse;
+       position: relative;
 }
 
-table th, table td {
+.table .th, .table .td {
+       display: table-cell;
+       vertical-align: middle; /* Fixme */
        padding: 10px 10px 9px;
        line-height: 18px;
        text-align: left;
 }
 
-table th {
+.table .th {
        padding-top: 9px;
        font-weight: bold;
        vertical-align: middle;
 }
 
-table td {
+.table .td {
        vertical-align: top;
        border-top: 1px solid #ddd;
 }
 
-table tbody th {
+.table .tbody .th {
        border-top: 1px solid #ddd;
        vertical-align: top;
 }
 
+.tr.placeholder {
+       height: calc(3em + 20px);
+}
+
+.tr.placeholder > .td {
+       position: absolute;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       text-align: center;
+       line-height: 3em;
+}
+
 /* Patterns.less
  * Repeatable UI elements outside the base styles provided from the scaffolding
  * ---------------------------------------------------------------------------- */
@@ -797,18 +822,8 @@ header p {
 
 header .fill {
        background-color: #222;
-       background-color: #222222;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));
-       background-image: -moz-linear-gradient(top, #333333, #222222);
-       background-image: -ms-linear-gradient(top, #333333, #222222);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));
-       background-image: -webkit-linear-gradient(top, #333333, #222222);
-       background-image: -o-linear-gradient(top, #333333, #222222);
        background-image: linear-gradient(to bottom, #333333, #222222);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
-       -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-       -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
        padding: 0 5px;
 }
@@ -914,14 +929,7 @@ header div > ul .dropdown-menu li a:hover,
 .nav .dropdown-menu li a:hover {
        background-color: #191919;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));
-       background-image: -moz-linear-gradient(top, #292929, #191919);
-       background-image: -ms-linear-gradient(top, #292929, #191919);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));
-       background-image: -webkit-linear-gradient(top, #292929, #191919);
-       background-image: -o-linear-gradient(top, #292929, #191919);
        background-image: linear-gradient(to bottom, #292929, #191919);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);
        color: #ffffff;
 }
 
@@ -960,9 +968,6 @@ a.menu:after, .dropdown-toggle:after {
        border-left: 4px solid transparent;
        border-right: 4px solid transparent;
        border-top: 4px solid #ffffff;
-       filter: alpha(opacity=50);
-       -khtml-opacity: 0.5;
-       -moz-opacity: 0.5;
        opacity: 0.5;
 }
 
@@ -984,14 +989,8 @@ a.menu:after, .dropdown-toggle:after {
        border-color: rgba(0, 0, 0, 0.2);
        border-style: solid;
        border-width: 0 1px 1px;
-       -webkit-border-radius: 0 0 6px 6px;
-       -moz-border-radius: 0 0 6px 6px;
        border-radius: 0 0 6px 6px;
-       -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-       -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-       -webkit-background-clip: padding-box;
-       -moz-background-clip: padding-box;
        background-clip: padding-box;
 }
 
@@ -1025,18 +1024,9 @@ header .dropdown-menu a.hover,
 .dropdown-menu a.hover {
        background-color: #dddddd;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));
-       background-image: -moz-linear-gradient(top, #eeeeee, #dddddd);
-       background-image: -ms-linear-gradient(top, #eeeeee, #dddddd);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd);
-       background-image: -o-linear-gradient(top, #eeeeee, #dddddd);
        background-image: linear-gradient(to bottom, #eeeeee, #dddddd);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);
        color: #404040;
        text-decoration: none;
-       -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
-       -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
        box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
 }
 
@@ -1129,8 +1119,6 @@ header .dropdown-menu a.hover,
        margin-right: 2px;
        line-height: 34px;
        border: 1px solid transparent;
-       -webkit-border-radius: 4px 4px 0 0;
-       -moz-border-radius: 4px 4px 0 0;
        border-radius: 4px 4px 0 0;
 }
 
@@ -1155,8 +1143,6 @@ header .dropdown-menu a.hover,
 .cbi-tabmenu .menu-dropdown, .cbi-tabmenu .dropdown-menu {
        top: 35px;
        border-width: 1px;
-       -webkit-border-radius: 0 6px 6px 6px;
-       -moz-border-radius: 0 6px 6px 6px;
        border-radius: 0 6px 6px 6px;
 }
 
@@ -1191,20 +1177,9 @@ header .dropdown-menu a.hover,
        margin: 0 0 18px;
        background-color: #f5f5f5;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));
-       background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
-       background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));
-       background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
-       background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
        background-image: linear-gradient(to bottom, #ffffff, #f5f5f5);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
        border: 1px solid #ddd;
-       -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
        border-radius: 3px;
-       -webkit-box-shadow: inset 0 1px 0 #ffffff;
-       -moz-box-shadow: inset 0 1px 0 #ffffff;
        box-shadow: inset 0 1px 0 #ffffff;
 }
 
@@ -1258,14 +1233,7 @@ footer {
 .alert-message.error {
        background-color: #c43c35;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
-       background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-       background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
-       background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-       background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
        background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
        text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
        border-color: #c43c35 #c43c35 #882a25;
        border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -1274,14 +1242,7 @@ footer {
 .btn.success, .alert-message.success {
        background-color: #57a957;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
-       background-image: -moz-linear-gradient(top, #62c462, #57a957);
-       background-image: -ms-linear-gradient(top, #62c462, #57a957);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
-       background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-       background-image: -o-linear-gradient(top, #62c462, #57a957);
        background-image: linear-gradient(to bottom, #62c462, #57a957);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
        text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
        border-color: #57a957 #57a957 #3d773d;
        border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -1290,14 +1251,7 @@ footer {
 .btn.info, .alert-message.info {
        background-color: #339bb9;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
-       background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-       background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
-       background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-       background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
        background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
        text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
        border-color: #339bb9 #339bb9 #22697d;
        border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -1309,13 +1263,7 @@ footer {
        display: inline-block;
        background-color: #e6e6e6;
        background-repeat: no-repeat;
-       background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
        background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
        padding: 5px 14px 6px;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
        color: #333;
@@ -1323,11 +1271,7 @@ footer {
        line-height: normal;
        border: 1px solid #ccc;
        border-bottom-color: #bbb;
-       -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
        border-radius: 4px;
-       -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
        box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
 }
 
@@ -1342,192 +1286,289 @@ footer {
        outline: 1px dotted #666;
 }
 
-.btn.primary,
-.cbi-page-actions .cbi-button-apply,
-.cbi-page-actions .cbi-button-save,
-.cbi-page-actions .cbi-button-reset {
-       color: #ffffff;
-       padding: 5px 14px 6px;
-       background-color: #0064cd;
-       background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
-       background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
-       background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
-       background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
-       background-image: -o-linear-gradient(top, #049cdb, #0064cd);
-       background-image: linear-gradient(to bottom, #049cdb, #0064cd);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);
-       text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-       border-color: #0064cd #0064cd #003f81;
-       border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-
 .cbi-input-invalid,
 .cbi-value-error input {
        color: #FF0000;
        border-color: #FF0000;
 }
 
-.cbi-button-up,
-.cbi-input-up {
-       background-position: center center;
-       background-image: url('../resources/cbi/up.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/up.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/up.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/up.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/up.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/up.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-down,
-.cbi-input-down {
-       background-position: center center;
-       background-image: url('../resources/cbi/down.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/down.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/down.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/down.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/down.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/down.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-positive,
+.cbi-button-fieldadd,
+.cbi-button-add,
+.cbi-button-save {
+       border-color: #4a4;
+       color: #4a4;
 }
 
+.cbi-button-neutral,
+.cbi-button-download,
 .cbi-button-find,
-.cbi-input-find {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/find.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/find.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/find.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/find.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/find.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/find.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-add,
-.cbi-input-add {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/add.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/add.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/add.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/add.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/add.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/add.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-link,
+.cbi-button-up,
+.cbi-button-down {
+       border-color: #444;
+       color: #444;
 }
 
+.btn.primary,
+.cbi-button-action,
 .cbi-button-apply,
-.cbi-input-apply {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/apply.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/apply.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/apply.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/apply.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/apply.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/apply.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-reload,
+.cbi-button-edit {
+       border-color: #0069d6;
+       color: #0069d6;
 }
 
+.cbi-button-negative,
+.cbi-section-remove .cbi-button,
 .cbi-button-reset,
-.cbi-input-reset {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/reset.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/reset.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reset.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reset.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reset.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reset.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-edit,
-.cbi-input-edit {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/edit.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/edit.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/edit.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/edit.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/edit.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/edit.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-}
-
-.cbi-button-remove,
-.cbi-input-remove {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/remove.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/remove.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/remove.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/remove.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/remove.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/remove.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-remove {
+       border-color: #c44;
+       color: #c44;
 }
 
-.cbi-button-reload,
-.cbi-input-reload {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/reload.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/reload.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reload.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reload.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reload.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/reload.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.btn.primary,
+.cbi-button-action.important,
+.cbi-page-actions .cbi-button-apply,
+.cbi-section-actions .cbi-button-edit {
+       color: #fff;
+       background: #0069d6;
+       text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
 }
 
-.cbi-button-link,
-.cbi-input-link {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/link.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/link.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/link.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/link.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/link.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/link.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-button-positive.important,
+.cbi-page-actions .cbi-button-save {
+       color: #fff;
+       background: #4a4;
+       text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
 }
 
-.cbi-button-download,
-.cbi-input-download {
-       background-position: 6px center, left top;
-       padding-left: 28px;
-       background-image: url('../resources/cbi/download.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: url('../resources/cbi/download.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/download.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/download.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/download.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: url('../resources/cbi/download.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+.cbi-page-actions .cbi-button-apply + .cbi-button-save {
+       background: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+       text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.75);
+       color: #4a4;
+}
+
+.cbi-dropdown {
+       border: 1px solid #ccc;
+       border-radius: 3px;
+       display: inline-flex;
+       padding: 0;
+       cursor: pointer;
+       height: auto;
+       background: linear-gradient(#fff 0%, #e9e8e6 100%);
+       position: relative;
+       color: #404040;
+}
+
+.cbi-dropdown:focus {
+       outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+       margin: 0 !important;
+       padding: 0;
+       list-style: none;
+       overflow-x: hidden;
+       overflow-y: auto;
+       display: flex;
+       width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+       display: none;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+       flex-grow: 0;
+       flex-shrink: 0;
+       display: flex;
+       flex-direction: column;
+       justify-content: center;
+       text-align: center;
+       line-height: 2em;
+       padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+       color: #777;
+       font-weight: bold;
+       text-shadow: 1px 1px 0px #fff;
+       display: none;
+}
+
+.cbi-dropdown > ul > li {
+       display: none;
+       padding: .25em;
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       flex-shrink: 1;
+       flex-grow: 1;
+       align-items: center;
+       align-self: center;
+       color: #404040;
+       min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+       border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+       max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+       display: none;
+       margin: 0;
+       padding: 0;
+       pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+       vertical-align: middle;
+       margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+       margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+       height: 20px;
+}
+
+.cbi-dropdown[open] {
+       position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+       display: block;
+       background: #f6f6f5;
+       border: 1px solid #918e8c;
+       box-shadow: 0 0 4px #918e8c;
+       position: absolute;
+       z-index: 1000;
+       max-width: none;
+       min-width: 100%;
+       width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+       flex-grow: 1;
+       display: flex;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+       display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+       border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+       background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+       background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+       margin-bottom: 0;
+       border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+       pointer-events: none;
+       opacity: .6;
+}
+
+.cbi-tooltip-container {
+       cursor: help;
+}
+
+.cbi-tooltip {
+       position: absolute;
+       z-index: 1000;
+       left: -1000px;
+       opacity: 0;
+       transition: opacity .25s ease-out;
+}
+
+.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) {
+       left: auto;
+       opacity: 1;
+       transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+       padding: 1px;
+       background: inherit;
+       margin: -1.6em 0 0 -5px;
+       border-radius: 3px;
+       pointer-events: none;
+       box-shadow: 0 0 3px #444;
+}
+
+.zonebadge .cbi-tooltip > * {
+       margin: 1px;
+}
+
+.zone-forwards {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.zone-forwards > * {
+       flex: 1 1 40%;
+       padding: 1px;
+}
+
+.zone-forwards > span {
+       flex-basis: 10%;
+       text-align: center;
+}
+
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+       display: flex;
+       flex-direction: column;
 }
 
 .btn.active, .btn:active {
-       -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
        box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
 }
 
 .btn.disabled {
        cursor: default;
        background-image: none;
-       filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-       filter: alpha(opacity=65);
-       -khtml-opacity: 0.65;
-       -moz-opacity: 0.65;
        opacity: 0.65;
-       -webkit-box-shadow: none;
-       -moz-box-shadow: none;
        box-shadow: none;
 }
 
 .btn[disabled] {
        cursor: default;
        background-image: none;
-       filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-       filter: alpha(opacity=65);
-       -khtml-opacity: 0.65;
-       -moz-opacity: 0.65;
        opacity: 0.65;
-       -webkit-box-shadow: none;
-       -moz-box-shadow: none;
        box-shadow: none;
 }
 
@@ -1535,8 +1576,6 @@ footer {
        font-size: 15px;
        line-height: normal;
        padding: 9px 14px 9px;
-       -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
        border-radius: 6px;
 }
 
@@ -1545,50 +1584,6 @@ footer {
        font-size: 11px;
 }
 
-/* Button icons for specific pages */
-.Startup .cbi-section-table input.cbi-input-apply,
-.Startup .cbi-section-table input.cbi-button-apply {
-         background-image: url("../resources/cbi/apply.gif");
-         background-position: 7px 4px;
-         padding: 3px 9px 3px 27px;
-}
-
-.Processes .cbi-section-table input.cbi-input-reload,
-.Startup .cbi-section-table input.cbi-input-reload {
-         background-image: url("../resources/cbi/reload.gif");
-         background-position: 7px 4px;
-         padding: 3px 9px 3px 27px;
-}
-
-.Processes .cbi-section-table input.cbi-input-remove,
-.Processes .cbi-section-table div.cbi-section-remove input,
-.Startup .cbi-section-table input.cbi-input-remove,
-.Startup .cbi-section-table div.cbi-section-remove input  {
-         background-image: url("../resources/cbi/remove.gif");
-         background-position: 7px 4px;
-         padding: 3px 9px 3px 27px;
-}
-
-.Processes .cbi-section-table input.cbi-input-reset,
-.Processes .cbi-section-table input.cbi-button-reset,
-.Startup .cbi-section-table input.cbi-input-reset,
-.Startup .cbi-section-table input.cbi-button-reset  {
-         background-image: url("../resources/cbi/reset.gif");
-         background-position: 7px 4px;
-         padding: 3px 9px 3px 27px;
-}
-
-.Startup .cbi-section-table input.cbi-input-save,
-.Startup .cbi-section-table input.cbi-button-save {
-         background-image: url("../resources/cbi/save.gif");
-         background-position: 7px 4px;
-         padding: 3px 9px 3px 27px;
-}
-
-:root .alert-message, :root .btn {
-       border-radius: 0 0;
-}
-
 button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
        padding: 0;
        border: 0;
@@ -1601,47 +1596,30 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
        font-weight: bold;
        line-height: 13.5px;
        text-shadow: 0 1px 0 #ffffff;
-       filter: alpha(opacity=25);
-       -khtml-opacity: 0.25;
-       -moz-opacity: 0.25;
        opacity: 0.25;
 }
 
 .close:hover {
        color: #000000;
        text-decoration: none;
-       filter: alpha(opacity=40);
-       -khtml-opacity: 0.4;
-       -moz-opacity: 0.4;
        opacity: 0.4;
 }
 
-.alert-message, .errorbox {
+.alert-message {
        position: relative;
        padding: 7px 15px;
        margin-bottom: 18px;
        color: #404040;
        background-color: #eedc94;
        background-repeat: repeat-x;
-       background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));
-       background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
-       background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
-       background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));
-       background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
-       background-image: -o-linear-gradient(top, #fceec1, #eedc94);
        background-image: linear-gradient(to bottom, #fceec1, #eedc94);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);
        text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
        border-color: #eedc94 #eedc94 #e4c652;
        border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
        text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
        border-width: 1px;
        border-style: solid;
-       -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
        border-radius: 4px;
-       -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
        box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
 }
 
@@ -1677,8 +1655,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
 }
 
 .alert-message .btn {
-       -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
-       -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
 }
 
@@ -1690,8 +1666,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
        text-transform: uppercase;
        white-space: nowrap;
        background-color: #bfbfbf;
-       -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
        border-radius: 3px;
        text-shadow: none;
 }
@@ -1761,10 +1735,26 @@ header .pull-right { padding-top: 8px; }
        font-weight: normal;
 }
 
+.cbi-section-table-titles.named::before,
+.cbi-section-table-descr.named::before,
+.cbi-section-table-row[data-title]::before {
+       content: attr(data-title) " ";
+       display: table-cell;
+       padding: 10px 10px 9px;
+       line-height: 18px;
+       font-weight: bold;
+}
+
+.cbi-section-table-row[data-title]::before {
+       border-top: 1px solid #ddd;
+}
+
 .left { text-align: left !important; }
 
 .right { text-align: right !important; }
 
+.center { text-align: center !important; }
+
 .cbi-value-field { line-height: 1.5em; }
 
 .cbi-value-field input[type=checkbox],
@@ -1778,28 +1768,32 @@ table table td,
        border: none;
 }
 
-table.cbi-section-table input,
-table.cbi-section-table textarea,
-table.cbi-section-table select {
+.table.cbi-section-table input,
+.table.cbi-section-table textarea,
+.table.cbi-section-table select {
        width: auto;
 }
 
-table.cbi-section-table td.cbi-section-table-cell {
+.table.cbi-section-table .td.cbi-section-table-cell {
        white-space: nowrap;
        text-align: right;
 }
 
-table.cbi-section-table td.cbi-section-table-cell select {
+.table.cbi-section-table .td.cbi-section-table-cell select {
        width: inherit;
 }
 
-table.valign-middle td {
+.table.valign-middle .td {
        vertical-align: middle;
 }
 
-.cbi-value-description { display: inline; }
-
-.cbi-value-description img { vertical-align: middle; }
+.cbi-value-description {
+       background-image: url(/luci-static/resources/cbi/help.gif);
+       background-position: .25em .2em;
+       background-repeat: no-repeat;
+       margin: .25em 0 0 0;
+       padding: 0 0 0 1.7em;
+}
 
 .cbi-section-error {
        border: 1px solid #FF0000;
@@ -1821,25 +1815,24 @@ table.valign-middle td {
        margin: 0 10px;
        text-align: center;
        white-space: nowrap;
-       background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
        background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-       -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
        border-radius: 4px;
-       -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
        box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+       display: inline-flex;
+       flex-direction: column;
+       line-height: 1.2em;
+       min-width: 100px;
 }
 
 .ifacebox .ifacebox-head {
        border-bottom: 1px solid #CCCCCC;
        padding: 2px;
+       background: #eee;
+}
+
+.ifacebox .ifacebox-head.active {
+       background: #90c0e0;
 }
 
 .ifacebox .ifacebox-body {
@@ -1847,33 +1840,25 @@ table.valign-middle td {
 }
 
 .ifacebadge {
-       display: inline-block;
+       display: inline-flex;
+       flex-direction: row;
        white-space: nowrap;
        background-color: #FFFFFF;
        border: 1px solid #CCCCCC;
        padding: 2px;
-       margin-left: 2px;
-       background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-       background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
        background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-       -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
        border-radius: 4px;
-       -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
        box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
        cursor: default;
+       line-height: 1.2em;
 }
 
 .ifacebadge img {
        width: 16px;
        height: 16px;
        vertical-align: middle;
+       margin-right: .25em;
 }
 
 .ifacebadge-active {
@@ -1881,6 +1866,40 @@ table.valign-middle td {
        font-weight: bold;
 }
 
+.network-status-table {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox {
+       margin: .5em;
+       flex-grow: 1;
+}
+
+.network-status-table .ifacebox-body {
+       display: flex;
+       flex-direction: column;
+       height: 100%;
+       text-align: left;
+}
+
+.network-status-table .ifacebox-body > span {
+       flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.ifacebadge.large,
+.network-status-table .ifacebox-body .ifacebadge {
+       flex: 1;
+       margin: .5em .25em 0 .25em;
+       padding: .5em;
+       min-width: 220px;
+}
+
 .zonebadge {
        padding: 2px;
        border-radius: 4px;
@@ -1888,12 +1907,11 @@ table.valign-middle td {
        white-space: nowrap;
        color: #666666;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-       cursor: pointer;
 }
 
 .zonebadge > em,
 .zonebadge > strong {
-       margin: 5px;
+       margin: 0 2px;
        display: inline-block;
 }
 
@@ -1901,6 +1919,10 @@ table.valign-middle td {
        width: 6em;
 }
 
+.zonebadge > .ifacebadge {
+       margin-left: 2px;
+}
+
 .zonebadge-empty {
        border: 1px dashed #AAAAAA;
        color: #AAAAAA;
@@ -1909,7 +1931,7 @@ table.valign-middle td {
 }
 
 div.cbi-value var,
-td.cbi-value-field var {
+.td.cbi-value-field var {
        font-style: italic;
        color: #0069D6;
 }
@@ -1945,12 +1967,14 @@ td.cbi-value-field var {
        display: block;
        font-style: normal;
        padding: 2px;
+       line-height: 19px;
+       white-space: pre;
 }
 
 .uci-change-list var ins,
 .uci-change-list var del {
-       /*display: inline;*/
-       border: none;
+       display: inline;
+       /*border: none;*/
        white-space: pre;
        font-style: normal;
        padding: 0px;
@@ -1980,3 +2004,7 @@ td.cbi-value-field var {
        line-height: 6px;
        border: none;
 }
+
+html body.apply-overlay-active {
+       height: calc(100vh - 63px);
+}
diff --git a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js b/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js
deleted file mode 100644 (file)
index 1ec510f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed
-// Uncompressed source: https://github.com/aFarkas/html5shiv
-(function(a,b){function f(a){var c,d,e,f;b.documentMode>7?(c=b.createElement("font"),c.setAttribute("data-html5shiv",a.nodeName.toLowerCase())):c=b.createElement("shiv:"+a.nodeName);while(a.firstChild)c.appendChild(a.childNodes[0]);for(d=a.attributes,e=d.length,f=0;f<e;++f)d[f].specified&&c.setAttribute(d[f].nodeName,d[f].nodeValue);c.style.cssText=a.style.cssText,a.parentNode.replaceChild(c,a),c.originalElement=a}function g(a){var b=a.originalElement;while(a.childNodes.length)b.appendChild(a.childNodes[0]);a.parentNode.replaceChild(b,a)}function h(a,b){b=b||"all";var c=-1,d=[],e=a.length,f,g;while(++c<e){f=a[c],g=f.media||b;if(f.disabled||!/print|all/.test(g))continue;d.push(h(f.imports,g),f.cssText)}return d.join("")}function i(c){var d=new RegExp("(^|[\\s,{}])("+a.html5.elements.join("|")+")","gi"),e=c.split("{"),f=e.length,g=-1;while(++g<f)e[g]=e[g].split("}"),b.documentMode>7?e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,'$1font[data-html5shiv="$2"]'):e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,"$1shiv\\:$2"),e[g]=e[g].join("}");return e.join("{")}var c=function(a){return a.innerHTML="<x-element></x-element>",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x<style>","article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}","audio{display:none}","canvas,video{display:inline-block;*display:inline;*zoom:1}","[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}","mark{background:#FF0;color:#000}","</style>"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e;if(c||!a.attachEvent)return;a.attachEvent("onbeforeprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;b.namespaces.shiv||b.namespaces.add("shiv");var c=-1,d=new RegExp("^("+a.html5.elements.join("|")+")$","i"),e=b.getElementsByTagName("*"),g=e.length,j,k=i(h(function(a,b){var c=[],d=a.length;while(d)c.unshift(a[--d]);d=b.length;while(d)c.unshift(b[--d]);c.sort(function(a,b){return a.sourceIndex-b.sourceIndex}),d=c.length;while(d)c[--d]=c[d].styleSheet;return c}(b.getElementsByTagName("style"),b.getElementsByTagName("link"))));while(++c<g)j=e[c],d.test(j.nodeName)&&f(j);b.appendChild(b._shivedStyleSheet=b.createElement("style")).styleSheet.cssText=k}),a.attachEvent("onafterprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;var c=-1,d=b.getElementsByTagName("*"),e=d.length,f;while(++c<e)f=d[c],f.originalElement&&g(f);b._shivedStyleSheet&&b._shivedStyleSheet.parentNode.removeChild(b._shivedStyleSheet)})})(this,document)
\ No newline at end of file
index 4881535acb271a30b75d6746e3ff5e473c2427e0..aaacf56b844967807850090fcc509cd68b0fdfb4 100644 (file)
        <head>
                <meta charset="utf-8">
                <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
-               <!--[if lt IE 9]><script src="<%=media%>/html5.js"></script><![endif]-->
                <meta name="viewport" content="initial-scale=1.0">
                <link rel="stylesheet" href="<%=media%>/cascade.css">
                <link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="<%=media%>/mobile.css" type="text/css" />
                        </div>
                </header>
 
-               <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
-                       <div class="container">
+               <div id="maincontent" class="container">
+                       <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
                                <div class="alert-message warning">
                                        <h4><%:No password set!%></h4>
-                                       <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
-                                       <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+                                       <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+                                       <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
                                </div>
-                       </div>
-               <%- end -%>
+                       <%- end -%>
 
-               <noscript>
-                       <div class="alert-message warning">
-                               <strong><%:JavaScript required!%></strong><br />
-                               <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
-                       </div>
-               </noscript>
+                       <noscript>
+                               <div class="alert-message warning">
+                                       <h4><%:JavaScript required!%></h4>
+                                       <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
+                               </div>
+                       </noscript>
 
-               <div id="maincontent" class="container">
                        <% if category then render_tabmenu(category, cattree) end %>
diff --git a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg b/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg
deleted file mode 100644 (file)
index 822527e..0000000
Binary files a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg and /dev/null differ
index ed97427c917d31612645a5b9a5cf1afd9b8d1b57..d5e87ebef0643b25c515e3ecdb96bee1c7e12714 100644 (file)
@@ -9,7 +9,7 @@ html {
 
 body {
        color: #ccc;
-       background:#e5eef5 url(bg.jpg) repeat-x top left;
+       background: #e5eef5 linear-gradient(#fff 0%, #e5eef5 100%) no-repeat;
        font-family: Verdana, Arial, sans-serif;
        font-size: 100%;
        line-height: 100%;
@@ -23,6 +23,42 @@ html, body {
 * {
        margin: 0;
        padding: 0;
+       box-sizing: border-box;
+}
+
+.table { display: table; width: 100%; position: relative; }
+.tr { display: table-row; }
+.thead { display: table-header-group; }
+.tbody { display: table-row-group; }
+.tfoot { display: table-footer-group; }
+.td, .th { display: table-cell; }
+.th { font-weight: bold; }
+
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
+.col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; }
+.col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; }
+.col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; }
+.col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; }
+.col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; }
+.col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; }
+.col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; }
+.col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; }
+.col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; }
+.col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; }
+
+.tr.placeholder {
+       height: 3.5em;
+}
+
+.tr.placeholder > .td {
+       position: absolute;
+       left: 1px;
+       right: 1px;
+       bottom: 1px;
+       text-align: center;
+       line-height: 3em;
 }
 
 abbr,
@@ -49,6 +85,34 @@ code {
        white-space: pre;
 }
 
+h2, h3, h4, legend {
+       font-size: 150%;
+       font-family: Trebuchet MS, Verdana, sans-serif;
+       font-weight: bold;
+       margin: .25em 0 .5em 0;
+       border-bottom: 1px solid;
+       padding-bottom: 4px;
+       display: block;
+       width: 100%;
+}
+
+h3, legend {
+       font-size: 125%;
+}
+
+h4 {
+       font-size: 112%;
+}
+
+.cbi-section-node + h4 {
+       margin-top: 1em;
+}
+
+fieldset { border: none; }
+
+fieldset > legend { float: left; }
+fieldset > legend + * { clear: both; }
+
 #maincontent ul {
        margin-left: 2em;
 }
@@ -85,37 +149,63 @@ a img {
        background-color: white;
 }
 
-.errorbox {
-       border: 1px solid #F00;
-       background-color: #FCC;
-       padding: 5px;
+.alert-message {
+       font-weight: normal;
+       padding: .5em;
+       border-radius: 3px;
+       color: #000;
 }
 
+.alert-message.notice {
+       background: linear-gradient(#ccc 0%, #eee 100%);
+       color: #4a6b7c;
+}
 
-.ifacebox {
-       background-color: #FFFFFF;
-       border: 1px solid #CCCCCC;
-       margin: 0 10px;
-       text-align: center;
-       white-space: nowrap;
+.alert-message.warning {
+       background: linear-gradient(#dda 0%, #dd8 100%);
+       color: #c00;
 }
 
-.ifacebox .ifacebox-head {
-       border-bottom: 1px solid #CCCCCC;
-       padding: 2px;
+.alert-message > * {
+       margin: .5em;
 }
 
-.ifacebox .ifacebox-body {
-       padding: 2px;
+.alert-message > h4 {
+       font-weight: bold;
 }
 
 
-.ifacebadge {
-       background-color: #FFFFFF;
-       border: 1px solid #CCCCCC;
+.ifacebadge, .ifacebox {
+       display: inline-flex;
+       align-content: center;
+       border: 1px solid #ccc;
+       border-radius: 3px;
        padding: 2px;
-       margin-left: 2px;
+       background: #fff;
+       margin: .25em .5em;
+}
+
+.ifacebox-head {
+       background: #eee;
+}
+
+.ifacebox-head.active {
+       background: #90c0e0;
+}
+
+.ifacebadge, .zonebadge {
+       align-items: center;
+}
+
+.ifacebadge > * {
+       align-self: flex-start;
+}
+
+.ifacebadge > img,
+.ifacebadge > em {
+       margin-right: 5px;
        display: inline-block;
+       height: 16px;
 }
 
 .ifacebadge-active {
@@ -123,18 +213,70 @@ a img {
        font-weight: bold;
 }
 
+.ifacebox {
+       flex-direction: column;
+       margin: 0;
+       padding: 0;
+       min-width: 100px;
+       text-align: center;
+}
+
+.ifacebox > * {
+       padding: 2px;
+}
+
+.td > .ifacebadge,
+.td > .zonebadge {
+       margin: 0;
+       vertical-align: top;
+}
+
+.network-status-table {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox {
+       margin: .5em;
+       font-size: 90%;
+       flex-grow: 1;
+}
+
+.network-status-table .ifacebox-body {
+       display: flex;
+       flex-direction: column;
+       flex: 1 0;
+}
+
+.network-status-table .ifacebox-body > span {
+       flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.ifacebadge.large,
+.network-status-table .ifacebox-body .ifacebadge {
+       flex: 1;
+       margin: .5em .25em .25em .25em;
+       padding: .5em;
+       min-width: 220px;
+       white-space: nowrap;
+}
+
 
 .zonebadge {
        padding: 2px;
        display: inline-block;
        white-space: nowrap;
-       cursor: pointer;
+       border-radius: 3px;
 }
 
-.zonebadge em,
-.zonebadge strong {
+.zonebadge em,
+.zonebadge strong {
        margin: 3px;
-       display: inline-block;
 }
 
 .zonebadge input {
@@ -142,6 +284,18 @@ a img {
        height: 1.5em;
 }
 
+.zonebadge .ifacebadge,
+.cbi-dropdown .ifacebadge {
+       margin: 1px;
+}
+
+.zonebadge .ifacebadge img,
+.zonebadge .ifacebadge em,
+.cbi-dropdown .ifacebadge img,
+.cbi-dropdown .ifacebadge em {
+       margin: 0 1px;
+}
+
 .zonebadge-empty {
        border: 1px dashed #AAAAAA;
        color: #AAAAAA;
@@ -150,6 +304,7 @@ a img {
 }
 
 
+
 #header {
        height: auto;
        background: #FFF url(header.jpg) repeat-x left bottom;
@@ -158,9 +313,12 @@ a img {
        text-align:right;
 }
 
+.header_left {
+       padding-bottom: 10px;
+}
+
 .header_left img {
        padding: 10px 10px 0px 10px;
-       margin-bottom: 10px;
 }
 
 .header_banner {
@@ -173,15 +331,15 @@ a img {
        padding: 0px;
 }
 
-.header_left{
+.header_left {
        text-align:left;
        max-width: 50%;
        float:left;
 }
 
-.header_left a{
+.header_left a {
        color: #dc0067;
-       font: bold 36px Helvetica;
+       font: bold 36px Helvetica, Verdana, Arial, sans-serif;
        text-decoration: none;
 }
 
@@ -454,53 +612,15 @@ textarea#syslog {
        font-size: 80%;
 }
 
-#maincontent h2 {
-       font:normal bold 150% "Trebuchet MS", Verdana, sans-serif;
-       margin: 0.25em 0 0.7em 0;
-       border-bottom: 1px solid;
-       padding: 10px 0 4px 0;
-       color: #404040;
-}
-
-#maincontent h3 {
-       margin: 0.5em 0 1.1em 0;
-       font:italic bold 125% "Trebuchet MS", Verdana, sans-serif;
-       color: #404040;
-}
-
 #maincontent p {
        margin-bottom: 1em;
 }
 
 .cbi-section {
-       margin-bottom: 0.5em;
-       padding: 0.5em 1em;
-       border: 1px dotted #555;
-       background-color: #fff;
+       margin-bottom: 1.5em;
        color: #000;
 }
 
-.cbi-section legend {
-       font-size: 110%;
-       font-weight: bold;
-       height: 1em;
-       padding: 0.5em 0.25em;
-       background-color: transparent;
-       color: #404040 ;
-}
-
-.cbi-section h2 {
-       margin: 0em 0 0.5em -0.5em !important;
-}
-
-.cbi-section h3 {
-       text-decoration: none !important;
-       font-weight: bold !important;
-       color: #555 !important;
-       margin: 0.25em !important;
-       font-size: 100% !important;
-}
-
 .cbi-section-descr {
        margin-bottom: 0.5em;
        font-size: 95%;
@@ -519,46 +639,52 @@ ul.cbi-apply {
 }
 
 ul.cbi-tabmenu {
-       padding: 3px 0;
-       margin-left: 0 !important;
-       margin-bottom: -1px;
        list-style-type: none;
+       display: flex;
+       margin: 0 0 .5em 0 !important;
+       padding: 0 0 0 5px;
+       border-bottom: 1px solid #bbb;
 }
 
-ul.cbi-tabmenu li.cbi-tab,
-ul.cbi-tabmenu li.cbi-tab-disabled {
-       display: inline;
-       margin: 0;
+ul.cbi-tabmenu li {
+       display: inline-flex;
+       margin: 0 5px -1px 0;
+       flex: 0 1 auto;
+       border: 1px solid #bbb;
+       border-bottom: none;
+       border-radius: 3px 3px 0 0;
+       background: linear-gradient(#ddd 90%, #aaa 100%);
+       color: #888;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       word-wrap: break-word;
 }
 
-ul.cbi-tabmenu li.cbi-tab a,
-ul.cbi-tabmenu li.cbi-tab-disabled a {
+ul.cbi-tabmenu li a,
+ul.cbi-tabmenu li a:hover {
        text-decoration: none;
-       padding: 3px 7px;
-       margin-right: 3px;
-       border: 1px dotted #bbb;
-       border-bottom: none;
-       background-color: #eee;
-       color: #bbb;
+       color: inherit;
+       padding: 5px;
+       flex: 1;
+       width: 100%;
+       height: 100%;
 }
 
-ul.cbi-tabmenu li.cbi-tab-highlighted {
+ul.cbi-tabmenu li.cbi-tab-highlighted {
        color: #000;
-       background-color: #FFEEAA;
+       background: #fea;
 }
 
-ul.cbi-tabmenu li a:hover {
+ul.cbi-tabmenu li.cbi-tab {
        color: #000;
+       background: #fff;
 }
 
-ul.cbi-tabmenu li.cbi-tab a {
-       position: relative;
-       top: 1px;
-       padding-top: 4px;
-       color: #000;
-       background-color: #fff;
+ul.cbi-tabmenu + .cbi-section-node {
+       margin-top: -.5em;
 }
 
+
 div.cbi-tab-descr {
        background-image: url(/luci-static/resources/cbi/help.gif);
        background-position: 0.25em 50%;
@@ -601,151 +727,126 @@ select,
 input[type=text],
 input[type=password] {
        width: 20em;
+       font-size: inherit;
+       line-height: 13pt;
+       height: 14pt;
 }
 
-td select,
-td input[type=text],
-td input[type=password] {
-       width: 99%;
+select[multiple] {
+       height: auto;
 }
 
-img.cbi-image-button {
-       cursor: pointer;
-       margin: 0 2px;
+input[type=radio],
+input[type=checkbox],
+[data-dynlist] > input + img,
+input.cbi-input-password + img {
        vertical-align: middle;
 }
 
-input.cbi-input-user {
-       background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       text-indent: 17px;
-}
-
-input.cbi-input-password {
-       background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       text-indent: 17px;
-}
-
-input.cbi-input-find,
-input.cbi-button-find {
-       background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding-left: 17px;
-       border: none;
-}
-
-input.cbi-input-reload {
-       background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding-left: 17px;
-}
-
-input.cbi-button{
-       margin-top: 1.3em;
+.td select,
+.td .cbi-dropdown,
+.td input[type=text] {
+       width: 100%;
 }
 
-input.cbi-input-add,
-input.cbi-button-add {
-       background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
-       border: 1px solid #FFF;
+.td [data-dynlist] > input,
+.td input.cbi-input-password {
+       width: calc(100% - 20px);
 }
 
-input.cbi-input-fieldadd,
-input.cbi-button-fieldadd {
-       background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
+img.cbi-image-button {
+       cursor: pointer;
+       margin: 0 2px;
+       vertical-align: middle;
 }
 
-input.cbi-input-reset,
-input.cbi-button-reset {
-       background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
-       background-color: inherit;
+.btn, .cbi-button {
+       padding: 0 .5em;
+       border-radius: 3px;
+       border: 1px solid #aaa;
+       text-decoration: none;
        color: #000;
-       padding: 0 1px 0 17px;
-}
-
-
+       display: inline-block;
+       font-size: inherit;
+       -webkit-appearance: none;
+       background: #fff;
+       text-align: center;
+       font-weight: bold;
+       line-height: 13pt;
+       height: 14pt;
 }
 
-input.cbi-input-save,
-input.cbi-button-save {
-       background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
+.btn:hover, .cbi-button:hover {
+       box-shadow: 0 0 3px #59d;
 }
 
-input.cbi-input-apply,
-input.cbi-button-apply {
-       background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
+.btn[disabled],
+.btn[disabled]:hover,
+.cbi-button[disabled],
+.cbi-button[disabled]:hover {
+       opacity: .6;
+       cursor: default;
+       pointer-events: none;
 }
 
-input.cbi-input-link,
-input.cbi-button-link {
-       background: url('../resources/cbi/link.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
-       border: none;
+.cbi-button-positive,
+.cbi-button-fieldadd,
+.cbi-button-add,
+.cbi-button-save {
+       border-color: #7b7;
+       color: #7b7;
 }
 
-input.cbi-input-download,
-input.cbi-button-download {
-       background: url('../resources/cbi/download.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
-       border: none;
+.cbi-button-neutral,
+.cbi-button-reset,
+.cbi-button-download,
+.cbi-button-find,
+.cbi-button-link,
+.cbi-button-up,
+.cbi-button-down {
+       border-color: #444;
+       color: #444;
 }
 
-input.cbi-input-remove,
-div.cbi-section-remove input {
-       background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
-       background-color: inherit;
-       color: #000;
-       padding: 0 1px 0 17px;
-       border: 1px solid #fff;
+.cbi-button-action,
+.cbi-button-apply,
+.cbi-button-reload,
+.cbi-button-edit {
+       border-color: #59d;
+       color: #59d;
 }
 
-input.cbi-button-up {
-       background-image: url('../resources/cbi/up.gif');
-       padding: 0 1px 0 11px;
+.cbi-button-negative,
+.cbi-section-remove .cbi-button,
+.cbi-button-remove {
+       border-color: #b77;
+       color: #b77;
 }
 
-input.cbi-button-down {
-       background-image: url('../resources/cbi/down.gif');
-       padding: 0 1px 0 11px;
+.cbi-button-action.important,
+.cbi-page-actions .cbi-button-apply,
+.cbi-section-actions .cbi-button-edit {
+       color: #fff;
+       background: #59d;
 }
 
-input.cbi-button-edit {
-       background: url('../resources/cbi/edit.gif') no-repeat scroll 1px center;
-       color: #000000;
-       padding: 0 1px 0 17px;
+.cbi-button-positive.important,
+.cbi-page-actions .cbi-button-save {
+       color: #fff;
+       background: #7b7;
 }
 
-input.cbi-button-reload {
-       background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
-       color: #000000;
-       padding: 0 1px 0 17px;
+.cbi-page-actions .cbi-button-apply + .cbi-button-save {
+       background: #fff;
+       color: #7b7;
 }
 
-input.cbi-button-remove {
-       background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
-       color: #000000;
-       padding: 0 1px 0 17px;
+.cbi-input-invalid {
+       background-image: url('../resources/cbi/reset.gif');
+       background-repeat: no-repeat;
+       background-position: right;
+       color: #FF0000 !important;
+       border-color: #FF0000;
 }
 
 .cbi-input-invalid {
@@ -765,18 +866,12 @@ textarea {
        margin-bottom: 0.5em;
 }
 
-form > div > input[type=submit],
-form > div > input[type=reset] {
-       float: right;
-       margin-left: 0.5em;
-}
-
-table td,
-table th {
-       color: #000;
+.table .td, .table .th {
+       color: #000000;
+       padding: .25em;
 }
 
-table.smalltext {
+.table.smalltext {
        background: #f5f5f5;
        color: #000;
        border: 1px solid #666;
@@ -787,48 +882,62 @@ table.smalltext {
        border-collapse: collapse;
 }
 
-table.smalltext tr:hover td {
+.table.smalltext .tr:hover .td {
        background-color: #bbddee;
        color: #000;
 }
 
-table.smalltext tr th {
+.table.smalltext .tr .th {
        padding: 0 0.25em;
        border-left: 1px dotted #666;
        text-align: left;
 }
 
-table.smalltext tr td {
+.table.smalltext .tr .td {
        padding: 0.2em;
        border-top: 1px dotted #666;
        border-left: 1px dotted #666;
 }
 
-table.cbi-section-table .cbi-rowstyle-1 {
-       background-color: #f1f6fa;
-       color: #000;
+.cbi-section-node .tr:not(.placeholder):nth-child(even) {
+       background: #e5eef5;
 }
 
-table.cbi-section-table .cbi-rowstyle-1:hover,
-table.cbi-section-table .cbi-rowstyle-2:hover {
-       background-color: #b2c8d4;
-       color: #000000;
-}
-
-table.cbi-section-table .cbi-section-table-cell {
+.table.cbi-section-table .cbi-section-table-cell {
        padding: 3px;
        white-space: nowrap;
 }
 
-.cbi-section .cbi-rowstyle-1 h3 {
-       background-color: #f1f6fa;
-       color: #555;
+.table .tr > .th:empty {
+       display: none;
 }
 
-.cbi-rowstyle-2 {
-       color: #000;
+.table.cbi-section-table .tr > *,
+.table.cbi-section-table .tr[data-title]::before {
+       border-top: 1px dotted #bbb;
+       display: table-cell;
+}
+
+.table.cbi-section-table .tr.table-titles > *,
+.table.cbi-section-table .tr.cbi-section-table-titles > *,
+.table.cbi-section-table .tr.cbi-section-table-desc > *,
+.table.cbi-section-table .tr.table-titles::before,
+.table.cbi-section-table .tr.cbi-section-table-titles::before,
+.table.cbi-section-table .tr.cbi-section-table-desc::before {
+       border-top: none;
 }
 
+.table.cbi-section-table .tr:hover::before,
+.table.cbi-section-table .tr:hover > * {
+       background: #eee;
+}
+
+.table.cbi-section-table .tr:nth-child(even):hover::before,
+.table.cbi-section-table .tr:nth-child(even):hover > * {
+       background: #bde;
+}
+
+
 div.cbi-value {
        clear: left;
        vertical-align: middle;
@@ -847,34 +956,49 @@ div.cbi-value:hover {
        line-height: 1.8em;
 }
 
-div.cbi-value-field {
+.cbi-value-field {
        width: 58%;
        margin-left: 40%;
        padding: 0.25em 0;
 }
 
-div.cbi-value-description {
-       font-size: 90%;
-       display: inline;
+.td.cbi-value-field {
+       width: auto;
+       margin-left: 0;
+       align-self: center;
 }
 
-div.cbi-section-create {
-       clear: left;
-       white-space: nowrap;
-       vertical-align: top;
+.cbi-value-description {
+       background-image: url(/luci-static/resources/cbi/help.gif);
+       background-position: .25em .25em;
+       background-repeat: no-repeat;
+       margin: .25em 0 0 0;
+       padding: .25em .25em .25em 1.75em;
 }
 
-div.cbi-tblsection-create {
-       border-bottom: 1px dotted #bbb;
+.cbi-section-create {
+       padding: 0 0 .25em 0;
+       margin: -3px;
+       display: inline-flex;
+       align-items: center;
+}
+
+.cbi-section-create > * {
+       margin: 3px;
+       flex: 1 1 auto;
+}
+
+.cbi-section-create > * > input {
+       width: 100%;
 }
 
-div.cbi-section-create .cbi-button {
-       margin: 0.25em;
+.cbi-section-remove > .cbi-button {
+       margin-bottom: -1px;
+       border-radius: 3px 3px 0 0;
 }
 
-input.cbi-section-create-name {
-       margin-right: -0.25em;
-       border: 1px solid #999;
+.cbi-section-node + .cbi-section-create {
+       padding-top: 0;
 }
 
 div.cbi-map-descr {
@@ -886,46 +1010,147 @@ div.cbi-optionals {
        border-bottom: 1px dotted #bbb;
 }
 
-div.cbi-section-remove {
-       float: right;
-}
+
 
 .cbi-section-node {
        clear: both;
-       border: 1px dotted #bbb;
-       border-bottom: none;
        padding-bottom: 0;
+       position: relative;
+       border: 1px dotted #555;
+       background: #fff;
+       margin-bottom: 5px;
 }
 
-.cbi-section-node table div {
-       padding-bottom: 0;
-       border-bottom: none;
+.cbi-section-node-tabbed {
+       border-top: none;
 }
 
-.cbi-section-node div.cbi-section-table-row {
-       margin: 0.25em;
+.cbi-section-node .cbi-optionals:last-child,
+.cbi-section-node .cbi-value:last-child {
+       border-bottom: none;
 }
 
-table.cbi-section-table {
+.table.cbi-section-table {
        width: 100%;
        font-size: 95%;
+       border: 1px dotted #444;
+       background: #fff;
+       margin: 0 0 .5em 0;
 }
 
-table.cbi-section-table th,
-table.cbi-section-table td {
-       text-align: center;
+.cbi-section-node > .table.cbi-section-table {
+       border: none;
+       margin: 0;
 }
 
-tr.cbi-section-table-descr th {
-       font-weight: bold;
+@keyframes flash {
+       0% { opacity: 1; }
+       50% { opacity: .5; }
+       100% { opacity: 1; }
+}
+
+.tr.cbi-section-table-row.flash {
+       animation: flash .35s;
+}
+
+.tr.cbi-section-table-descr .th {
+       font-weight: normal;
        font-size: 90%;
+       vertical-align: top;
 }
 
-td.cbi-section-table-optionals {
+.td.cbi-section-table-optionals {
        text-align: left !important;
        padding-top: 1em;
 }
 
+.th.cbi-section-actions,
+.td.cbi-section-actions {
+       display: flex;
+       justify-content: flex-end;
+       flex-direction: row;
+       flex: 1 1 150px;
+       margin: auto 0 auto auto;
+}
+
+.td.cbi-section-actions > form {
+       display: flex;
+}
+
+.td.cbi-section-actions > *,
+.td.cbi-section-actions > form > * {
+       flex: 1 1 4em;
+       margin: 1px;
+}
+
+.cbi-page-actions {
+       display: flex;
+       justify-content: flex-end;
+       margin: -3px;
+       padding: 0 .25em .25em .25em;
+}
+
+.cbi-page-actions > form {
+       display: flex;
+}
+
+.cbi-page-actions > * {
+       flex: 0 1 auto;
+       margin: 3px;
+}
+
+.cbi-page-actions > form > * {
+       flex: 1;
+       margin: 0 3px 0 0;
+}
+
+.cbi-page-actions > .cbi-button-link,
+.cbi-page-actions > form[method="get"]:first-child {
+       margin-right: auto;
+}
+
+
+.th[data-type="button"], .td[data-type="button"],
+.th[data-type="fvalue"], .td[data-type="fvalue"] {
+       flex: 1 1 2em;
+       text-align: center;
+}
+
+#cbi-network-switch_vlan .th,
+#cbi-network-switch_vlan .td {
+       flex-basis: 12%;
+}
+
+#cbi-wireless-overview .td:first-child {
+       align-self: center;
+}
+
+.td[data-title]::before {
+       content: attr(data-title) ":\20";
+       font-weight: bold;
+       text-align: left;
+       display: none;
+       padding: 1px;
+       white-space: nowrap;
+}
+
+.tr.placeholder .td[data-title]::before {
+       display: none;
+}
+
+.tr[data-title]::before,
+.tr.cbi-section-table-titles.named::before {
+       content: attr(data-title) "\20";
+       font-weight: bold;
+       text-align: left;
+       display: inline-block;
+       align-self: center;
+       flex: 1 1 5%;
+       padding: .25em;
+       white-space: normal;
+       word-wrap: break-word;
+}
+
 .cbi-value-helpicon img {
        vertical-align: bottom;
 }
@@ -956,14 +1181,241 @@ td.cbi-value-error {
        padding: 3px;
 }
 
-.left {
+
+.cbi-dropdown {
+       border: 1px solid #ccc;
+       display: inline-flex;
+       cursor: pointer;
+       background: #fff;
+       position: relative;
+       padding: 0;
+       color: #000;
+       min-width: 20em;
+       max-width: 100%;
+}
+
+.cbi-dropdown:focus {
+       outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+       margin: 0 !important;
+       padding: 0;
+       list-style: none;
+       overflow-x: hidden;
+       overflow-y: auto;
+       display: flex;
+       width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+       display: none;
+}
+
+.cbi-dropdown > .open {
+       background: #eee;
+       border: 2px outset #eee;
+       flex-basis: 15px;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+       flex-grow: 0;
+       flex-shrink: 0;
+       display: flex;
+       flex-direction: column;
+       justify-content: center;
+       text-align: center;
+       line-height: 2em;
+       padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+       color: #777;
+       font-weight: bold;
+       text-shadow: 1px 1px 0px #fff;
+       display: none;
+}
+
+.cbi-dropdown > ul > li {
+       display: none;
+       padding: .25em;
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       flex-shrink: 1;
+       flex-grow: 1;
+       align-items: center;
+       align-self: center;
+       min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+       border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+       max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+       display: none;
+       margin: 0;
+       padding: 0;
+       pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+       vertical-align: middle;
+       margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+       margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+       height: 20px;
+}
+
+.cbi-dropdown[open] {
+       position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+       display: block;
+       background: #f6f6f5;
+       border: 1px solid #918e8c;
+       box-shadow: 0 0 4px #918e8c;
+       position: absolute;
+       z-index: 1000;
+       max-width: none;
+       min-width: 100%;
+       width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+       flex-grow: 1;
+       display: flex;
+       align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+       display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+       border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+       background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+       background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+       margin-bottom: 0;
+       border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+       pointer-events: none;
+       opacity: .6;
+}
+
+
+.cbi-tooltip-container {
+       cursor: help;
+}
+
+.cbi-tooltip {
+       position: absolute;
+       z-index: 1000;
+       left: -1000px;
+       opacity: 0;
+       transition: opacity .25s ease-out;
+       pointer-events: none;
+       box-shadow: 0 0 2px #444;
+}
+
+.cbi-tooltip-container:hover .cbi-tooltip {
+       left: auto;
+       opacity: 1;
+       transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+       padding: 1px;
+       background: inherit;
+       margin: -1.6em 0 0 -5px;
+}
+
+
+.zone-forwards {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.zone-forwards > * {
+       flex: 1 1 45%;
+       padding: 1px;
+}
+
+.zone-forwards > span {
+       flex-basis: 10%;
+       text-align: center;
+}
+
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+       display: flex;
+       flex-direction: column;
+}
+
+
+.left, .left::before {
        text-align: left !important;
 }
 
-.right {
+.right, .right::before {
        text-align: right !important;
 }
 
+.center, .center::before {
+       text-align: center !important;
+}
+
+.td.bottom {
+       align-self: flex-end;
+}
+
+.td.top {
+       align-self: flex-start;
+}
+
+.td.middle {
+       align-self: center;
+}
+
+
 .footer, .push {
        height: 2em;
 }
@@ -1070,3 +1522,246 @@ td.cbi-value-error {
 }
 
 }
+
+@media screen and (max-width: 992px) {
+       body {
+               -webkit-text-size-adjust: 100%;
+       }
+
+       #maincontent {
+               width: 100%;
+       }
+
+       .table {
+               display: flex;
+               flex-direction: column;
+               width: 100%;
+       }
+
+       .tr {
+               display: flex;
+               flex-direction: row;
+               flex-wrap: wrap;
+               align-items: flex-end;
+       }
+
+       .th, .td {
+               flex: 2 2 25%;
+               align-self: flex-start;
+               overflow: hidden;
+               text-overflow: ellipsis;
+               word-wrap: break-word;
+               display: inline-block;
+       }
+
+       .td select {
+               word-wrap: normal;
+       }
+
+       .td[data-type="button"],
+       .td[data-type="fvalue"] {
+               flex: 1 1 12.5%;
+               text-align: left;
+       }
+
+       .td.cbi-value-field {
+               align-self: flex-start;
+       }
+
+       .td.cbi-value-field .cbi-button {
+               width: 100%;
+       }
+
+       .table.cbi-section-table {
+               border: none;
+               background: none;
+               margin: 0;
+       }
+
+       .tr.table-titles,
+       .cbi-section-table-titles,
+       .cbi-section-table-descr {
+               display: none;
+       }
+
+       .table.cbi-section-table .tr > *,
+       .table.cbi-section-table .tr[data-title]::before {
+               border-top: none;
+       }
+
+       .cbi-section-table-row {
+               display: flex;
+               flex-direction: row;
+               flex-wrap: wrap;
+               border: 1px dotted #444;
+               margin: 0 0 .5em 0;
+               background: #fff;
+       }
+
+       .cbi-section-table-row:hover {
+               border: 1px solid #4a6b7c;
+       }
+
+       .table.cbi-section-table .tr:hover > *,
+       .table.cbi-section-table .tr:nth-child(2n):hover > * {
+               background: none;
+       }
+
+       .cbi-section-table + .cbi-section-create {
+               padding-top: 0;
+       }
+
+       .tr[data-title]::before {
+               display: block;
+               flex: 1 1 100%;
+               background: #eef;
+       }
+
+       .td[data-title]::before {
+               display: block;
+       }
+
+       .td.cbi-section-actions {
+               flex-basis: 100%;
+               margin: auto 0 0 auto;
+       }
+
+       .td.cbi-section-actions > *,
+       .td.cbi-section-actions > form > * {
+               flex: 0 1 100%;
+               max-width: 150px;
+       }
+
+       .hide-sm,
+       .hide-xs {
+               display: none;
+       }
+}
+
+@media screen and (max-width: 480px) {
+       body {
+               font-size: 12pt;
+       }
+
+       input, textarea, select {
+               font-size: 12pt !important;
+               line-height: 1.4em;
+       }
+
+       select, input[type="text"], input[type="password"] {
+               width: 100%;
+               height: 1.4em;
+       }
+
+       [data-dynlist] > input,
+       input.cbi-input-password {
+               width: calc(100% - 20px);
+       }
+
+       .cbi-dropdown {
+               min-width: 100%;
+       }
+
+       .btn, .cbi-button {
+               font-size: 9pt !important;
+               line-height: 11pt;
+       }
+
+       #maincontent {
+               padding: .25em;
+       }
+
+       #tabmenu {
+               margin: -.25em -.25em 1em -.25em;
+       }
+
+       .th, .td {
+               flex: 2 2 50%;
+       }
+
+       .td.cbi-value-field {
+               flex-basis: 100%;
+       }
+
+       .td.cbi-value-field[data-type="dvalue"] {
+               flex-basis: 50%;
+       }
+
+       .td.cbi-value-field[data-type="button"],
+       .td.cbi-value-field[data-type="fvalue"] {
+               flex-basis: 25%;
+               text-align: left;
+       }
+
+       .cbi-section {
+               padding: .25em;
+       }
+
+       .cbi-value {
+               padding: 0 .25em;
+       }
+
+       .cbi-value-title {
+               float: none;
+               font-weight: bold;
+       }
+
+       .cbi-value-field {
+               width: 100%;
+               margin: 0;
+       }
+
+       .cbi-value-description {
+               margin-top: 5px;
+               display: block;
+       }
+
+       .cbi-section-create {
+               margin-bottom: 1em;
+       }
+
+       .cbi-optionals {
+               display: flex;
+       }
+
+       .cbi-page-actions {
+               flex-wrap: wrap;
+       }
+
+       .cbi-page-actions > .cbi-button-link {
+               flex-basis: 100%;
+               margin-right: 2px;
+       }
+
+       .cbi-optionals > *,
+       .cbi-page-actions > * {
+               flex: 1 1 auto;
+               margin: 2px;
+               height: auto;
+       }
+
+       ul.cbi-tabmenu {
+               padding: 0 3px;
+       }
+
+       ul.cbi-tabmenu li {
+               font-size: 90%;
+               margin: 0 1px -1px 0;
+       }
+
+       .hide-xs {
+               display: none;
+       }
+
+       #cbi-network .td[id] > strong {
+               display: block;
+       }
+
+       #cbi-network-switch_vlan .td.cbi-section-actions {
+               flex-basis: 100%;
+       }
+
+       .network-status-table .ifacebox {
+               margin: 0 0 .5em 0;
+       }
+}
diff --git a/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css b/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css
deleted file mode 100644 (file)
index 67ed9fb..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-div.cbi-value-field {
-       margin-left: 0 !important;
-}
-
-.cbi-section legend {
-       background-color: #ffffff;
-       color: #555555;
-}
-
-table.cbi-section-table td .cbi-input-text,
-table.cbi-section-table td .cbi-input-select {
-       width: 95% !important;
-}
-
-.cbi-input-user,
-.cbi-input-password {
-       text-indent: 0 !important;
-       padding-left: 1.5em !important;
-       width: 18.5em !important;
-}
index 16ffc992ac1e5e69f493f03b45f1ac55cb51057a..b6ed1f7134b0b8d649dfd61d8b77ff4a9531c0dd 100644 (file)
@@ -74,7 +74,6 @@
 <link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="<%=media%>/mobile.css" type="text/css" />
 <link rel="stylesheet" media="only screen and (max-width: 854px)" href="<%=media%>/smallscreen.css" type="text/css" />
 <link rel="stylesheet" media="handheld" href="<%=media%>/mobile.css" type="text/css" />
-<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
 <% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
 <% end -%>
 <% if css then %><style title="text/css">
index 57bbaf6afca3a212c10d9e216c16ce27f2711bce..17db81edb3783284f253df4012bba2704ecf7e55 100755 (executable)
     font-style: normal;
 }
 
+.table { display: table; position: relative; }
+.tr    { display: table-row; }
+.thead { display: table-header-group; }
+.tbody { display: table-row-group; }
+.tfoot { display: table-footer-group; }
+.td, .th {
+    vertical-align: middle;
+    text-align: center;
+    display: table-cell;
+    padding: .5em;
+}
+
+.th {
+    font-weight: bold;
+}
+
+.tr.placeholder {
+    height: 4em;
+}
+
+.tr.placeholder > .td {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    text-align: center;
+    line-height: 3em;
+}
+
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
 .cbi-button-up,
 .cbi-button-down,
 .cbi-value-helpicon,
@@ -88,7 +120,8 @@ select {
 }
 
 select,
-input {
+input,
+.cbi-dropdown {
     background-color: transparent;
     color: rgba(0, 0, 0, .87);
     border: none;
@@ -138,7 +171,7 @@ header {
     transition: box-shadow .2s;
     float: left;
     position: fixed;
-    z-index: 101;
+    z-index: 2000;
 }
 
 footer {
@@ -268,10 +301,9 @@ header > .container > .brand {
     color: black;
 }
 
-.errorbox,
 .alert-message {
     margin: 2rem 0 0 0;
-    padding: 2rem;
+    padding: 1rem;
     border: 0;
     font-weight: normal;
     font-style: normal;
@@ -284,16 +316,19 @@ header > .container > .brand {
     box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
 }
 
-.errorbox {
-    color: #fff;
-    background-color: #f0ad4e;
-    border-color: #eea236;
-}
-
 .error {
     color: red;
 }
 
+.alert-message > h4 {
+    font-weight: bold;
+    font-size: 110%;
+}
+
+.alert-message > * {
+    margin: .5rem 0;
+}
+
 #maincontent > .container > div:nth-child(1).alert-message.warning > a {
     font: inherit;
     overflow: visible;
@@ -420,10 +455,12 @@ h3 {
 }
 
 h4 {
-
+    margin: 2rem 0 0 0;
+    font-size: 1.2rem;
+    padding-bottom: 10px;
 }
 
-fieldset {
+.cbi-section {
     margin: 2rem 0 0 0;
     padding: 2rem;
     border: 0;
@@ -431,11 +468,7 @@ fieldset {
     font-style: normal;
     line-height: 1;
     font-family: inherit;
-
     min-width: inherit;
-    overflow-x: auto;
-    overflow-y: hidden;
-
     border-radius: 0;
     background-color: #FFF;
     box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
@@ -447,7 +480,7 @@ fieldset {
     margin-top: 1rem;
 }
 
-fieldset > legend {
+.cbi-section > legend {
     display: none !important;
 }
 
@@ -471,25 +504,89 @@ fieldset > fieldset {
 table {
     border-spacing: 0;
     border-collapse: collapse;
+}
+
+table, .table {
     width: 100%;
     border: 1px solid #eee;
 }
 
-table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th {
+table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th,
+.table > .tbody > .tr > .td, .table > .tbody > .tr > .th, .table > .tfoot > .tr > .td, .table > .tfoot > .tr > .th, .table > .thead > .tr > .td, .table > .thead > .tr > .th {
     padding: .5rem;
     border-top: 1px solid #ddd;
     white-space: nowrap;
 }
 
+.td.cbi-value-field,
 .cbi-section-table-cell {
     text-align: center;
+    display: inline-block;
+    flex: 10;
+}
+
+.cbi-section-table-cell {
+    white-space: nowrap;
+    align-self: flex-end;
+    flex: 1;
+}
+
+.td.cbi-value-field[data-title]::before {
+    content: attr(data-title);
+    padding: .5rem;
+    display: block;
+    white-space: nowrap;
+}
+
+.cbi-section-table {
+    border: none;
+}
+
+.tr.cbi-section-table-titles,
+.tr.cbi-section-table-descr {
+    display: none;
 }
 
 .cbi-section-table-row {
     text-align: center;
+    display: flex;
+    flex-wrap: wrap;
+    flex-direction: row;
+    justify-content: space-between;
+    margin-bottom: 1rem;
+    background: #f4f4f4;
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+}
+
+.cbi-section-table-row:last-child {
+    margin-bottom: 0;
+}
+
+.cbi-section-table-row[data-title]::before {
+    content: attr(data-title);
+    display: block;
+    width: 100%;
+    margin: .25rem;
+    padding: .25rem .25rem .5rem .25rem;
+    border-bottom: 1px solid rgba(0, 0, 0, .26);
+    text-align: center;
+    font-size: 1rem;
+}
+
+.cbi-section-table-row > .cbi-value-field .cbi-input-select,
+.cbi-section-table-row > .cbi-value-field .cbi-input-text,
+.cbi-section-table-row > .cbi-value-field .cbi-input-password,
+.cbi-section-table-row > .cbi-value-field .cbi-dropdown {
+    width: 100%;
+}
+
+div > table > tbody > tr:nth-of-type(2n),
+div > .table > .tbody > .tr:nth-of-type(2n) {
+    background-color: #f9f9f9;
 }
 
-fieldset > table > tbody > tr:nth-of-type(2n) {
+div > table > tbody > tr:nth-of-type(2n),
+div > .table > .tbody > .tr:nth-of-type(2n) {
     background-color: #f9f9f9;
 }
 
@@ -516,25 +613,29 @@ fieldset > table > tbody > tr:nth-of-type(2n) {
 
 /* fix multiple table */
 
-table table {
+table table,
+.table .table {
     border: none;
 }
 
-.cbi-value-field table {
+.cbi-value-field table,
+.cbi-value-field .table {
     border: none;
 }
 
-td > table > tbody > tr > td {
+td > table > tbody > tr > td,
+.td > .table > .tbody > .tr > .td {
     border: none;
 }
 
-.cbi-value-field > table > tbody > tr > td {
+.cbi-value-field > table > tbody > tr > td,
+.cbi-value-field > .table > .tbody > .tr > .td {
     border: none;
 }
 
 /* button style */
 
-.cbi-button {
+.btn, .cbi-button {
     -webkit-appearance: none;
     text-transform: uppercase;
     color: rgba(0, 0, 0, 0.87);
@@ -557,8 +658,13 @@ td > table > tbody > tr > td {
     user-select: none;
     font-size: 0.8rem;
     width: auto !important;
+    display: inline-block;
+    text-decoration: none;
 }
 
+.btn:hover,
+.btn:focus,
+.btn:active,
 .cbi-button:hover,
 .cbi-button:focus,
 .cbi-button:active {
@@ -568,15 +674,19 @@ td > table > tbody > tr > td {
     color: rgba(0, 0, 0, 0.87);
 }
 
+.btn:hover,
+.btn:focus,
 .cbi-button:hover,
 .cbi-button:focus {
     box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2);
 }
 
+.btn:active,
 .cbi-button:active {
     box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
 }
 
+.btn:disabled,
 .cbi-button:disabled {
     cursor: not-allowed;
     pointer-events: none;
@@ -584,6 +694,7 @@ td > table > tbody > tr > td {
     box-shadow: none;
 }
 
+.btn + .btn,
 form.inline + form.inline,
 .cbi-button + .cbi-button {
     margin-left: 0.6rem;
@@ -762,6 +873,172 @@ form.inline + form.inline,
     font-size: small;
 }
 
+
+.cbi-dropdown {
+    display: inline-flex;
+    cursor: pointer;
+    position: relative;
+    padding: 0;
+    height: auto;
+}
+
+.cbi-dropdown:focus {
+    outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+    margin: 0 !important;
+    padding: 0;
+    list-style: none;
+    overflow-x: hidden;
+    overflow-y: auto;
+    display: flex;
+    width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+    display: none;
+}
+
+.cbi-dropdown > .open {
+    border: 2px outset #eee;
+    flex-basis: 15px;
+    background: #eee;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+    flex-grow: 0;
+    flex-shrink: 0;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    text-align: center;
+    line-height: 2em;
+    padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+    color: #777;
+    font-weight: bold;
+    text-shadow: 1px 1px 0px #fff;
+    display: none;
+}
+
+.cbi-dropdown > ul > li {
+    display: none;
+    padding: .25em;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    flex-shrink: 1;
+    flex-grow: 1;
+    align-items: center;
+    align-self: center;
+    min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+    border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+    max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+    display: none;
+    margin: 0;
+    padding: 0;
+    pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+    vertical-align: middle;
+    margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+    margin: 0;
+    height: auto;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+    height: 20px;
+}
+
+.cbi-dropdown[open] {
+    position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+    display: block;
+    background: #f6f6f5;
+    border: 1px solid #918e8c;
+    box-shadow: 0 0 4px #918e8c;
+    position: absolute;
+    z-index: 1000;
+    max-width: none;
+    min-width: 100%;
+    width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+    flex-grow: 1;
+    display: flex;
+    align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+    display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+    border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+    background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+    background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+    margin-bottom: 0;
+    border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+    pointer-events: none;
+    opacity: .6;
+}
+
+.cbi-dropdown .zonebadge {
+    width: 100%;
+}
+
+.cbi-dropdown[open] .zonebadge {
+    width: auto;
+}
+
+
 /* luci */
 
 .hidden {
@@ -776,6 +1053,10 @@ form.inline + form.inline,
     text-align: right !important;
 }
 
+.center {
+    text-align: center !important;
+}
+
 .inline {
     display: inline;
 }
@@ -793,27 +1074,71 @@ form.inline + form.inline,
 }
 
 /* select */
-.cbi-value-field .cbi-input-select {
+.cbi-value-field .cbi-dropdown {
     min-width: 15rem;
 }
 
+.cbi-value-field .cbi-input-select {
+    width: 15rem;
+}
+
 .ifacebadge {
     display: inline-flex;
     border-bottom: 1px solid #CCCCCC;
     padding: 0.5rem 1rem;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
     box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    background: #fff;
 }
 
-td > .ifacebadge {
+td > .ifacebadge,
+.td > .ifacebadge {
     background-color: #F0F0F0;
     font-size: 0.9rem;
 }
 
+.ifacebadge > em,
 .ifacebadge > img {
-    float: right;
-    margin: 0 0.3rem;
+    display: inline-block;
+    margin: 0 .2rem;
+    align-self: flex-start;
+}
+
+.ifacebadge > img + img {
+    margin: 0 .2rem 0 0;
+}
+
+.network-status-table {
+    display: flex;
+    flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox {
+    margin: .5em;
+    flex-grow: 1;
+}
+
+.network-status-table .ifacebox-body {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+}
+
+.network-status-table .ifacebox-body > span {
+    flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+    display: flex;
+    flex-wrap: wrap;
+}
+
+.network-status-table .ifacebox-body .ifacebadge {
+    flex: 1;
+    margin: .5em .25em 0 .25em;
+    padding: .5em;
+    min-width: 220px;
+    background-color: #fff;
+    align-items: center;
 }
 
 /*textarea*/
@@ -926,6 +1251,23 @@ td > .ifacebadge {
 .ifacebox {
     border: 1px solid #999;
     background-color: #f9f9f9;
+    display: inline-flex;
+    flex-direction: column;
+    line-height: 1.2em;
+    min-width: 100px;
+}
+
+.ifacebox-head {
+    padding: .25em;
+    background: #eee;
+}
+
+.ifacebox-head.active {
+    background: #90c0e0;
+}
+
+.ifacebox-body {
+    padding: .25em;
 }
 
 .cbi-image-button {
@@ -935,12 +1277,11 @@ td > .ifacebadge {
 .zonebadge {
     padding: 0.2rem 0.5rem;
     display: inline-block;
-    cursor: pointer;
 }
 
-.zonebadge .ifacebadge {
-    padding: 0.2rem 1rem;
-    margin: 0.3rem;
+.zonebadge .ifacebadge {
+    padding: .2rem .3rem;
+    margin: 0.1rem 0.2rem;
     border: 1px solid #6C6C6C;
 }
 
@@ -950,6 +1291,12 @@ td > .ifacebadge {
     margin-top: 0.3rem;
 }
 
+.zonebadge > em,
+.zonebadge > strong {
+    margin: 0 0.2rem;
+    display: inline-block;
+}
+
 .cbi-value-field .cbi-input-checkbox,
 .cbi-value-field .cbi-input-radio {
     margin-top: 0.5rem;
@@ -974,11 +1321,17 @@ td > .ifacebadge {
     margin-top: -0.5rem;
 }
 
-.cbi-section-table-row > .cbi-value-field .cbi-input-select {
+.cbi-section-table-row > .cbi-value-field .cbi-dropdown {
     min-width: 7rem;
 }
 
-.cbi-section-create > .cbi-button-add {
+.cbi-section-create {
+    margin: .5rem -3px;
+    display: inline-flex;
+    align-items: center;
+}
+
+.cbi-section-create > * {
     margin: 0.5rem;
 }
 
@@ -986,7 +1339,7 @@ td > .ifacebadge {
     padding: 0.5rem;
 }
 
-div.cbi-value var, td.cbi-value-field var {
+div.cbi-value var, td.cbi-value-field var, .td.cbi-value-field var {
     font-style: italic;
     color: #0069D6;
 }
@@ -1010,6 +1363,62 @@ small {
     border-top: 1px solid #CCC;
 }
 
+.cbi-dropdown-container {
+    position: relative;
+}
+
+.cbi-tooltip-container {
+    cursor: help;
+}
+
+.cbi-tooltip {
+    position: absolute;
+    z-index: 1000;
+    left: -1000px;
+    opacity: 0;
+    transition: opacity .25s ease-out;
+    pointer-events: none;
+    box-shadow: 0 0 2px #444;
+}
+
+.cbi-tooltip-container:hover .cbi-tooltip {
+    left: auto;
+    opacity: 1;
+    transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+    padding: .25rem;
+    background: inherit;
+    margin: -1.5rem 0 0 -.5rem;
+}
+
+.zonebadge-empty {
+    background: repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px);
+    color: #404040;
+}
+
+.zone-forwards {
+    display: flex;
+    min-width: 10rem;
+}
+
+.zone-forwards > * {
+    flex: 1 1 45%;
+}
+
+.zone-forwards > span {
+    flex-basis: 10%;
+    text-align: center;
+    padding: 0 .25rem;
+}
+
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+    display: flex;
+    flex-direction: column;
+}
+
 #diag-rc-output > pre {
     background-color: #f5f5f5;
     display: block;
@@ -1134,13 +1543,13 @@ header > .container > .pull-right > * {
 
 /* fix status overview */
 
-.node-status-overview > .main fieldset:nth-child(4) td:nth-child(2) {
+.node-status-overview > .main fieldset:nth-child(4) .td:nth-child(2) {
     white-space: normal;
 }
 
 /* fix status processes */
 
-.node-status-processes > .main table tr td:nth-child(3) {
+.node-status-processes > .main .table .tr .td:nth-child(3) {
     white-space: normal;
 }
 
@@ -1194,11 +1603,6 @@ header > .container > .pull-right > * {
     margin-top: 0;
 }
 
-/* fix network firewall*/
-.node-network-firewall > .main .cbi-section-table-row > .cbi-value-field .cbi-input-select {
-    min-width: 4rem;
-}
-
 .node-status-iptables fieldset,
 .node-system-packages fieldset,
 .node-system-flashops fieldset {
@@ -1234,6 +1638,11 @@ header > .container > .pull-right > * {
     min-width: 3.5rem;
 }
 
+#cbi-network-switch_vlan .th,
+#cbi-network-switch_vlan .td {
+    flex-basis: 12%;
+}
+
 /* language fix */
 body.lang_pl.node-main-login .cbi-value-title {
     width: 12rem;
@@ -1248,6 +1657,7 @@ body.lang_pl.node-main-login .cbi-value-title {
         width: calc(100% - 13rem);
     }
 
+    .btn,
     .cbi-button {
         padding: 0.3rem 0.6rem;
         font-size: 0.8rem;
@@ -1387,6 +1797,26 @@ body.lang_pl.node-main-login .cbi-value-title {
     .node-main-login > .main .cbi-value-title {
         text-align: left;
     }
+
+    .tr {
+        display: flex;
+        flex-direction: row;
+        flex-wrap: wrap;
+    }
+
+    .th, .td {
+        flex: 1;
+        flex-basis: 33%;
+        overflow: hidden;
+        text-overflow: ellipsis;
+    }
+
+    .th.cbi-value-field,
+    .td.cbi-value-field,
+    .th.cbi-section-table-cell,
+    .td.cbi-section-table-cell {
+        flex-basis: auto;
+    }
 }
 
 @media screen and (max-width: 480px) {
@@ -1507,8 +1937,6 @@ body.lang_pl.node-main-login .cbi-value-title {
         line-height: 1;
         font-family: inherit;
         min-width: inherit;
-        overflow-x: auto;
-        overflow-y: hidden;
         border-radius: 0;
         background-color: #FFF;
         box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
@@ -1523,37 +1951,48 @@ body.lang_pl.node-main-login .cbi-value-title {
     .node-status-iptables > .main div > .cbi-map > form input[type="submit"] + input[type="submit"] {
         margin-top: 1rem;
     }
+
+    .th, .td {
+        flex-basis: 50%;
+    }
+
+    .td.cbi-value-field {
+        flex-basis: 100%;
+    }
 }
 
 @media screen and (min-width: 992px) {
     .cbi-value input[type="password"],
-    .cbi-value input[type="text"] {
-        min-width: 20rem;
+    .cbi-value input[type="text"],
+    .cbi-value-field .cbi-input-select {
+        width: 20rem;
     }
 
-    .cbi-value-field .cbi-input-select {
+    .cbi-value-field .cbi-dropdown {
         min-width: 20rem;
     }
 }
 
 @media screen and (min-width: 1280px) {
     .cbi-value input[type="password"],
-    .cbi-value input[type="text"] {
-        min-width: 22rem;
+    .cbi-value input[type="text"],
+    .cbi-value-field .cbi-input-select {
+        width: 22rem;
     }
 
-    .cbi-value-field .cbi-input-select {
+    .cbi-value-field .cbi-dropdown {
         min-width: 22rem;
     }
 }
 
 @media screen and (min-width: 1600px) {
     .cbi-value input[type="password"],
-    .cbi-value input[type="text"] {
-        min-width: 25rem;
+    .cbi-value input[type="text"],
+    .cbi-value-field .cbi-input-select {
+        width: 25rem;
     }
 
-    .cbi-value-field .cbi-input-select {
+    .cbi-value-field .cbi-dropdown {
         min-width: 25rem;
     }
 }
index f3644431eea2f04111468e57034018c341592f65..4d9b3a258759c53e7bc66b6fc554c51e2434437c 100755 (executable)
@@ -1,6 +1,2 @@
-/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
-
-return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
-return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
-//# sourceMappingURL=jquery.min.map
\ No newline at end of file
+/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||"*",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,"ms-").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=J.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,"")},u=s(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=J.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",J.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",!t||J.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&N(this,"input"))return this.click(),!1},_default:function(e){return N(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/<script|<style|<link/i,je=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||"")&&!J.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,""),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,"script")).length>0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,u=12===n(t.marginLeft),c.style.right="60%",s=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=w.css(e,"border"+oe[a]+"Width",!0,i))):(u+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=w.css(e,"border"+oe[a]+"Width",!0,i):s+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,"fxshow");n.queue||(null==(a=w._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,"fx").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,"display")),"none"===(c=w.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===w.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?"hidden"in y&&(g=y.hidden):y=J.access(e,"fxshow",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,"fxshow");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=["*"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&"object"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=J.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each(["toggle","show","hide"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut("show"),slideUp:ut("hide"),slideToggle:ut("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||w.expando+"_"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||w.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&w.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?w("<div>").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,"position"),f=w(e),p={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=w.css(e,"top"),u=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});
index 0aca882c05397207eaf4febe6e651836f443c487..b6341a2c35ae26ab0092f7ea9f6b1ca28faa74b9 100644 (file)
 <!DOCTYPE html>
 <html lang="<%=luci.i18n.context.lang%>">
 <head>
-    <meta charset="utf-8">
-    <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
-    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
-    <meta name="format-detection" content="telephone=no, email=no"/>
-    <meta name="apple-mobile-web-app-capable" content="yes">
-    <meta name="mobile-web-app-capable" content="yes">
-    <meta name="x5-fullscreen" content="true">
-    <meta name="full-screen" content="yes">
-    <meta name="x5-page-mode" content="app">
-    <meta name="browsermode" content="application">
-    <meta name="theme-color" content="#0099CC">
-    <meta name="msapplication-tap-highlight" content="no">
-    <meta name="msapplication-TileColor" content="#0099CC">
-
-    <meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
-    <meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
-    <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
-    <link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
-    <link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
-
-    <link rel="stylesheet" href="<%=media%>/css/style.css">
-    <link rel="shortcut icon" href="<%=media%>/favicon.ico">
-    <% if node and node.css then %>
-        <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
-    <% end -%>
-    <% if css then %>
-        <style title="text/css"><%= css %></style>
-    <% end -%>
-    <script src="<%=resource%>/xhr.js"></script>
+       <meta charset="utf-8">
+       <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
+       <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+       <meta name="format-detection" content="telephone=no, email=no"/>
+       <meta name="apple-mobile-web-app-capable" content="yes">
+       <meta name="mobile-web-app-capable" content="yes">
+       <meta name="x5-fullscreen" content="true">
+       <meta name="full-screen" content="yes">
+       <meta name="x5-page-mode" content="app">
+       <meta name="browsermode" content="application">
+       <meta name="theme-color" content="#0099CC">
+       <meta name="msapplication-tap-highlight" content="no">
+       <meta name="msapplication-TileColor" content="#0099CC">
+
+       <meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
+       <meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
+       <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
+       <link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
+       <link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
+
+       <link rel="stylesheet" href="<%=media%>/css/style.css">
+       <link rel="shortcut icon" href="<%=media%>/favicon.ico">
+       <% if node and node.css then %>
+               <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
+       <% end -%>
+       <% if css then %>
+               <style title="text/css"><%= css %></style>
+       <% end -%>
+       <script src="<%=resource%>/xhr.js"></script>
 </head>
 <body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>">
 <header>
        </div>
 </header>
 <div class="main">
-        <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
-        <div class="main-left">
+       <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
+       <div class="main-left">
                <% render_topmenu() %>
-        </div>
+       </div>
        <div class="main-right">
-                <div class="darkMask"></div>
-                <div id="maincontent">
-                        <div class="container">
-                                <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
-                                        <div class="alert-message warning">
-                                                <h4><%:No password set!%></h4>
-                                                <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
-                                                <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
-                                        </div>
-                                <%- end -%>
-                                <% if category then render_tabmenu(category, cattree) end %>
+               <div class="darkMask"></div>
+               <div id="maincontent">
+                       <div class="container">
+                               <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
+                                       <div class="alert-message warning">
+                                               <h4><%:No password set!%></h4>
+                                               <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+                                               <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
+                                       </div>
+                               <%- end -%>
 
                                <noscript>
                                        <div class="alert-message warning">
-                                               <strong><%:JavaScript required!%></strong><br />
-                                               <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
+                                               <h4><%:JavaScript required!%></h4>
+                                               <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
                                        </div>
-                               </noscript>                     
+                               </noscript>
+
+                               <% if category then render_tabmenu(category, cattree) end %>
index c5ee58fff72d56bddb74698cf272c2e123e33462..6f1bae67106ee07930c7eaaaa5821323a69da360 100644 (file)
@@ -18,8 +18,8 @@ body {
        background-color: #4a6b7c;
        background-position: bottom center;
        background-repeat: repeat-x;
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 11pt;
+       font-family: Arial, Verdana, sans-serif;
+       font-size: 16px;
        line-height: 100%;
        padding-bottom: 1.5em;
 }
@@ -27,6 +27,46 @@ body {
 * {
        margin: 0;
        padding: 0;
+       box-sizing: border-box;
+}
+
+.table { display: table; width: 100%; position: relative; }
+.tr { display: table-row; }
+.thead { display: table-header-group; }
+.tbody { display: table-row-group; }
+.tfoot { display: table-footer-group; }
+.td, .th { display: table-cell; }
+.th { font-weight: bold; }
+
+.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; }
+.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; }
+
+.col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; }
+.col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; }
+.col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; }
+.col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; }
+.col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; }
+.col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; }
+.col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; }
+.col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; }
+.col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; }
+.col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; }
+
+.tr.placeholder {
+       height: 3.5em;
+}
+
+.tr.placeholder > .td {
+       position: absolute;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       text-align: center;
+       line-height: 3em;
+}
+
+.nowrap {
+       white-space: nowrap;
 }
 
 a img {
@@ -34,81 +74,95 @@ a img {
        text-decoration: none;
 }
 
-ul.tabmenu {
-       margin: 0;
-       clear: both;
-       display: block;
-       vertical-align: bottom;
-       font-size: 10pt;
-       padding: 5px 0 0 5px;
+#maincontainer {
+       display: flex;
 }
 
-div.tabmenu2 {
-       background-color: #AAAAAA;
-       background-image: url(tabbg.png);
-       background-repeat: repeat-x;
-       margin-top: -1px;
-       border: 1px solid #444444;
-       border-bottom: none;
+#maincontent {
+       flex-basis: 100%;
 }
 
-div.tabmenu3,
-div.tabmenu4,
-div.tabmenu5 {
-       background-color: #AAAAAA;
-       background-image: url(tabbg.png);
-       background-repeat: repeat-x;
-       border: none;
+#mainmenu {
+       max-width: 200px;
+       background: #f5f5f5;
+       border: 1px solid #444;
+       border-width: 0 0 1px 1px;
+       font-size: 85%;
+       padding-bottom: 1em;
 }
 
-ul.tabmenu li {
-       float: left;
+#mainmenu ul {
        display: block;
-       overflow: hidden;
+       margin: 0;
+       padding: 0;
 }
 
-.lang_he ul.tabmenu li {
-       float: right;
+#mainmenu ul li {
+       display: block;
+       white-space: nowrap;
 }
 
-ul.tabmenu li a {
-       text-decoration: none;
-       color: #444444;
+#mainmenu ul li > a {
        display: block;
-       padding: 3px 8px;
-       margin: 0 2px;
-       line-height: 1.3em;
-       border: 1px solid transparent;
-       border-bottom: none;
+       color: #444;
+       padding: .4em .5em;
+       text-decoration: none;
+}
+
+#mainmenu ul li.selected > a {
+       background: #fff;
+       color: #59d;
+       border: 1px dotted #444;
+       border-width: 1px 0;
+}
+
+#mainmenu ul li.selected:first-child > a {
+       border-top: none;
+}
+
+#mainmenu ul li li > a {
        font-size: 85%;
+       padding-left: 1.5em;
 }
 
-ul.tabmenu li.active a {
-       font-weight: bold;
-       color: #000000;
-       background: #f5f5f5;
-       border: 1px solid #AAAAAA;
-       border-bottom: none;
+#mainmenu ul li > ul {
+       flex-basis: 100%;
+       max-height: 0;
+       visibility: hidden;
+       transition: max-height .15s;
 }
 
-ul.tabmenu li a:hover {
-       color: #444444;
-       border-color: #444444;
+#mainmenu ul:not(.active) li.selected > ul,
+#mainmenu ul li.active > ul {
+       max-height: 1000px;
+       visibility: visible;
+       transition: max-height .25s;
 }
 
-ul.l1 li a {
-       background-color: #AAAAAA;
-       background-image: url(tabbg.png);
-       background-repeat: repeat-x;
-       border-color: #444444;
+#mainmenu ul li.mainmenu-item-logout {
+       margin-top: 15%;
+}
+
+#tabmenu {
+       padding: 0;
+       margin: -.5em -.5em 1em -.5em;
+       background: #bbb;
 }
 
-ul.l1 li.tabmenu-item-logout a {
-       margin-left: 30px;
+#tabmenu ul {
+       border-color: #444;
+       padding-top: .5em;
+       flex-wrap: wrap;
+       background: repeating-linear-gradient(#f5f5f5, #bbb 2.4em, #f5f5f5 2.4em, #bbb);
+       line-height: 1em;
 }
 
-.lang_he ul.l1 li.tabmenu-item-logout a {
-       margin-right: 30px;
+#tabmenu ul li {
+       border-color: #444;
+}
+
+#tabmenu ul li.cbi-tab {
+       background: #f5f5f5;
 }
 
 abbr,
@@ -135,6 +189,13 @@ code {
        white-space: pre;
 }
 
+hr {
+       margin: .5em 0;
+       padding: 0;
+       border: 1px solid #444;
+       border-width: 0 0 1px 0;
+}
+
 #maincontent ul {
        margin-left: 2em;
 }
@@ -166,6 +227,31 @@ code {
        background-color: white;
 }
 
+.alert-message {
+       font-weight: normal;
+       padding: .5em;
+       border-radius: 3px;
+       color: #000;
+}
+
+.alert-message.notice {
+       background: linear-gradient(#ccc 0%, #eee 100%);
+       color: #4a6b7c;
+}
+
+.alert-message.warning {
+       background: linear-gradient(#dda 0%, #dd8 100%);
+       color: #c00;
+}
+
+.alert-message > * {
+       margin: .5em;
+}
+
+.alert-message > h4 {
+       font-weight: bold;
+}
+
 div.hostinfo {
        float: left;
        margin: 0;
@@ -305,56 +391,36 @@ textarea#syslog {
        direction: rtl;
 }
 
-#maincontent h2 {
+h2, h3, h4, legend {
        font-size: 150%;
        font-family: Trebuchet MS, Verdana, sans-serif;
        font-weight: bold;
-       margin: 0.25em 0 0.7em 0;
+       margin: .25em 0 .5em 0;
        border-bottom: 1px solid;
-       padding-top: 10px;
        padding-bottom: 4px;
+       display: block;
+       width: 100%;
 }
 
-#maincontent h3 {
-       margin: 0.5em 0 1.1em 0;
+h3, legend {
        font-size: 125%;
-       font-weight: bold;
-       font-style: italic;
-       font-family: Trebuchet MS, Verdana, sans-serif;
-       color: #27408B;
-}
-
-#maincontent p {
-       margin-bottom: 1em;
 }
 
-.cbi-section {
-       margin-bottom: 0.5em;
-       padding: 0.5em 1em;
-       border: 1px dotted #555555;
-       background-color: #ffffff;
-       color: #000000;
+h4 {
+       font-size: 112%;
 }
 
-.cbi-section legend {
-       font-size: 110%;
-       font-weight: bold;
-       height: 1em;
-       padding: 0 0.25em;
-       background-color: transparent;
-       color: #555555;
-}
+fieldset { border: none; }
+fieldset > legend { float: left; }
+fieldset > legend + * { clear: both; }
 
-.cbi-section h2 {
-       margin: 0em 0 0.5em -0.5em !important;
+#maincontent p {
+       margin-bottom: 1em;
 }
 
-.cbi-section h3 {
-       text-decoration: none !important;
-       font-weight: bold !important;
-       color: #555555 !important;
-       margin: 0.25em !important;
-       font-size: 100% !important;
+.cbi-section {
+       padding: .5em 0;
+       margin-top: .5em;
 }
 
 .cbi-section-descr {
@@ -362,6 +428,10 @@ textarea#syslog {
        font-size: 95%;
 }
 
+.cbi-section-descr:empty {
+       display: none;
+}
+
 .cbi-title-ref {
        color: inherit;
        text-decoration: none;
@@ -407,182 +477,134 @@ input[type=image] {
 }
 
 input:focus,
-input:hover,
+input:not(.cbi-button):hover,
 select:focus,
 select:hover {
        background-color: #ffffff;
        color: #000000;
 }
 
+input[type=text],
+input[type=password] {
+       padding: 0 3px;
+}
+
 select,
 input[type=text],
 input[type=password] {
        width: 20em;
+       font-size: inherit;
+       line-height: 13pt;
+       height: 14pt;
 }
 
-td select,
-td input[type=text],
-td input[type=password] {
-       width: 99%;
+select[multiple] {
+       height: auto;
 }
 
-img.cbi-image-button {
-       cursor: pointer;
-       margin: 0 2px;
+input[type=radio],
+input[type=checkbox],
+[data-dynlist] > input + img,
+input.cbi-input-password + img {
        vertical-align: middle;
 }
 
-input.cbi-button {
-       background-color: #EEEEEE;
-       background-repeat: no-repeat;
-       background-position: 1px center;
-       border: 1px solid #CCCCCC;
-       border-radius: 3px;
-}
-
-input.cbi-button:hover {
-       border-color: #4A6B7C;
-       background-color: #FFFFFF;
-}
-
-input.cbi-button[disabled] {
-       color: #CCCCCC;
-       border-color: #CCCCCC;
-       background-color: #EEEEEE;
-       cursor: default;
-}
-
-input.cbi-input-user {
-       background-image: url('../resources/cbi/user.gif');
-       background-repeat: no-repeat;
-       background-position: 1px center;
-       color: #000000;
-       text-indent: 17px;
-}
-
-input.cbi-input-password {
-       background-image: url('../resources/cbi/key.gif');
-       background-repeat: no-repeat;
-       background-position: 1px center;
-       color: #000000;
-       text-indent: 17px;
-}
-
-input.cbi-input-find,
-input.cbi-button-find {
-       background-image: url('../resources/cbi/find.gif');
-       color: #000000;
-       padding-left: 17px;
-}
-
-input.cbi-input-reload {
-       background-image: url('../resources/cbi/reload.gif');
-       color: #000000;
-       padding-left: 17px;
-}
-
-input.cbi-input-add,
-input.cbi-button-add {
-       background-image: url('../resources/cbi/add.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
-}
-
-input.cbi-input-fieldadd,
-input.cbi-button-fieldadd {
-       background-image: url(../resources/cbi/fieldadd.gif);
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.td select,
+.td .cbi-dropdown,
+.td input[type=text] {
+       width: 100%;
 }
 
-input.cbi-input-reset,
-input.cbi-button-reset {
-       background-image: url('../resources/cbi/reset.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.td [data-dynlist] > input,
+.td input.cbi-input-password {
+       width: calc(100% - 20px);
 }
 
-input.cbi-input-save,
-input.cbi-button-save {
-       background-image: url('../resources/cbi/save.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+img.cbi-image-button {
+       cursor: pointer;
+       margin: 0 2px;
+       vertical-align: middle;
 }
 
-input.cbi-input-apply,
-input.cbi-button-apply {
-       background-image: url('../resources/cbi/apply.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.btn, .cbi-button {
+       padding: 0 .5em;
+       border-radius: 3px;
+       border: 1px solid #aaa;
+       text-decoration: none;
+       color: #000;
+       display: inline-block;
+       font-size: inherit;
+       -webkit-appearance: none;
+       background: #fff;
+       text-align: center;
+       font-weight: bold;
+       line-height: 13pt;
+       height: 14pt;
 }
 
-input.cbi-input-link,
-input.cbi-button-link {
-       background-image: url('../resources/cbi/link.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.btn:hover, .cbi-button:hover {
+       box-shadow: 0 0 3px #59d;
 }
 
-input.cbi-input-download,
-input.cbi-button-download {
-       background-image: url('../resources/cbi/download.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.btn[disabled],
+.btn[disabled]:hover,
+.cbi-button[disabled],
+.cbi-button[disabled]:hover {
+       opacity: .6;
+       cursor: default;
+       pointer-events: none;
 }
 
-input.cbi-input-remove,
-div.cbi-section-remove input {
-       background-image: url('../resources/cbi/remove.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.cbi-button-positive,
+.cbi-button-fieldadd,
+.cbi-button-add,
+.cbi-button-save {
+       border-color: #7b7;
+       color: #7b7;
 }
 
-input.cbi-button-up {
-       background-image: url('../resources/cbi/up.gif');
-       padding-left: 11px;
-       padding-right: 1px;
+.cbi-button-neutral,
+.cbi-button-reset,
+.cbi-button-download,
+.cbi-button-find,
+.cbi-button-link,
+.cbi-button-up,
+.cbi-button-down {
+       border-color: #444;
+       color: #444;
 }
 
-input.cbi-button-down {
-       background-image: url('../resources/cbi/down.gif');
-       padding-left: 11px;
-       padding-right: 1px;
+.cbi-button-action,
+.cbi-button-apply,
+.cbi-button-reload,
+.cbi-button-edit {
+       border-color: #59d;
+       color: #59d;
 }
 
-input.cbi-button-edit {
-       background-image: url('../resources/cbi/edit.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.cbi-button-negative,
+.cbi-section-remove .cbi-button,
+.cbi-button-remove {
+       border-color: #b77;
+       color: #b77;
 }
 
-input.cbi-button-reload {
-       background-image: url('../resources/cbi/reload.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.cbi-button-action.important,
+.cbi-page-actions .cbi-button-apply,
+.cbi-section-actions .cbi-button-edit {
+       color: #fff;
+       background: #59d;
 }
 
-input.cbi-button-reset {
-       background-image: url('../resources/cbi/reset.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.cbi-button-positive.important,
+.cbi-page-actions .cbi-button-save {
+       color: #fff;
+       background: #7b7;
 }
 
-input.cbi-button-remove {
-       background-image: url('../resources/cbi/remove.gif');
-       color: #000000;
-       padding-left: 17px;
-       padding-right: 1px;
+.cbi-page-actions .cbi-button-apply + .cbi-button-save {
+       background: #fff;
+       color: #7b7;
 }
 
 .cbi-input-invalid {
@@ -593,27 +615,16 @@ input.cbi-button-remove {
        border-color: #FF0000;
 }
 
-div.cbi-section-remove input {
-       border-bottom: none;
-}
-
-textarea {
-       margin-left: -1px;
-       margin-bottom: 0.5em;
-}
-
-form > div > input[type=submit],
-form > div > input[type=reset] {
-       float: right;
-       margin-left: 0.5em;
+table td, table th {
+       color: #000000;
 }
 
-table td,
-table th {
+.table .td, .table .th {
        color: #000000;
+       padding: .25em;
 }
 
-table.smalltext {
+.table.smalltext {
        background: #f5f5f5;
        color: #000000;
        border-top: 1px solid #666666;
@@ -626,56 +637,40 @@ table.smalltext {
        border-collapse: collapse;
 }
 
-table.smalltext tr:hover td {
+.table.smalltext .tr:hover .td {
        background-color: #bbddee;
        color: #000000;
 }
 
-table.smalltext tr th {
+.table.smalltext .tr .th {
        padding: 0 0.25em;
        border-left: 1px solid #666666;
        text-align: left;
 }
 
-table.smalltext tr td {
+.table.smalltext .tr .td {
        padding: 0 0.25em;
        border-top: 1px solid #666666;
        border-left: 1px solid #666666;
 }
 
-table.cbi-section-table .cbi-rowstyle-1 {
+.cbi-rowstyle-1 {
        background-color: #eeeeff;
        color: #000000;
 }
 
-table.cbi-section-table .cbi-rowstyle-1:hover,
-table.cbi-section-table .cbi-rowstyle-2:hover {
-       background-color: #b2c8d4;
-       color: #000000;
-}
-
-table.cbi-section-table .cbi-section-table-cell {
-       padding: 3px;
-       white-space: nowrap;
-}
-
-.cbi-section .cbi-rowstyle-1 h3 {
-       background-color: #eeeeff;
-       color: #555555;
-}
-
 .cbi-rowstyle-2 {
        color: #000000;
 }
 
-div.cbi-value {
+.cbi-value {
        clear: left;
        vertical-align: middle;
        padding: 0.25em 0.6em;
        border-bottom: 1px dotted #bbbbbb;
 }
 
-div.cbi-value:hover {
+.cbi-value:hover {
        background: #f8f8f8;
        color: #000000;
 }
@@ -686,29 +681,49 @@ div.cbi-value:hover {
        line-height: 1.8em;
 }
 
-div.cbi-value-field {
+.cbi-value-field {
        width: 58%;
        margin-left: 40%;
        padding: 0.25em 0;
 }
 
-div.cbi-value-description {
-       font-size: 90%;
-       display: inline;
+.td.cbi-value-field {
+       width: auto;
+       margin-left: 0;
+       align-self: center;
 }
 
-div.cbi-section-create {
-       clear: left;
-       white-space: nowrap;
-       vertical-align: top;
+.cbi-value-description {
+       background-image: url(/luci-static/resources/cbi/help.gif);
+       background-position: .25em .25em;
+       background-repeat: no-repeat;
+       margin: .25em 0 0 0;
+       padding: .25em .25em .25em 1.75em;
+}
+
+.cbi-section-create {
+       padding: 0 0 .25em 0;
+       margin: -3px;
+       display: inline-flex;
+       align-items: center;
 }
 
-div.cbi-section-create .cbi-button {
-       margin: 0.25em;
+.cbi-section-create > * {
+       margin: 3px;
+       flex: 1 1 auto;
+}
+
+.cbi-section-create > * > input {
+       width: 100%;
+}
+
+.cbi-section-remove > .cbi-button {
+       margin-bottom: -1px;
+       border-radius: 3px 3px 0 0;
 }
 
-input.cbi-section-create-name {
-       margin-right: -0.25em;
+.cbi-section-node + .cbi-section-create {
+       padding-top: 0;
 }
 
 div.cbi-map-descr {
@@ -720,68 +735,149 @@ div.cbi-optionals {
        border-bottom: 1px dotted #bbbbbb;
 }
 
-div.cbi-section-remove {
-       float: right;
-}
-
 .cbi-section-node {
        clear: both;
-       border: 1px solid #BBBBBB;
-       border-radius: 3px;
        padding-bottom: 0;
        position: relative;
+       border: 1px dotted #555;
+       background: #fff;
+       margin-bottom: 5px;
 }
 
 .cbi-section-node-tabbed {
-       border-top-left-radius: 0;
+       border-top: none;
 }
 
-.cbi-section-node .cbi-value-last {
+.cbi-section-node .cbi-value:last-child {
        border-bottom: none;
 }
 
-.cbi-section-node table div {
-       padding-bottom: 0;
-       border-bottom: none;
+.table.cbi-section-table {
+       width: 100%;
+       font-size: 95%;
+       border: 1px dotted #444;
+       background: #fff;
+       margin: 0 0 .5em 0;
 }
 
-.cbi-section-node div.cbi-section-table-row {
-       margin: 0.25em;
+.cbi-section-node > .table.cbi-section-table {
+       border: none;
+       margin: 0;
 }
 
-table.cbi-section-table {
-       width: 100%;
-       font-size: 95%;
+@keyframes flash {
+       0% { opacity: 1; }
+       50% { opacity: .5; }
+       100% { opacity: 1; }
 }
 
-table.cbi-section-table th,
-table.cbi-section-table td {
-       text-align: center;
+.tr.cbi-section-table-row.flash {
+       animation: flash .35s;
 }
 
-tr.cbi-section-table-descr th {
+.tr.cbi-section-table-descr .th {
        font-weight: normal;
        font-size: 90%;
        vertical-align: top;
 }
 
-td.cbi-section-table-optionals {
+.td.cbi-section-table-optionals {
        text-align: left !important;
        padding-top: 1em;
 }
 
-.cbi-value-helpicon img {
-       vertical-align: bottom;
+.th.cbi-section-actions,
+.td.cbi-section-actions {
+       display: flex;
+       justify-content: flex-end;
+       flex-direction: row;
+       flex: 1 1 150px;
+       margin: auto -1px auto auto;
 }
 
-div.cbi-error {
-       font-size: 95%;
+.td.cbi-section-actions > form {
+       display: flex;
+}
+
+.td.cbi-section-actions > *,
+.td.cbi-section-actions > form > * {
+       flex: 1 1 4em;
+       margin: 1px;
+}
+
+.cbi-page-actions {
+       display: flex;
+       justify-content: flex-end;
+       margin: -3px;
+       padding: 0 .25em .25em .25em;
+}
+
+.cbi-page-actions > form {
+       display: flex;
+}
+
+.cbi-page-actions > * {
+       flex: 0 1 auto;
+       margin: 3px;
+}
+
+.cbi-page-actions > form > * {
+       flex: 1;
+       margin: 0 3px 0 0;
+}
+
+.cbi-page-actions > .cbi-button-link,
+.cbi-page-actions > form[method="get"]:first-child {
+       margin-right: auto;
+}
+
+
+.th[data-type="button"], .td[data-type="button"],
+.th[data-type="fvalue"], .td[data-type="fvalue"] {
+       flex: 1 1 2em;
+       text-align: center;
+}
+
+#cbi-network-switch_vlan .th,
+#cbi-network-switch_vlan .td {
+       flex-basis: 12%;
+}
+
+#cbi-wireless-overview .td:first-child {
+       align-self: center;
+}
+
+.td[data-title]::before {
+       content: attr(data-title) ":\20";
        font-weight: bold;
-       color: #ff0000;
-       background-color: #ffffff;
+       text-align: left;
+       display: none;
+       padding: 1px;
+       white-space: nowrap;
 }
 
-td.cbi-value-error {
+.tr.placeholder .td[data-title]::before {
+       display: none;
+}
+
+.tr[data-title]::before,
+.tr.cbi-section-table-titles.named::before {
+       content: attr(data-title) "\20";
+       font-weight: bold;
+       text-align: left;
+       display: inline-block;
+       align-self: center;
+       flex: 1 1 5%;
+       padding: .25em;
+       white-space: normal;
+       word-wrap: break-word;
+}
+
+.cbi-value-helpicon img {
+       vertical-align: bottom;
+}
+
+.td.cbi-value-error {
        border-color: red;
 }
 
@@ -805,65 +901,293 @@ td.cbi-value-error {
 }
 
 ul.cbi-tabmenu {
-       padding: 3px 0;
-       margin-left: 0 !important;
        list-style-type: none;
+       display: flex;
+       margin: 0 !important;
+       padding: 0 0 0 5px;
+       border-bottom: 1px solid #bbb;
+}
+
+ul.cbi-tabmenu li {
+       display: inline-flex;
+       margin: 0 5px -1px 0;
+       flex: 0 1 auto;
+       border: 1px solid #bbb;
+       border-bottom: none;
+       border-radius: 3px 3px 0 0;
+       background: linear-gradient(#ddd 90%, #aaa 100%);
+       color: #888;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       word-wrap: break-word;
+}
+
+ul.cbi-tabmenu li a,
+ul.cbi-tabmenu li a:hover {
+       text-decoration: none;
+       color: inherit;
+       padding: 5px;
+       flex: 1;
+       width: 100%;
+       height: 100%;
+}
+
+ul.cbi-tabmenu li.cbi-tab-highlighted {
+       color: #000;
+       background: #fea;
+}
+
+ul.cbi-tabmenu li.cbi-tab {
+       color: #000;
+       background: #fff;
+}
+
+.cbi-tab-descr {
+       background-image: url(/luci-static/resources/cbi/help.gif);
+       background-position: .25em 50%;
+       background-repeat: no-repeat;
+       border-bottom: 1px solid #ccc;
+       margin: 0 .25em .25em .25em;
+       padding: .5em .5em .5em 2em;
+}
+
+
+.cbi-dropdown {
+       border: 1px inset #000;
+       display: inline-flex;
+       cursor: pointer;
+       background: #eee;
        position: relative;
-       z-index: 10;
-       top: 4px;
-       line-height: 20px;
+       padding: 0;
+       color: #000;
+       min-width: 20em;
+       max-width: 100%;
 }
 
-ul.cbi-tabmenu li.cbi-tab,
-ul.cbi-tabmenu li.cbi-tab-disabled {
-       display: inline;
+.cbi-dropdown:hover {
+       background: #fff;
+}
+
+.cbi-dropdown:focus {
+       outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+       margin: 0 !important;
+       padding: 0;
+       list-style: none;
+       overflow-x: hidden;
+       overflow-y: auto;
+       display: flex;
+       width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+       display: none;
+}
+
+.cbi-dropdown > .open {
+       border: 2px outset #eee;
+       flex-basis: 15px;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+       flex-grow: 0;
+       flex-shrink: 0;
+       display: flex;
+       flex-direction: column;
+       justify-content: center;
+       text-align: center;
+       line-height: 2em;
+       padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+       color: #777;
+       font-weight: bold;
+       text-shadow: 1px 1px 0px #fff;
+       display: none;
+}
+
+.cbi-dropdown > ul > li {
+       display: none;
+       padding: .25em;
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       flex-shrink: 1;
+       flex-grow: 1;
+       align-items: center;
+       align-self: center;
+       min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+       border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+       max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+       display: none;
        margin: 0;
+       padding: 0;
+       pointer-events: none;
 }
 
-ul.cbi-tabmenu li.cbi-tab a,
-ul.cbi-tabmenu li.cbi-tab-disabled a {
-       text-decoration: none;
-       padding: 3px 7px;
-       margin-right: 3px;
-       border: 1px solid #BBBBBB;
+.cbi-dropdown > ul > li img {
+       vertical-align: middle;
+       margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+       margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+       height: 20px;
+}
+
+.cbi-dropdown[open] {
+       position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+       display: block;
+       background: #f6f6f5;
+       border: 1px solid #918e8c;
+       box-shadow: 0 0 4px #918e8c;
+       position: absolute;
+       z-index: 1000;
+       max-width: none;
+       min-width: 100%;
+       width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+       flex-grow: 1;
+       display: flex;
+       align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+       display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+       border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+       background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+       background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+       margin-bottom: 0;
        border-bottom: none;
-       border-radius: 3px 3px 0 0;
-       background-color: #EEEEEE;
-       color: #BBBBBB;
 }
 
-ul.cbi-tabmenu li.cbi-tab-highlighted a {
-       color: #000000;
-       background-color: #FFEEAA;
+.cbi-dropdown[disabled] {
+       pointer-events: none;
+       opacity: .6;
 }
 
-ul.cbi-tabmenu li a:hover {
-       color: #000000;
+
+.cbi-tooltip-container {
+       cursor: help;
 }
 
-ul.cbi-tabmenu li.cbi-tab a {
-       padding-top: 4px;
-       color: #000000;
-       background-color: #FFFFFF;
+.cbi-tooltip {
+       position: absolute;
+       z-index: 1000;
+       left: -1000px;
+       opacity: 0;
+       transition: opacity .25s ease-out;
+       pointer-events: none;
+       box-shadow: 0 0 2px #444;
 }
 
-div.cbi-tab-descr {
-       background-image: url(/luci-static/resources/cbi/help.gif);
-       background-position: 0.25em 50%;
-       background-repeat: no-repeat;
-       border-bottom: 1px solid #CCCCCC;
-       margin: 0.25em 0.25em 2em;
-       padding: 0.5em 0.5em 0.5em 2em;
+.cbi-tooltip-container:hover .cbi-tooltip {
+       left: auto;
+       opacity: 1;
+       transition: opacity .25s ease-in;
+}
+
+.zonebadge .cbi-tooltip {
+       padding: 1px;
+       background: inherit;
+       margin: -1.6em 0 0 -5px;
+}
+
+
+.zone-forwards {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.zone-forwards > * {
+       flex: 1 1 45%;
+       padding: 1px;
+}
+
+.zone-forwards > span {
+       flex-basis: 10%;
+       text-align: center;
 }
 
-.left {
+.zone-forwards .zone-src,
+.zone-forwards .zone-dest {
+       display: flex;
+       flex-direction: column;
+}
+
+
+.left, .left::before {
        text-align: left !important;
 }
 
-.right {
+.right, .right::before {
        text-align: right !important;
 }
 
+.center, .center::before {
+       text-align: center !important;
+}
+
+.td.bottom {
+       align-self: flex-end;
+}
+
+.td.top {
+       align-self: flex-start;
+}
+
+.td.middle {
+       align-self: center;
+}
+
 .luci {
        position: absolute;
        bottom: 0;
@@ -892,57 +1216,97 @@ div.cbi-tab-descr {
        padding: 0.5em;
 }
 
-.errorbox {
-       border: 1px solid #FF0000;
-       background-color: #FFCCCC;
-       padding: 5px;
-       margin-bottom: 5px;
+
+.ifacebadge, .ifacebox {
+       display: inline-flex;
+       align-content: center;
+       border: 1px solid #ccc;
+       border-radius: 3px;
+       padding: 2px;
+       background: #fff;
+       margin: .25em .5em;
+}
+
+.ifacebox-head {
+       background: #eee;
+}
+
+.ifacebox-head.active {
+       background: #90c0e0;
+}
+
+.ifacebadge, .zonebadge {
+       align-items: center;
+}
+
+.ifacebadge > * {
+       align-self: flex-start;
 }
 
-.errorbox a {
-       color: #000000 !important;
+.ifacebadge > img,
+.ifacebadge > em {
+       margin-right: 5px;
+       display: inline-block;
+       height: 16px;
 }
 
+.ifacebadge-active {
+       border-color: #000000;
+       font-weight: bold;
+}
 
 .ifacebox {
-       background-color: #FFFFFF;
-       border: 1px solid #CCCCCC;
-       margin: 0 10px;
+       flex-direction: column;
+       margin: 0;
+       padding: 0;
+       min-width: 100px;
        text-align: center;
-       white-space: nowrap;
 }
 
-.ifacebox .ifacebox-head {
-       border-bottom: 1px solid #CCCCCC;
+.ifacebox > * {
        padding: 2px;
 }
 
-.ifacebox .ifacebox-body {
-       padding: 2px;
+.td > .ifacebadge,
+.td > .zonebadge {
+       margin: 0;
+       vertical-align: top;
 }
 
+.network-status-table {
+       display: flex;
+       flex-wrap: wrap;
+       margin: -.25em;
+}
 
-.ifacebadge {
-       background-color: #FFFFFF;
-       border: 1px solid #CCCCCC;
-       padding: 1px 2px;
-       margin-left: 2px;
-       display: inline-block;
-       cursor: default;
-       white-space: nowrap;
-       font-size: 11px;
-       border-radius: 3px;
+.network-status-table .ifacebox {
+       margin: .25em;
+       font-size: 90%;
+       flex-grow: 1;
 }
 
-.ifacebadge img {
-       width: 16px;
-       height: 16px;
-       vertical-align: middle;
+.network-status-table .ifacebox-body {
+       display: flex;
+       flex-direction: column;
+       flex: 1 0;
 }
 
-.ifacebadge-active {
-       border-color: #000000;
-       font-weight: bold;
+.network-status-table .ifacebox-body > span {
+       flex: 10;
+}
+
+.network-status-table .ifacebox-body > div {
+       display: flex;
+       flex-wrap: wrap;
+}
+
+.ifacebadge.large,
+.network-status-table .ifacebox-body .ifacebadge {
+       flex: 1;
+       margin: .5em .25em .25em .25em;
+       padding: .5em;
+       min-width: 220px;
+       white-space: nowrap;
 }
 
 
@@ -950,13 +1314,12 @@ div.cbi-tab-descr {
        padding: 2px;
        display: inline-block;
        white-space: nowrap;
-       cursor: pointer;
+       border-radius: 3px;
 }
 
-.zonebadge em,
-.zonebadge strong {
+.zonebadge em,
+.zonebadge strong {
        margin: 3px;
-       display: inline-block;
 }
 
 .zonebadge input {
@@ -964,6 +1327,18 @@ div.cbi-tab-descr {
        height: 1.5em;
 }
 
+.zonebadge .ifacebadge,
+.cbi-dropdown .ifacebadge {
+       margin: 1px;
+}
+
+.zonebadge .ifacebadge img,
+.zonebadge .ifacebadge em,
+.cbi-dropdown .ifacebadge img,
+.cbi-dropdown .ifacebadge em {
+       margin: 0 1px;
+}
+
 .zonebadge-empty {
        border: 1px dashed #AAAAAA;
        color: #AAAAAA;
@@ -1042,3 +1417,313 @@ div.cbi-tab-descr {
 
 
 }
+
+@media screen and (max-width: 992px) {
+       body {
+               -webkit-text-size-adjust: 100%;
+       }
+
+       #maincontainer {
+               flex-direction: column;
+               width: 100%;
+       }
+
+       #maincontent {
+               width: 96%;
+               margin: auto;
+       }
+
+       #mainmenu {
+               border: none;
+               border-radius: 0;
+               max-width: none;
+               background: #000;
+               box-shadow: 0 0 2px #444;
+               padding: 0;
+               border-top: 1px solid #444;
+               position: relative;
+       }
+
+       #mainmenu ul > li.selected > a {
+               background: #444;
+               color: #fff;
+               border-top: none;
+       }
+
+       #mainmenu ul > li.selected:not(.active) > ul {
+               max-height: 0;
+               visibility: hidden;
+       }
+
+       #mainmenu ul > li > a {
+               flex: 1;
+               color: #fff;
+               border: 1px solid #444;
+               border-width: 0 0 1px 1px;
+       }
+
+       #mainmenu ul.l1 {
+               display: flex;
+               flex-direction: row;
+               flex-wrap: wrap;
+               position: relative;
+               margin-left: -1px;
+               width: 100%;
+       }
+
+       #mainmenu ul.l1 > li {
+               display: inline-flex;
+               flex: 1 1 auto;
+               position: relative;
+               height: 2em;
+       }
+
+       #mainmenu ul.l1 ul.l2 {
+               position: absolute;
+               top: 2em;
+               right: 0;
+               z-index: 1000;
+               background: #000;
+               box-shadow: 0 0 2px #444;
+               min-width: 120px;
+               display: block;
+       }
+
+       #mainmenu ul.l1 ul.l2.align-left {
+               right: auto;
+               left: 0;
+       }
+
+       #mainmenu ul.l2 > li {
+               display: block;
+       }
+
+       #mainmenu ul.l2 > li > a {
+               padding: .5em;
+       }
+
+       #mainmenu ul li.mainmenu-item-logout {
+               margin-top: 0;
+               margin-left: auto;
+       }
+
+       #mainmenu ul li.mainmenu-item-logout::before {
+               content: "\0a";
+               flex: 10;
+               border: 1px solid #444;
+               border-width: 0 0 1px 1px;
+       }
+
+       .table {
+               display: flex;
+               flex-direction: column;
+               width: 100%;
+       }
+
+       .tr {
+               display: flex;
+               flex-direction: row;
+               flex-wrap: wrap;
+               align-items: flex-end;
+       }
+
+       .th, .td {
+               flex: 2 2 25%;
+               align-self: flex-start;
+               overflow: hidden;
+               text-overflow: ellipsis;
+               word-wrap: break-word;
+               display: inline-block;
+       }
+
+       .td select {
+               word-wrap: normal;
+       }
+
+       .td[data-type="button"],
+       .td[data-type="fvalue"] {
+               flex: 1 1 12.5%;
+               text-align: left;
+       }
+
+       .td.cbi-value-field {
+               align-self: flex-start;
+       }
+
+       .td.cbi-value-field .cbi-button {
+               width: 100%;
+       }
+
+       .table.cbi-section-table {
+               border: none;
+               background: none;
+               margin: 0;
+       }
+
+       .tr.table-titles,
+       .cbi-section-table-titles,
+       .cbi-section-table-descr {
+               display: none;
+       }
+
+       .cbi-section-table-row {
+               display: flex;
+               flex-direction: row;
+               flex-wrap: wrap;
+               border: 1px dotted #444;
+               margin: 0 0 .5em 0;
+               background: #fff;
+       }
+
+       .cbi-section-table-row:hover {
+               border: 1px solid #4a6b7c;
+       }
+
+       .cbi-section-table + .cbi-section-create {
+               padding-top: 0;
+       }
+
+       .tr[data-title]::before {
+               display: block;
+               flex: 1 1 100%;
+               background: #eef;
+       }
+
+       .td[data-title]::before {
+               display: block;
+       }
+
+       .td.cbi-section-actions {
+               flex-basis: 100%;
+               margin: auto -1px 0 auto;
+       }
+
+       .td.cbi-section-actions > *,
+       .td.cbi-section-actions > form > * {
+               flex: 0 1 100%;
+               max-width: 150px;
+       }
+
+       .hide-sm,
+       .hide-xs {
+               display: none;
+       }
+}
+
+@media screen and (max-width: 480px) {
+       body {
+               font-size: 12pt;
+       }
+
+       input, textarea, select {
+               font-size: 12pt !important;
+               line-height: 1.4em;
+       }
+
+       select, input[type="text"], input[type="password"] {
+               width: 100%;
+               height: 1.4em;
+       }
+
+       [data-dynlist] > input,
+       input.cbi-input-password {
+               width: calc(100% - 20px);
+       }
+
+       .cbi-dropdown {
+               min-width: 100%;
+       }
+
+       .btn, .cbi-button {
+               font-size: 9pt !important;
+               line-height: 11pt;
+       }
+
+       #maincontent {
+               padding: .25em;
+       }
+
+       #tabmenu {
+               margin: -.25em -.25em 1em -.25em;
+       }
+
+       .th, .td {
+               flex: 2 2 50%;
+       }
+
+       .td.cbi-value-field {
+               flex-basis: 100%;
+       }
+
+       .td.cbi-value-field[data-type="dvalue"] {
+               flex-basis: 50%;
+       }
+
+       .td.cbi-value-field[data-type="button"],
+       .td.cbi-value-field[data-type="fvalue"] {
+               flex-basis: 25%;
+               text-align: left;
+       }
+
+       .cbi-section {
+               padding: .25em;
+       }
+
+       .cbi-value-title {
+               float: none;
+               font-weight: bold;
+       }
+
+       .cbi-value-field {
+               width: 100%;
+               margin: 0;
+       }
+
+       .cbi-value-description {
+               margin-top: 5px;
+               display: block;
+       }
+
+       .cbi-section-create {
+               margin-bottom: 1em;
+       }
+
+       .cbi-page-actions {
+               flex-wrap: wrap;
+       }
+
+       .cbi-page-actions > .cbi-button-link {
+               flex-basis: 100%;
+               margin-right: 2px;
+       }
+
+       .cbi-page-actions > * {
+               flex: 1 1 auto;
+               margin: 2px;
+       }
+
+       ul.cbi-tabmenu {
+               padding: 0 3px;
+       }
+
+       ul.cbi-tabmenu li {
+               font-size: 90%;
+               margin: 0 1px -1px 0;
+       }
+
+       .hide-xs {
+               display: none;
+       }
+
+       #cbi-network .td[id] > strong {
+               display: block;
+       }
+
+       #cbi-network-switch_vlan .td.cbi-section-actions {
+               flex-basis: 100%;
+       }
+
+       .network-status-table .ifacebox {
+               margin: 0 0 .5em 0;
+       }
+}
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css
deleted file mode 100644 (file)
index 14db3f8..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/* obligatory IE6 Voodoo Code */
-
-* html body {
-       padding-left: 5% !important;
-}
-
-* html div#header {
-       margin-left: 100% !important;
-}
-
-* html div#menubar {
-       margin-left: -5% !important;
-       width: 105% !important;
-}
-
-* html ul.dropdowns li ul {
-       width: 10em;
-}
-
-* html ul.dropdowns li li {
-       clear: both;
-       float: left;
-}
-
-* html ul.dropdowns li li {
-       width: 100%;
-}
-
-* html ul.dropdowns li li a {
-       height: 10%;
-}
-
-* html div#maincontent {
-       margin-left: 0% !important;
-       width: 100% !important;
-}
-
-* html div.cbi-value-description {
-       width: auto !important;
-}
-
-* html div.cbi-value-field {
-       margin-left: 0 !important;
-       width: 100% !important;
-}
-
-* html .cbi-input-text,
-* html .cbi-input-user,
-* html .cbi-input-select,
-* html .cbi-input-password {
-       width: 50% !important;
-}
-
-* html .cbi-input-user,
-* html .cbi-input-password {
-       text-indent: 0 !important;
-       padding-left: 1.5em !important;
-}
-
-* html .cbi-section legend {
-       background-color: #ffffff;
-       color: #555555;
-}
-
-* html table.cbi-section-table td .cbi-input-text,
-* html table.cbi-section-table td .cbi-input-select {
-       width: 100% !important;
-}
-
-* html div.cbi-page-actions {
-       text-align: right !important;
-}
-
-* html div.cbi-value-field input,
-* html div.cbi-value-field select {
-       font-size: 90% !important;
-}
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css
deleted file mode 100644 (file)
index 9e569b2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#tabmenu {
-       line-height: 0;
-}
-
-ul.tabmenu {
-       zoom: 1;
-}
-
-ul.l1 {
-       position: relative;
-}
-
-
-table.cbi-section-table td .cbi-input-text,
-table.cbi-section-table td .cbi-input-select {
-       width: 95% !important;
-}
-
-
-.cbi-input-user,
-.cbi-input-password {
-       text-indent: 0 !important;
-       padding-left: 1.5em !important;
-       width: 18.5em !important;
-}
-
-
-fieldset.cbi-section {
-       position: relative;
-       margin-top: 1em;
-       padding-top: 0.75em;
-       border: 1px solid #CCCCCC;
-       zoom: 1;
-}
-
-fieldset.cbi-section legend {
-       position: absolute;
-       top: -0.75em;
-       left: 0.5em;
-}
-
-
-ul.cbi-tabmenu {
-       margin-bottom: 0;
-}
-
-ul.cbi-tabmenu li.cbi-tab a {
-       position: static;       /* fixes misplaced tab after page load */
-       border-bottom: 1px solid white;
-}
-
-
-div.cbi-value {
-       zoom: 1;        /* fixes hanging float */
-}
-
-div.cbi-value-field {
-       margin-left: 0 !important;
-}
diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css
deleted file mode 100644 (file)
index 890988c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-fieldset.cbi-section {
-       position: relative;
-       margin-top: 1em;
-       padding-top: 0.75em;
-       border: 1px solid #CCCCCC;
-}
-
-fieldset.cbi-section legend {
-       position: absolute;
-       top: -0.75em;
-       left: 0.5em;
-}
index a560014d379bb7fae8f2e40d376823346b4bdfba..773cf1f82eca017e0cd462b1ba423218a2677828 100644 (file)
 
                local childs = disp.node_childs(node)
                if #childs > 0 then
-                       write('<div class="tabmenu%d"><ul class="tabmenu l%d">' %{
-                               level, level
-                       })
+                       write('<ul class="mainmenu l%d">' % level)
+
+                       local i, v
+                       for i, v in ipairs(childs) do
+                               local nnode = node.nodes[v]
+
+                               write('<li class="mainmenu-item-%s %s"><a href="%s">%s</a>' %{
+                                       v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'selected' or '',
+                                       nodeurl(prefix, v, nnode.query),
+                                       striptags(translate(nnode.title))
+                               })
+
+                               if level < 2 then
+                                       render_menu(prefix .. "/" .. v, nnode, level + 1)
+                               end
+
+                               write('</li>')
+                       end
+
+                       write('</ul>')
+               end
+       end
+
+       local function render_tabmenu(prefix, node, level)
+               if not level then
+                       level = 1
+               end
+
+               local childs = disp.node_childs(node)
+               if #childs > 0 then
+                       if level > 2 then
+                               write('<ul class="cbi-tabmenu">')
+                       end
 
                        local selected_node
                        local selected_name
                                        selected_name = v
                                end
 
-                               write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{
-                                       v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '',
-                                       nodeurl(prefix, v, nnode.query),
-                                       striptags(translate(nnode.title))
-                               })
+                               if level > 2 then
+                                       write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{
+                                               v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'cbi-tab' or '',
+                                               nodeurl(prefix, v, nnode.query),
+                                               striptags(translate(nnode.title))
+                                       })
+                               end
                        end
 
-                       write('</ul><br style="clear:both" />')
+                       if level > 2 then
+                               write('</ul>')
+                       end
 
                        if selected_node then
-                               render_menu(prefix .. "/" .. selected_name, selected_node, level + 1)
+                               render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1)
                        end
-
-                       write('</div>')
                end
        end
 
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
 <meta http-equiv="Content-Script-Type" content="text/javascript" />
 <link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
-<!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie6.css" /><![endif]-->
-<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
-<!--[if IE 8]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie8.css" /><![endif]-->
 <% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
 <% end -%>
 <% if css then %><style title="text/css">
 </style>
 <% end -%>
 <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
+<script type="text/javascript">//<![CDATA[
+       document.addEventListener('DOMContentLoaded', function() {
+               var event = ('ontouchstart' in window) ? 'touchstart' : 'click';
+
+               document.querySelectorAll('ul.mainmenu.l1 > li > a').forEach(function(a) {
+                       a.addEventListener(event, function(ev) {
+                               var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling;
+
+                               document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) {
+                                       if (li !== a.parentNode)
+                                               li.classList.remove('active');
+                               });
+
+                               if (!ul2)
+                                       return;
+
+                               if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth)
+                                       ul2.classList.add('align-left');
+
+                               ul1.classList.add('active');
+                               a.parentNode.classList.add('active');
+                               a.blur();
+
+                               ev.preventDefault();
+                               ev.stopPropagation();
+                       });
+               });
+
+               document.addEventListener(event, function(ev) {
+                       var t = ev.target;
+
+                       while (t && t.id != 'mainmenu')
+                               t = t.parentNode;
+
+                       if (!t)
+                               document.querySelectorAll('ul.mainmenu > li.active').forEach(function(li) {
+                                       li.classList.remove('active');
+                               });
+               });
+       });
+//]]></script>
 <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
 </head>
 <body class="lang_<%=luci.i18n.context.lang%>">
 </div>
 
 <div id="maincontainer">
-       <div id="tabmenu">
+       <div id="mainmenu">
                <% if category then render_menu(category, cattree) end %>
        </div>
 
        <div id="maincontent">
+               <div id="tabmenu">
+                       <% if category then render_tabmenu(category, cattree) end %>
+               </div>
+
                <noscript>
-                       <div class="errorbox">
-                               <strong><%:JavaScript required!%></strong><br />
-                               <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
+                       <div class="alert-message warning">
+                               <h4><%:JavaScript required!%></h4>
+                               <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
                        </div>
                </noscript>
 
                <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and category ~= "failsafe" then -%>
-               <div class="errorbox">
-                       <strong><%:No password set!%></strong><br />
-                       <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br />
-                       <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+               <div class="alert-message warning">
+                       <h4><%:No password set!%></h4>
+                       <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+                       <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
                </div>
                <%- end -%>